0

2 つのテーブルの違いを表示している Jeff Smith のソリューションを見つけました。

SELECT MIN(TableName) as TableName, ID, COL1, COL2, COL3 ...
FROM
(
  SELECT 'Table A' as TableName, A.ID, A.COL1, A.COL2, A.COL3, ...
  FROM A
  UNION ALL
  SELECT 'Table B' as TableName, B.ID, B.COL1, B.COl2, B.COL3, ...
  FROM B
) tmp
GROUP BY ID, COL1, COL2, COL3 ...
HAVING COUNT(*) = 1
ORDER BY ID

私のプロジェクトでは、たとえば比較する必要があります。col1 と col2 のみ、残りは別の操作に使用されます。使ってみた

HAVING (COUNT(col1) = 1 and COUNT(col2) = 1) 

しかし、効果はありません。

それを行うソリューションを教えてください。

4

2 に答える 2

3
  1. EXCEPT を使用して存在しないCOL1との値を取得します。COL2AB

    SELECT COL1, COL2 FROM A
    EXCEPT
    SELECT COL1, COL2 FROM B
    
  2. 結果を派生テーブルとして使用して結合しA、すべての列を取得します。

    SELECT 'A' AS SRC, A.COL1, A.COL2, A.COL3...
    FROM (
      SELECT COL1, COL2 FROM A
      EXCEPT
      SELECT COL1, COL2 FROM B
    ) AS diff
    INNER JOIN A ON diff.COL1 = A.COL1 AND diff.COL2 = A.COL2
    
  3. 同様に、 EXCEPT を使用してCOL1およびCOL2のみに存在するの値を取得しB、結果セットを結合して、Bそれに応じて完全な行を取得します。

  4. 2 つのセットを UNION ALL で結合します。

    SELECT 'A' AS SRC, A.COL1, A.COL2, A.COL3...
    FROM (
      SELECT COL1, COL2 FROM A
      EXCEPT
      SELECT COL1, COL2 FROM B
    ) AS diff
    INNER JOIN A ON diff.COL1 = A.COL1 AND diff.COL2 = A.COL2
    
    UNION ALL
    
    SELECT 'B' AS SRC, B.COL1, B.COL2, B.COL3...
    FROM (
      SELECT COL1, COL2 FROM B
      EXCEPT
      SELECT COL1, COL2 FROM A
    ) AS diff
    INNER JOIN B ON diff.COL1 = B.COL1 AND diff.COL2 = B.COL2
    ;
    
于 2013-10-17T02:44:44.397 に答える
0

間違った場所から列を削除しています。スターからではなく、列のリストからドロップする必要があります。

SELECT MIN(TableName) as TableName, ID, COL1, COL2
FROM
(
  SELECT 'Table A' as TableName, A.ID, A.COL1, A.COL2
  FROM A
  UNION ALL
  SELECT 'Table B' as TableName, B.ID, B.COL1, B.COl2
  FROM B
) tmp
GROUP BY ID, COL1, COL2
HAVING COUNT(*) = 1
ORDER BY ID

結果に他の列を保持するには、MIN(または友人)を使用してそれらを保持できます。

SELECT MIN(TableName) as TableName, ID, COL1, COL2, MIN(COL3), MIN(COL4), ...
FROM
(
  SELECT 'Table A' as TableName, A.ID, A.COL1, A.COL2, A.COL3, A.COL4, ...
  FROM A
  UNION ALL
  SELECT 'Table B' as TableName, B.ID, B.COL1, B.COL2, B.COL3, B.COL4, ...
  FROM B
) tmp
GROUP BY ID, COL1, COL2
HAVING COUNT(*) = 1
ORDER BY ID

これは、特定の状況ではうまく機能しないことに注意してください。2 つのテーブルで 2 つの行が (ID を含めて) 同一である場合、そうでなくても違いとして検出されます。また、このバージョンでは、COL1COL2が同じ行が複数ある場合、これもうまく機能しません。より堅牢な比較のために、2 つのテーブルを結合します。

于 2013-10-15T17:34:18.570 に答える