1

私は2つのテーブルを持っています:

表 A

ID   Name
1    abc   
2    xyz

表 B

ID    Name             
1     abc
2     xyz                 
3     mno

2 つのテーブルの上に個別の値のフォームが必要です。つまり、テーブル B の ID 3 Name mno のみが必要です (2 つのテーブルから一意であるため)。

この値を取得する方法を教えてください。

ありがとう、アジェイ

4

2 に答える 2

0

Bこのクエリは、 に存在しない行を取得しますA

SELECT b.* FROM TableB b
    OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL

次に、反対のことを行い、 a を使用しUNION ALLて両方の方法で取得できます。

SELECT a.* FROM TableA a
    OUTER JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
WHERE b.ID IS NULL
UNION ALL
SELECT b.* FROM TableB b
    OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL

それを達成する別の方法は次のとおりです。

;WITH MatchingRows AS (
    SELECT a.ID FROM TableA a
        JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
)
SELECT * FROM TableA
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)
UNION ALL
SELECT * FROM TableB
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)

それがより良いパフォーマンスを発揮するかどうかはわかりません-それは私が考えたものです. 私が間違っていなければ、これは実際にはWITHクエリを 2 回実行します (この質問への回答を参照してください)。これは、2 回使用されているためです。したがって、このアプローチにはパフォーマンスへの影響がある可能性があります。

于 2013-02-14T18:38:50.043 に答える
0

EXCEPT 演算子が役立つ場合があります。これは、データを使用した例です。

CREATE TABLE TableA (id int, name varchar(50))
INSERT INTO TableA VALUES (1, 'abc'),(2,'xyz')

CREATE TABLE TableB (id int, name varchar(50))
INSERT INTO TableB VALUES (1, 'abc'),(2,'xyz'),(3,'mno')

SELECT * FROM TableB
EXCEPT 
SELECT * FROM TableA

UNION のように動作しますが、注意してください。すべての列が完全に一致する行のみを除外します。

于 2013-02-14T20:08:05.557 に答える