2017-06-05 7 views
0

ご質問が最初に不明な場合は申し訳ありません。1rstテーブルからすべての値をクエリして2番目のテーブルを入力する方法

私は、これらの3つのテーブルがあります:ID AとBが同じである場合、表Aのすべての日付を取得している私は何をしたい

Table A: 
ID | DATE_CREATED 

Table B: 
ID | DATE_CREATED 

TABLE C: 
ID | DATE_CREATED 

を:

SELECT A.DATE_CREATED 
FROM A, B 
WHERE A.ID = B.ID 

今、私は得ることはありませんどのような表Cのすべての日付を取得して上記のクエリーに入れることで、そのクエリーに存在しないものだけがそこに置かれるようにする方法です。

クエリ出力

ID | DATE_CREATED 
1 |  2010 
2 |  2009 
3 |  2008 

とテーブルのであればCは

ID | DATE_CREATED 
1 |  2017 
2 |  2005 
3 |  2003 
4 |  2007 
5 |  2010 

私の最終的な結果は

ID | DATE_CREATED 
1 |  2010 
2 |  2009 
3 |  2008 
4 |  2007 
5 |  2010 

する必要があります含まれている私の質問を読んでいただきありがとうございます!私はこれが基本的なので、これはすでに答えられているかもしれないことを知っていますが、私の脳はそれをやる方法を処理することはできませんいくつかの同様の質問を読むことによって。私はそれが左のジョイントかそういうものを私が読んだものと思っていますが、サンプルをチェックし、それらのジョイングラフをチェックしても、どのように動作するのか分かりません。ここで

答えて

1

使用join文とそれははるかに容易になります。

SELECT COALESCE(A.ID, C.ID), COALESCE(A.DATE_CREATED, C.DATE_CREATED) 
FROM A 
    INNER JOIN B ON A.ID = B.ID 
    FULL JOIN C ON A.ID = C.ID 
WHERE A.ID != C.ID 
+0

これらのCOALESCE()列のエイリアスを忘れないでください。さもなければ、彼らは参照することができません。 – Shawn

+0

私はあなたの方法を使用しました。合体は私が欲しいものを正確に行います! –

1

は一つの方法である:

WITH ab as (
     SELECT A.ID, A.DATE_CREATED 
     FROM A JOIN 
      B 
      ON A.ID = B.ID 
    ) 
SELECT ab.* 
FROM ab 
UNION ALL 
SELECT c.ID, c.DATE_CREATED 
FROM c 
WHERE c.ID NOT IN (SELECT ID FROM ab); 
1

明確にする:

あなたは

A.ID, A.DATE_CREATED 
を表示したいです

またはAとBのIDフィールド間の一致がない場合は、そう

C.ID, C.DATE_CREATED 

を表示したいそして、あなたはすでに最初のビットを取得する方法を考え出した:に追加するには

SELECT A.ID, A.DATE_CREATED 
FROM A 
INNER JOIN B 
ON A.ID = B.ID 

を他の2つの答えは、ここで私は一時テーブルと古い学校を行う方法です:

SELECT A.ID, A.DATE_CREATED 
INTO #tmpA 
FROM A 
INNER JOIN B 
ON A.ID = B.ID 

SELECT #tmpA.ID , #tmpA.DATE_CREATED 
FROM #tmpA 
UNION SELECT C.ID, C.DATE_CREATED 
FROM C 
LEFT JOIN #tmpA 
ON C.ID = #tmpA.ID 
WHERE #tmpA.ID IS NULL 
関連する問題