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子句,它将再次工作