在Teradata SQL中查找给定列的哪些行具有不同的值

时间:2012-12-04 17:07:15

标签: sql join teradata rows matching

我正在尝试比较来自相同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的不同地址。

4 个答案:

答案 0 :(得分:30)

自己加入表格,并在下面的示例中为其提供两个不同的别名(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 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

我想这可能有助于找到帐单地址(地址代码= 1作为示例)与递送地址不同的客户(地址代码= 2)。

答案 1 :(得分:4)

这适用于PL / SQL:

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

答案 2 :(得分:2)

您可以使用以下方式执行此操作:

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

答案 3 :(得分:0)

就个人而言,我会使用Perl或Python以

格式将它们打印到文件中
<COL_NAME>:  <COL_VAL>
每行

,以便文件的行数与列数一样多。然后我会在两个文件之间做一个diff,假设你在Unix上或者在另一个操作系统上使用一些等效的实用程序来比较它们。如果你有多个记录集(即多行),我会在每个文件行前加上,然后该文件将有NUM_DB_ROWS * NUM_COLS行