如何正确连接SQL Server中的数据

时间:2018-03-17 01:12:45

标签: sql-server

我有两张桌子:

位置

enter image description here

合同

enter image description here

我想要实现的是将一张表格从合约表附加到位置表

但是当我这样做时

SELECT  
    *
FROM
    dbo.Position p
LEFT OUTER JOIN
    dbo.Contract c ON (p.ID = c.ID)

我得到了

enter image description here

我不明白,为什么id = 4有4条记录?我错过了什么吗?与主题一样,我正在使用SQL Server。

编辑:也许我会发布一个我想要解决的完整问题,也许上面的步骤是没有必要的。我想要实现的是识别记录,其中第一个fdate_from位置与合同中的第一个date_from不匹配(黑色)。问题的第二部分是识别位置列中的最后date_to与合同中的最后date_to不匹配的所有记录。

我在下面的表格中使用的查询是:

SELECT
    *
FROM
    dbo.Position c
LEFT OUTER JOIN
    dbo.Contract p ON (p.ID = c.ID)
ORDER BY 
    p.id, p.date_from, p.date_to, c.date_from, c.date_to ASC

enter image description here

EDIT2 :问题的第1部分似乎已经解决了:

SELECT 
    *
FROM
    (SELECT  
         p.id,
         MIN(p.date_from) AS p_date_from,
         MIN(c.date_from) AS c_date_from
     FROM 
         dbo.Position p
     LEFT OUTER JOIN
         dbo.Contract c ON (p.ID = c.ID)
     GROUP BY 
         p.id) AS m
WHERE 
    m.p_date_from != m.c_date_from
ORDER BY 
    id

然而第2部分似乎更复杂......因为有些空值可能会被max

忽略
SELECT 
    *
FROM
    (SELECT  
         p.id,
         MAX(p.date_to) AS p_date_to,
         MAX(c.date_to) AS c_date_to
     FROM
         dbo.Position p
     LEFT OUTER JOIN
         dbo.Contract c ON (p.ID = c.ID)
     GROUP BY 
         p.id) AS m
WHERE
    m.p_date_to != m.c_date_to
ORDER BY 
    id

编辑3 :最后,第二个条件得到了http://www.bradleyschacht.com/select-null-as-max-or-min-in-sql-query/的支持

SELECT 
    *
FROM
    (SELECT  
         p.id,
         MAX(COALESCE(p.date_to, '2099-12-31')) AS p_date_to,
         MAX(COALESCE(c.date_to, '2099-12-31')) AS c_date_to
     FROM
         dbo.Position p
     LEFT OUTER JOIN
         dbo.Contract c ON (p.ID = c.ID)
     GROUP BY 
         p.id) AS m
WHERE
    m.p_date_to != m.c_date_to
ORDER BY 
    id

我将把它放在这里以备将来使用

1 个答案:

答案 0 :(得分:0)

我建议您使用HAVING条件进行此类码头。它将为您的发展提供帮助。谢谢!

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

SQL HAVING Clause - W3School