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 1
与 Table 2
不同,因为它没有用户 24
,并且 Ind1
和 Ind2
中的某些值也发生了变化.我通常比较 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 更有效,你应该试试。
我需要比较 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 1
与 Table 2
不同,因为它没有用户 24
,并且 Ind1
和 Ind2
中的某些值也发生了变化.我通常比较 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 更有效,你应该试试。