Моя запись NULL не отображается, несмотря на добавление предложения WHERE IS NULL - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть база данных, которая выглядит примерно так:

Таблица 1: ------------------- Таблица 2:

ID1|Item Name        ID2|Date
---|----------       ---|---------
1  |A                1  |01/01/2020
2  |B                1  |11/01/2020
3  |C                1  |21/01/2020
                     2  |01/01/2020

Я хочу получить самую последнюю дату каждого элемента, даже если у него его нет:

Item Name|Latest Date
---------|-----------
A        |21/01/2020
B        |01/01/2020
C        |NULL

Итак, я сделал это:

SELECT [Item Name], [Date] AS [Latest Date]
FROM [Table 1]
LEFT JOIN [Table 2] AS A
ON [ID1] = [ID2]
WHERE [Date] IN
(
    SELECT MAX([Date]) FROM [Table 2] AS B
    WHERE A.[ID2] = B.[ID2]
)
OR [Date] IS NULL

Но что я получу? вместо этого это:

Item Name|Latest Date
---------|-----------
A        |21/01/2020
B        |01/01/2020

Что я делаю не так? Как я могу заставить C появиться?

Я знаю, что предложение WHERE избавляется от него, но, поскольку я добавил проверку IS NULL, не должно ли она появиться тоже?

Ответы [ 5 ]

1 голос
/ 10 февраля 2020

Итак, я выяснил, почему, и я, должно быть, тупой.

У меня есть еще одно предложение JOIN, но я проверил свой запрос без него и получил нежелательный результат. поэтому я оставил это вне вопроса. После того, как я увидел, что несколько пользователей не могут воспроизвести, я попытался снова без другого соединения, и я получил удовлетворительный результат. Я предполагаю, что я забыл предложение WHERE [Date] IS NULL, когда проверял это.

По сути, теперь у меня есть именно то, что я хочу

В любом случае, большое спасибо!

0 голосов
/ 10 февраля 2020

Существует альтернатива, в которой вы можете объявить переменную и назначить максимальное значение даты. При присоединении установите это значение, где дата равна нулю, как показано ниже.

Create table Table1 (Id int, [Item Name] varchar(20))
Insert into Table1 Values (1, 'A'), (2, 'B'), (3, 'C')

Create table Table2 (Id2 int, dtDate Date)
Insert into Table2 Values 
        (1, '01/01/2020'), (1, '01/11/2020'), (1, '01/21/2020'), (2, '01/01/2020')

declare @maxDtDate date
Select @maxDtDate = max(dtDate) from Table2

SELECT 
       A.[Item Name], 
       MAX(Isnull(B.[dtDate], @maxDtDate)) AS [Latest Date]
FROM [Table1] AS A LEFT JOIN [Table2] AS B ON A.[ID] = B.[ID2]
Group By A.[Item Name]

Live Demo

0 голосов
/ 10 февраля 2020

Я думаю, вам сначала нужно получить максимальную дату для каждого идентификатора, а затем соединить ее с элементами:

SELECT T1.[Item Name], T2.[Date] AS [Latest Date]
FROM [Table 1] AS T1
    LEFT JOIN (
        SELECT ID2, MAX(Date) AS [Date]
        FROM [Table 2] AS T2
        GROUP BY ID2
    ) AS T2 ON T1.ID1 = T2.ID2
0 голосов
/ 10 февраля 2020

Я бы использовал аналитическую функцию для получения последнего значения, например:

WITH Resultset
AS
(SELECT
        [Item Name]
       ,[DATE]
       ,ROW_NUMBER() OVER (PARTITION BY ID1 ORDER BY [Date] DESC) rn
    FROM [Table 1]
    LEFT JOIN [Table 2] AS A
        ON [ID1] = [ID2])
SELECT
    [Item Name]
   ,[DATE]
FROM Resultset
WHERE rn = 1

Здесь вы упорядочиваете по столбцам [Дата] и всегда получаете строку последних, если она существует из таблицы 2.

Если в таблице 2 есть больше столбцов, легко получить значение по дате

0 голосов
/ 10 февраля 2020

Вы можете использовать следующее:

SELECT A.[Item Name], MAX(B.[Date]) AS [Latest Date]
FROM [Table 1] AS A LEFT JOIN [Table 2] AS B ON A.[ID1] = B.[ID2]
GROUP BY A.[Item Name]
ORDER BY A.[Item Name] ASC

Вам не нужно проверять дату в предложении WHERE. Вы можете LEFT JOIN две таблицы и GROUP BY названия элементов. С MAX вы получите последнюю дату каждой группы.

...