查找的行为Teradata的SQL给定列有不同的值(Find which rows have dif

2019-07-04 12:22发布

我想比较来自相同的ID两个地址,看看它们是否匹配。 例如:

Id  Adress Code     Address
1   1               123 Main
1   2               123 Main
2   1               456 Wall
2   2               456 Wall
3   1               789 Right
3   2               100 Left

我只是想弄清楚的地址为每个ID是否匹配。 因此,在这种情况下,我想回到刚才ID 3为具有不同的地址,地址代码1和2。

Answer 1:

加入表本身,并给它的两个不同的别名( AB在下面的示例中)。 这允许比较同一表的不同行。

SELECT DISTINCT A.Id
FROM
    Address A
    INNER JOIN Address B
        ON A.Id = B.Id AND A.[Adress Code] < B.[Adress Code]
WHERE
    A.Address <> B.Address

在“小于”的比较<确保您能获得2个不同的地址,你没有得到同样的2个地址码的两倍。 使用“不等于” <>代替,将产生码作为(1,2),(2,1); 对于它们中的每一个A别名和B反过来别名。

JOIN子句是负责这里的WHERE子句测试附加条件行的配对。


上述查询与任何地址码的工作。 如果你想与特定的地址码比较地址,您可以更改查询

SELECT A.Id
FROM
    Address A
    INNER JOIN Address B
        ON A.Id = B.Id
WHERE                     
    A.[Adress Code] = 1 AND
    B.[Adress Code] = 2 AND
    A.Address <> B.Address

我想,这可能是有用的,以找到具有帐单地址(ADRESS代码= 1作为一个例子)的客户从递送地址(ADRESS代码= 2)不同。



Answer 2:

这适用于PL / SQL:

select count(*), id,address from table group by id,address having count(*)<2


Answer 3:

您可以使用一组由做到这一点:

select id, addressCode
from t
group by id, addressCode
having min(address) <> max(address)

写这个的另一种方式似乎更加清晰,但不执行,以及:

select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1


Answer 4:

就个人而言,我将它们打印格式使用Perl或Python文件

<COL_NAME>:  <COL_VAL>

每一行,以使文件具有与现有的列尽可能多的行。 然后,我会做一个diff两个文件之间,假设你是在Unix或使用其他操作系统的一些等价utilty对它们进行比较。 如果你有多个记录(即多行),我会在前面加上每个文件行的文件,然后将有NUM_DB_ROWS * NUM_COLS线



文章来源: Find which rows have different values for a given column in Teradata SQL