如何查询第一个表中的所有值并填充第二个表

时间:2017-06-05 22:00:06

标签: sql sql-server

对不起,如果我的问题一开始并不清楚。

我有这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}}

感谢您阅读我的问题!我知道这个问题可能已经得到了回答,因为它是基本的,但即使通过阅读一些类似的问题,我的大脑也无法处理如何去做。我想这是一个左连接或类似我读过的东西,但我不知道它是如何工作的,即使通过检查示例和检查这些连接图。

3 个答案:

答案 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