SQL左联接,其中联接列中缺少数据
我甚至不确定这是否可行,但我正在尝试将两个表连接在一起,但没有得到预期的结果。我的质询如下:SQL左联接,其中联接列中缺少数据,sql,sql-server,join,Sql,Sql Server,Join,我甚至不确定这是否可行,但我正在尝试将两个表连接在一起,但没有得到预期的结果。我的质询如下: SELECT inc.NUMBER as TICKET, inc.UNIV_NUM, inc.ASSIGNEE, work.SUBMIT_DATE work.TYPE FROM dbo.HELP_DESK as inc LEFT JOIN dbo.WORKLOG as work on inc.NUMBER = work.NUMBER Where inc.ASSIGNEE = 'AB049732' and
SELECT inc.NUMBER as TICKET,
inc.UNIV_NUM,
inc.ASSIGNEE,
work.SUBMIT_DATE
work.TYPE
FROM dbo.HELP_DESK as inc
LEFT JOIN dbo.WORKLOG as work on inc.NUMBER = work.NUMBER
Where inc.ASSIGNEE = 'AB049732'
and work.SUBMIT_DATE = (Select MAX(work2.SUBMIT_DATE)
from dbo.WORKLOG as work2
where work2.NUMBER = work.NUMBER
and work2.TYPE = '16000')
我的桌子看起来像这样
公司
工作
我的预期产出是:
+--------+----------+----------+------------+-------+
| NUMBER | UNIV_NUM | ASSIGNEE | DATE | TYPE |
+--------+----------+----------+------------+-------+
| 100001 | 4321781 | AB049732 | 23/05/2018 | 16000 |
| 100002 | 4232756 | AB049732 | NULL | NULL |
| 100003 | 4322534 | AB049732 | 22/05/2018 | 16000 |
| 100004 | 4328534 | AB049732 | 22/05/2018 | 16000 |
+--------+----------+----------+------------+-------+
+---------+-----------+----------+------------+-------+
| NUMBER | UNIV_NUM | ASSIGNEE | DATE | TYPE |
+---------+-----------+----------+------------+-------+
| 100001 | 4321781 | AB049732 | 23/05/2018 | 16000 |
| 100003 | 4322534 | AB049732 | 22/05/2018 | 16000 |
| 100004 | 4328534 | AB049732 | 22/05/2018 | 16000 |
+---------+-----------+----------+------------+-------+
但我的实际产出是:
+--------+----------+----------+------------+-------+
| NUMBER | UNIV_NUM | ASSIGNEE | DATE | TYPE |
+--------+----------+----------+------------+-------+
| 100001 | 4321781 | AB049732 | 23/05/2018 | 16000 |
| 100002 | 4232756 | AB049732 | NULL | NULL |
| 100003 | 4322534 | AB049732 | 22/05/2018 | 16000 |
| 100004 | 4328534 | AB049732 | 22/05/2018 | 16000 |
+--------+----------+----------+------------+-------+
+---------+-----------+----------+------------+-------+
| NUMBER | UNIV_NUM | ASSIGNEE | DATE | TYPE |
+---------+-----------+----------+------------+-------+
| 100001 | 4321781 | AB049732 | 23/05/2018 | 16000 |
| 100003 | 4322534 | AB049732 | 22/05/2018 | 16000 |
| 100004 | 4328534 | AB049732 | 22/05/2018 | 16000 |
+---------+-----------+----------+------------+-------+
实际上,数字100002即使在inc表中也不会显示。是我做错了什么,还是你不能加入不存在的东西?你的加入条件不好。试试这个:
SELECT inc.NUMBER as TICKET,
inc.UNIV_NUM,
inc.ASSIGNEE,
work.SUBMIT_DATE
work.TYPE
FROM dbo.HELP_DESK as inc
LEFT JOIN dbo.WORKLOG as work on inc.NUMBER = work.NUMBER
and work.SUBMIT_DATE = (Select MAX(work2.SUBMIT_DATE)
from dbo.WORKLOG as work2
where work2.NUMBER = work.NUMBER
and work2.TYPE = '16000')
Where inc.ASSIGNEE = 'AB049732'
看到区别了吗?如果将work.SUBMIT\u DATE=…
条件放在Where
子句中(就像您所做的那样),那么您的联接将成为内部联接。但是您需要外部联接。使用窗口函数
SELECT h.NUMBER as TICKET, h.UNIV_NUM, h.ASSIGNEE,
w.SUBMIT_DATE, w.TYPE
FROM dbo.HELP_DESK h LEFT JOIN
(SELECT w.*, MAX(w2.SUBMIT_DATE) OVER (PARTITION BY w.NUMBER) as max_submit_date
FROM dbo.WORKLOG w
WHERE w.TYPE = '16000'
) w
ON h.NUMBER = w.NUMBER AND w.submit_date = w.max_submit_date
WHERE h.ASSIGNEE = 'AB049732';
这与您的查询略有不同,但我认为这是您真正想要的逻辑。您的查询将查找具有“16000”类型的最长提交日期的记录,而不考虑类型。我认为您确实希望类型与提交日期对齐
如果此解释错误,则很容易调整查询:
SELECT h.NUMBER as TICKET, h.UNIV_NUM, h.ASSIGNEE,
w.SUBMIT_DATE, w.TYPE
FROM dbo.HELP_DESK h LEFT JOIN
(SELECT w.*,
MAX(CASE WHEN w.TYPE = '16000' THEN w2.SUBMIT_DATE END) OVER (PARTITION BY w.NUMBER) as max_submit_date
FROM dbo.WORKLOG w
) w
ON h.NUMBER = w.NUMBER AND w.submit_date = w.max_submit_date
WHERE h.ASSIGNEE = 'AB049732';
这些版本不仅更简单,而且应该具有更好的性能。您可以使用如下CTE:
WITH WorkDates
AS (SELECT SUBMIT_DATE,TYPE
From WORKLOG work
Where SUBMIT_DATE = (Select MAX(work2.SUBMIT_DATE)
from dbo.WORKLOG as work2
where work2.NUMBER = work.NUMBER
and work2.TYPE = '16000'))
SELECT inc.NUMBER as TICKET,
inc.UNIV_NUM,
inc.ASSIGNEE,
WorkDates.SUBMIT_DATE
WorkDates.TYPE
FROM dbo.HELP_DESK as inc
LEFT JOIN WorkDates on inc.NUMBER = WorkDates.NUMBER
Where inc.ASSIGNEE = 'AB049732'
将筛选工作表的WHERE条件作为左联接中的另一个条件移动。这是因为您已使用WHERE谓词将左联接转换为内部联接。将该谓词移动到联接中,它将以您希望的方式返回数据。第二个where子句将删除该行,将该行从联接中移动到on子句,它将再次工作