web-dev-qa-db-ja.com

Teradata SQLの特定の列でどの行が異なる値を持っているかを見つける

同じIDの2つのアドレスを比較して、一致するかどうかを確認しようとしています。例えば:

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のアドレスが一致するかどうかを把握しようとしています。したがって、この場合、アドレスコード1と2に異なるアドレスを持っているため、ID 3のみを返します。

23
Hatt

テーブルをそれ自体と結合し、2つの異なるエイリアス(次の例の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つのアドレスコードを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

これは、配送先住所(住所コード= 2)とは異なる請求先住所(例として住所コード= 1)を持つ顧客を見つけるのに役立つと思います。

これはPL/SQLで機能します。

select count(*), id,address from table group by id,address having count(*)<2
4
Yasin Okumuş

次の方法でグループを使用してこれを行うことができます。

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
2
Gordon Linoff

個人的には、PerlまたはPythonの形式でファイルに出力します

<COL_NAME>:  <COL_VAL>

ファイルが列と同じ数の行を持つように、各行に対して。次に、2つのファイル間でdiffを実行します。Unixを使用している場合、または別のOSで同等のユーティリティを使用してそれらを比較します。複数のレコードセット(つまり、複数の行)がある場合、各ファイル行の先頭に追加し、ファイルにはNUM_DB_ROWS * NUM_COLS行が含まれます

0
amphibient