0

同じデータ レイアウトで 2 つのテーブルの差分を取得しようとしていて、同じ行に不一致のレコードがあります

Table1                   Table2
------                   ------

CUSTOMER PART            CUSTOMER  PART

CUSTID1  PART1           CUSTID1  PART1
CUSTID1  PART2           CUSTID1  PART2
CUSTID1  PART3           CUSTID1  PART3
CUSTUD1  PART4


SELECT T1.CUSTID, T1.PART, T2.CUSTID, T2.PART FROM TABLE1 AS T1
LEFT JOIN TABLE2 AS T2 ON T1.CUSTID = T2.CUSTID
WHERE  T1.PART <>  T2.PaRT
ORDER BY T1.CUSTID 

出力が以下のようになる場合があります - 一致しない場合は不一致を示します。データを整列させるために、結合の前にテーブルを並べ替えることはできますか?

ありがとう

CUSTID1  PART1           CUSTID1  PART3
CUSTID1  PART2           CUSTID1  PART1
CUSTID1  PART3           CUSTID1  PART2
CUSTUD1  PART4           NULL     NULL
4

2 に答える 2

1

次のようなことをする必要があります:

SELECT T1.CUSTID, T1.PART, T2.CUSTID, T2.PART 
FROM TABLE1 AS T1 
     INNER JOIN TABLE2 AS T2 ON T1.CUSTID = T2.CUSTID 
WHERE T1.PART <> T2.PaRT

左外部結合を使用する必要はありません。order by 句は、結合の結果に違いはありません。結果を注文するだけです。

于 2012-10-26T17:55:35.647 に答える
0

現在のクエリは、サンプル データであっても、多くのデータを提供する必要があります。

SELECT T1.CUSTID, T1.PART, T2.CUSTID, T2.PART FROM TABLE1 AS T1
LEFT JOIN TABLE2 AS T2 ON T1.CUSTID = T2.CUSTID
WHERE  T1.PART <>  T2.PaRT
ORDER BY T1.CUSTID 

期待される結果:

CUSTID1    PART1    CUSTID1    PART2
CUSTID1    PART1    CUSTID1    PART3
CUSTID1    PART2    CUSTID1    PART1
CUSTID1    PART2    CUSTID1    PART3
CUSTID1    PART3    CUSTID1    PART1
CUSTID1    PART3    CUSTID1    PART2
CUSTID1    PART4    CUSTID1    PART1
CUSTID1    PART4    CUSTID1    PART2
CUSTID1    PART4    CUSTID1    PART3

おそらく条件付きの FULL OUTER JOIN が必要ON T1.CustID = T2.CustID AND T1.Part = T2.Partです。FULL を実行できない場合は、LEFT 結合と RIGHT 結合の UNION を使用してください。または、Table1 に対応する行がない Table2 の行について心配していない場合は、強化された ON 句を使用した既存の LEFT JOIN だけで十分です。

すべての一致した行とすべての不一致の行が必要な場合は、次を使用します

SELECT T1.CustID, T1.Part, T2.CustID, T2.Part
  FROM Table1 AS T1
  FULL OUTER JOIN Table2 AS T2
       ON T1.CustID = T2.CUSTID AND T1.Part = T2.Part

不一致の行のみを表示したい場合は、次のように記述します。

SELECT T1.CustID, T1.Part, T2.CustID, T2.Part
  FROM Table1 AS T1
  FULL OUTER JOIN Table2 AS T2
       ON T1.CustID = T2.CUSTID AND T1.Part = T2.Part
 WHERE T1.Part IS NULL OR T2.Part IS NULL

LEFT-UNION-RIGHT クエリ (すべての行) は次のようになります。

SELECT T1.CustID, T1.Part, T2.CustID, T2.Part
  FROM Table1 AS T1
  LEFT OUTER JOIN Table2 AS T2
       ON T1.CustID = T2.CUSTID AND T1.Part = T2.Part
UNION
SELECT T1.CustID, T1.Part, T2.CustID, T2.Part
  FROM Table1 AS T1
 RIGHT OUTER JOIN Table2 AS T2
       ON T1.CustID = T2.CUSTID AND T1.Part = T2.Part

そして、すべての行に対する LEFT のみのクエリは次のようになります。

SELECT T1.CustID, T1.Part, T2.CustID, T2.Part
  FROM Table1 AS T1
  LEFT OUTER JOIN Table2 AS T2
       ON T1.CustID = T2.CUSTID AND T1.Part = T2.Part

不一致の行のみを表示する場合は、適切な WHERE フィルター条件を追加できます。(明らかに、一致した行のみを表示したい場合は、通常の INNER JOIN または単に JOIN を使用します。)

警告 Emptor : この SQL を検証した DBMS はありません。

于 2012-10-26T21:05:36.350 に答える