Соединение SQL Left, где данные отсутствуют в столбце соединения - PullRequest
0 голосов
/ 24 мая 2018

Я даже не уверен, что это возможно, но я пытаюсь объединить две таблицы вместе, но я не получаю ожидаемых результатов.Мой запрос выглядит следующим образом:

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')

Мои таблицы выглядят так

inc

+---------+-----------+----------+
| NUMBER  | UNIV_NUM  | ASSIGNEE |
+---------+-----------+----------+
|  100001 |   4321781 | AB049732 |
|  100002 |   4232756 | AB049732 |
|  100003 |   4322534 | AB049732 |
|  100004 |   4328534 | AB049732 |
+---------+-----------+----------+

работа

+--------+------------+-------+
| NUMBER |   DATE     | TYPE  |
+--------+------------+-------+
| 100001 | 23/05/2018 | 16000 |
| 100003 | 22/05/2018 | 16000 |
| 100004 | 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.Я делаю что-то не так или вы не можете присоединиться к тому, чего не существует?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Используйте оконные функции!

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';

Эти версии не только проще, но они также должны иметь лучшую производительность.

0 голосов
/ 24 мая 2018

Вы можете использовать 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'
0 голосов
/ 24 мая 2018

Ваше условие соединения плохое.Попробуйте это:

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_DATE = ... в предложение Where (как вы это сделали), то ваше объединение станет внутренним объединением.Но вы хотите внешнее соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...