Teradata 中两个表的比较

Comparison of two tables in Teradata

我需要比较 Teradata 中的两个表 SQL。

两个表格的样本是

Table 1

User  Date          Ind1    Ind2
12   2010-05-23     Y       N
12   2010-06-23     Y       Y
12   2010-07-23     Y       N
23   2010-04-23     N       N
23   2010-05-23     N       N
23   2010-06-12     Y       N

Table 2

User  Date          Ind1    Ind2
12   2010-05-23     Y       N
12   2010-06-23     Y       Y
12   2010-07-23     N       N
24   2010-03-22     N       N
23   2010-04-23     N       Y
23   2010-05-23     N       Y
23   2010-06-12     Y       N

在此示例中,Table 1Table 2 不同,因为它没有用户 24,并且 Ind1Ind2 中的某些值也发生了变化.我通常比较 Teradata 之外的数据,因为我不熟悉代码。由于表很大,我想知道是否有一种方法可以直接比较这些表(例如,对用户使用 join;我有兴趣查看更多的情况 Ind1 =Y 在 Table 1).

预期输出:

Table 1 (where Ind1 and Ind2 have at least 1 Y)
    User  Date          Ind1    Ind2
    12   2010-05-23     Y       N
    12   2010-06-23     Y       Y
    12   2010-07-23     Y       N
    23   2010-06-12     Y       N

Table 2

User  Date          Ind1    Ind2
12   2010-06-23     Y       Y      /* it differs from Ind2 */
12   2010-07-23     N       N      /* it differs from both indicators */
24   2010-03-22     N       N     /* Not included in Table 1 */
23   2010-04-23     N       Y     /* it differs from Ind2 */
23   2010-05-23     N       Y     /* it differs from Ind2 */ 
23   2010-06-12     Y       N     /* it differs from Ind1 */

比较此类 table 的典型方法是使用 full join:

select t1.*, t2.*
from table1 t1 full join
     table2 t2
     on t1.user = t2.user and t1.date = t2.date and
        t1.ind1 = t2.ind1 and t1.ind2 = t2.ind2
where t1.user is null or t2.user is null;

这 returns 每个 table 中没有的行。注意:它不能很好地处理重复行——例如,一个 table 中的 1 个重复匹配另一个 table 中的任何数字。

你的第一个结果看起来很简单

select *
from table1
where ind1 = 'Y' 
   or ind2 = 'Y'

而第二个好像是集合运算:

select *
from table2

except

select *
from table1

如果有重复的行,EXCEPT ALL 可能就是您想要的。如果没有重复,它可能仍然比 EXCEPT 更有效,你应该试试。