2017-06-05 48 views
0

對不起,如果我的問題一開始並不清楚。如何查詢第一個表中的所有值並填寫第二個表

我有這3個表:

Table A: 
ID | DATE_CREATED 

Table B: 
ID | DATE_CREATED 

TABLE C: 
ID | DATE_CREATED 

我想正從表A的所有日期時,ID A和B是相同的:

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

我用過你的方法,像我想要的那樣工作,謝謝! Coalesce正是我想要的! –

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 
相關問題