24

我正在尝试比较来自同一 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

4 回答 4

31

将表与自身连接起来,并给它两个不同的别名(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)不同的客户。

于 2012-12-04T17:15:52.010 回答
4

这适用于 PL/SQL:

select count(*), id,address from table group by id,address having count(*)<2
于 2012-12-04T17:18:37.157 回答
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
于 2012-12-04T17:17:32.133 回答
0

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

<COL_NAME>:  <COL_VAL>

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

于 2012-12-04T17:14:38.793 回答