如果连接键具有特定字段,是否可以创建连接的连接条件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有一个表格,其列的字符串格式如下:{1,4,5}。它们可以是任意长度,我想加入一个ID表,以反对在该字符串中具有其ID的任何值。

这是第一张表

name     id         count 
apple    {1,3,6}    5
orange   {5,3,1}    3
potato   {8,1,9}    3

这是第二张表 -

id2     category
1      foo
2      foobar
3      candy
4      candybar
5      oreo
6      pistachio

我想为第一个表中列出的每个ID添加一行,该行具有第二个表中的类别。我希望他们看起来像这样 -

id2 name     id         count 
1 apple    {1,3,6}    5
1 orange   {5,3,1}    3
1 potato   {8,1,9}    3
3 apple    {1,3,6}    5
3 orange   {5,3,1}    3
8 potato   {8,1,9}    3
9 potato   {8,1,9}    3

这是我到目前为止所得到的。我可以使用连接过滤器join if the value is included吗?

select id2, name, id, count
from table2 as t2 
left join table1 as t1 
on t2.id2 %in% t1.id
提问于
用户回答回答于

1)未经请求的建议

我认为值得考虑的是,如果您的数据库设计(即切割表格的方式)对您的事业非常有益。 表格的当前设置方式违反了Codd的第一范式数据库设计。 考虑更改您的设计,以表达FirstTable和SecondTable中对象之间的n:m关系

在表的上下文中使名称有效。 而不是在一个表中使用id2而在另一个表中使用id,只需将两个id命名即可。 在您的查询中,您可以将它们称为firsttable.id和secondtable.id来区分它们。

2)实际答案

是的,它是可能的,但取决于您使用的数据库系统。

如果firststable.id是PostgreSQL中的数组,则以下查询应该有效:

SELECT
    *
FROM
    first
JOIN
    second
ON
    second.id = ANY(first.ids);
    -- Took the liberty to change the column names   

这个SQLFiddle提供了一个工作示例。

如果firsttable.id 是一个字符串,那么你可以将字符串转换为使用阵列“{42,23,17}” :: INT []如所描述的

SELECT
    *
FROM
    first
JOIN
    second
ON
    second.id = ANY(first.ids::int[]);

SQLFiddle提供了一个工作示例,以防它是一个字符串。

用户回答回答于

当我第一次开始解决这个问题时,我没有看到PostgreSQL。

您可以尝试以下操作,但如果Postgre没有所有功能,则无法保证。

SELECT * FROM (
     SELECT 
         Split.a.value('.', 'VARCHAR(100)') AS ID2  
         ,A.Name, A.ID, A.[Count]
     FROM  
     (
         SELECT Name, [Count], ID,  
             CAST ('<M>' + REPLACE(REPLACE(REPLACE(ID,'{',''),'}',''), ',', '</M><M>') + '</M>' AS XML) AS Data  
         FROM [StackOver].[dbo].[SplitKey]
     ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)
 ) as B  
 Left Join [StackOver].[dbo].[SplitKeyID2] as C
 On B.ID2 = C.ID2
  Where C.Category > ''
 Order By B.ID2, B.name

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励