对不起,如果我的问题一开始并不清楚。
我有这3张桌子:
SELECT A.DATE_CREATED
FROM A, B
WHERE A.ID = B.ID
当ID A和B相同时,我想要的是从表A中获取所有日期:
ID | DATE_CREATED
1 | 2010
2 | 2009
3 | 2008
现在我没有得到的是如何从表C中获取所有日期并将它们放在上面的查询中,以便只将那个查询中不存在的日期放入其中。
所以如果查询输出
ID | DATE_CREATED
1 | 2017
2 | 2005
3 | 2003
4 | 2007
5 | 2010
表C包含
ID | DATE_CREATED
1 | 2010
2 | 2009
3 | 2008
4 | 2007
5 | 2010
我的最终结果应该是
{{1}}
感谢您阅读我的问题!我知道这个问题可能已经得到了回答,因为它是基本的,但即使通过阅读一些类似的问题,我的大脑也无法处理如何去做。我想这是一个左连接或类似我读过的东西,但我不知道它是如何工作的,即使通过检查示例和检查这些连接图。
答案 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 :(得分: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
答案 2 :(得分: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