我有两张桌子:
位置:
合同:
我想要实现的是将一张表格从合约表附加到位置表
但是当我这样做时
SELECT
*
FROM
dbo.Position p
LEFT OUTER JOIN
dbo.Contract c ON (p.ID = c.ID)
我得到了
我不明白,为什么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
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
我将把它放在这里以备将来使用
答案 0 :(得分:0)
我建议您使用HAVING条件进行此类码头。它将为您的发展提供帮助。谢谢!
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);