鉴于此表X
id# val1 val2 val3 val4
1000 Alice A France Wed
1001 Alice B France Thurs
1002 Alice C France Fri
1003 Alice D France Sat
这张表Y
id# val1 val2 val3 val4
2000 Bob A France Wed
2001 Bob B France Thurs
2002 Bob C France Fri
2003 Bob D France Sat
如何在SQL查询中比较表X和表Y?也就是说,我如何检查这些是否相等并返回true? (说它们是平等的似乎是愚蠢的,当然它们不是)但我的问题是,基本上即使id#和val1不同,这两个表在比较val2,val3和val4时仍然是相同的。
当然,我们可以说,比较每个元组(val2, val3, val4)
WHERE X.val1 = 'Alice' AND Y.val1 = 'Bob'
。这很容易。但是,如果我希望在更广泛的意义上扩展它,那该怎么办呢?例如,您有一个val1值列表,对于匹配(val2, val3, val4)
的所有val1值,然后在架构(X.val1, Y.val1)
中显示所有这些值。
有没有办法可以做到这一点(通过查询而不创建新表)? (请原谅我的英语不好,这不是我的第一语言。)
(顺便说一下,我试过了,但它看起来并不正确:
SELECT X.val1, Y.val1
FROM Table X, Table Y
WHERE X.val1 < Y.val1
AND (X.val2, X.val3, X.val4) = (Y.val2, Y.val3, Y.val4)
编辑:假设我扩展了表格X和Y.
表X:
id# val1 val2 val3 val4
1000 Alice A France Wed
1001 Alice B France Thurs
1002 Alice C France Fri
1003 Alice D France Sat
1004 Cindy E Japan Mon
1005 Cindy F Japan Tues
1006 Cindy G Japan Wed
1007 Cindy H Japan Thurs
表Y:
id# val1 val2 val3 val4
2000 Bob A France Wed
2001 Bob B France Thurs
2002 Bob C France Fri
2003 Bob D France Sat
2004 Fred E Japan Mon
2005 Fred F Japan Tues
2006 Fred G Japan Wed
现在请注意,如果你和Alice和Bob合作,那么他们就是相同的&#34;子表&#34;他们的(val2, val3, val4)
模式相同,以及它们的数量是相同的。但辛迪和弗雷德并不像辛迪有4个元组而弗雷德只有3个元组。所以Alice和Bob将成为答案表的一部分,但Cindy和Fred不是。如何以这样的方式编写查询:我可以比较Alice和Bob,然后是Alice和Fred,然后是Cindy和Bob,然后是Cindy和Fred。在这四个组合中,只有Alice和Bob被归还。
非常感谢那些回答的人。我仍然是第一次在DB2中自学SQL,非常感谢这里的答案。
答案 0 :(得分:1)
完整的外部联接也可以这样做:
select X.val1, Y.val1,
case
when x.val2 is null then 'Row not in X'
when y.val2 is null then 'Row not in Y'
else 'Values are different'
end as status
from table_x x
full join table_y y on (X.val2, X.val3, X.val4) = (Y.val2, Y.val3, Y.val4)
where x.val2 is null -- rows missing in X
or y.val2 is null -- rows missing in Y
or x.val1 <> y.val1;
这假定val2
被定义为not null
答案 1 :(得分:0)
EXCEPT
运算符可能是最简单的选项:
SELECT val2, val3, val4
FROM X
EXCEPT
SELECT val2, val3, val4
FROM Y
这将输出X
中val2-val4
值与Y
中的其他记录不匹配的任何记录。您也可以反方向EXCEPT
查找Y
中与X
中的任何内容不匹配的记录。