如何查询两个不同表中的两个子表在SQL中是否相同?

时间:2018-03-13 06:33:19

标签: sql db2

鉴于此表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,非常感谢这里的答案。

2 个答案:

答案 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

这将输出Xval2-val4值与Y中的其他记录不匹配的任何记录。您也可以反方向EXCEPT查找Y中与X中的任何内容不匹配的记录。