2017-11-27 11 views
0

私は2つのテーブルを持っています。元のデータ(t1)といくつかの操作が実行された後に変更されたデータを持つものです。 2つのテーブルの構造は同じです(列 - GUID、ID、値)。 GUID、IDは主キーを形成する。共通の列を持つ2つのテーブルの相違を取得するクエリを作成します

GUIDとIDは、操作後も同じままです。ただし、一部のID(t1内)はt2ではなく、一部はt2で追加されている場合があります。 サンプル -

私は3に問題を分割している -

   t1        t2 
     GUID ID Value    GUID ID Value    
(i)  1  a  x     1  a  x  --> same 
(ii) 1  b  y     1  b  w  --> VALUE different 
(iii) 2  a  x          --> extra ID in t1 
(iv)         2  b  z  --> extra ID in t2 

私の目標は、私の試みは

    Difference 
     GUID ID Value1  Value2 
    (ii) 1  b  y   w   --> VALUE different 
    (iii) 2  a  x   NULL   --> extra ID in t1 
    (iv) 2  b  NULL  z   --> extra ID in t2 

(新しい表)次の形式でT1とT2との差を印刷します部品。その値

INSERT INTO Difference(GUID,ID,Value1,Value2) 
SELECT t1.GUID, t1.ID, t1.Value, t2.Value from t1, t2 
WHERE t1.GUID = t2.GUID and t1.ID = t2.ID and t1.Value != t2.Value 

上記クエリが正しい値を返す異なる

  1. 挿入行。

  2. IDがt1に存在し、t2に存在しない行を挿入します。 私はこのようなクエリを使用したい - >

    INSERT INTO Difference(GUID,ID,Value1) 
    (SELECT t1.GUID, t1.ID, t1.Value from t1, t2 
        WHERE t1.GUID= t2.GUID and t1.ID IN 
          ((SELECT GUID,ID FROM t1) EXCEPT 
           (SELECT GUID,ID FROM t2))) // I get an error here. 
    

    エラー: - サブクエリがEXISTSで導入されていない場合にのみ、1式が選択リストで指定することができます。

    IN句には「ID」列のみを選択してください。しかし、それは条件を満たしていません。 IN句でGUIDとIDの両方を使用したい。私は動作しなかった他の多くのクエリを試しました。この結果を得るにはどうすればよいですか?

  3. 表と逆の2番目と同じです。

+0

が、私は長い説明のために申し訳ありませんが、その交差点から1つのレコードのみを許可することができます。これは初めてのSQLの使用です。私がこの質問をより良い方法で尋ねることができたら教えてください。 – nan

+1

最初の試みとして悪くないです。基本的には、MySQLがサポートしていないFULL OUTER JOINですが、明らかにエミュレートできます。さらに詳しいヘルプについては、[私は非常に単純なSQLクエリであると思われるものに対してMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-非常にシンプルなSQLクエリー) – Strawberry

+0

リンクありがとうございます。 – nan

答えて

0

次の2つの列のキーによってT2とt2参加t1とグループに参加する組合t1は

SELECT 
    x.GUID, 
    x.ID, 
    x.Value1, 
    x.Value2 
    FROM (
    SELECT t1.GUID, t1.ID, t1.Value AS Value1, t2.Value AS Value2 FROM t1 LEFT JOIN t2 ON t2.GUID = t1.GUID AND t2.ID = t1.ID 
    UNION ALL 
    SELECT t2.GUID, t2.ID, t1.Value AS Value1, t2.Value AS Value2 FROM t2 LEFT JOIN t1 ON t1.GUID = t2.GUID AND t1.ID = t2.ID 
) x 
    GROUP BY x.GUID, x.ID; 
+0

Select x.Value1とx.Value2はGROUP BY句で使用していないので使えないと思います。そして、このクエリは私の例の最初の行を返すでしょうか?私は、2行目、3行目、4行目で異なる行を選択したいだけです。 – nan

+0

@nanあなたは間違いありません。 – Strawberry

+0

私は自分のテストデータ(このデータベースはデータベースに依存しています - 私はMariaDBを使用しています)でこのクエリを実行することができました。異なる行だけを必要とする場合は、WHERE x.Value1 <> x.Value2を外側の選択に追加します。 –

関連する問題