Выберите запрос с идентификатором и проверкой последней даты

#sql #sql-server #sql-server-2000

#sql #sql-сервер #sql-server-2000

Вопрос:

Использование SQL Server 2000

таблица 1:

 ID LastDate

001 20090101
003 20090501
004 20090302
...
  

таблица 2:

 ID Date Value

001 20090101 100
001 20090102 200
001 20090103 200
002 20090101 350
002 20090302 500
003 20090501 200
003 20090502 250
004 20090302 400
...
  

Из таблицы2 я хочу выбрать идентификатор и дату, дата должна отображаться со следующей даты и далее из таблицы1.

Запрос, подобный:

 Select * from table2 where date > table1.last on table1.id = table2.id
  

Ожидаемый результат:

 ID Date Value

001 20090102 200
001 20090103 200
002 20090101 350
002 20090302 500
003 20090502 250
...
  

Из приведенного выше вывода,

 id 001 is displaying from the next date of table1.lastdate
id 002 is displaying the same date because 002 is not in table1
id 003 is displaying from the next date of table1.lastdate
id 004 is not displaying because the same date is available on table1.lastdate
  

Я хочу сделать запрос для вышеуказанного условия.

Ответ №1:

Попробуйте:

 Select * from table2 t2 where t2.date > (select max(date) from table1 t1 where t1.id = t2.id)
  

Отредактировано:

 SELECT * FROM Table2 t2
WHERE t2.Date > 
(
    SELECT ISNULL(maxdate, 0) FROM 
    (
        SELECT MAX(t1.Date) as maxdate FROM Table1 t1 WHERE t1.ID = t2.ID
    ) t
)
  

Комментарии:

1. Я не могу равняться table1.id = table2.id, bcoz table2.id все должно отображаться, даже если тот же идентификатор отсутствует в доступной таблице1..

2. так что это немного сложнее 🙂 Проверьте это (я отредактировал ответ). Я понятия не имею, есть ли более простой запрос для этого.

Ответ №2:

Похоже, что антисоединение — это то, что вам здесь нужно. Вы могли бы реализовать защиту от объединения, например, с помощью LEFT JOIN amp; IS NULL check:

 SELECT
  t2.columns
FROM table2 t2
  LEFT JOIN table1 t1 ON t2.ID = t1.ID AND t2.Date <= t1.Date
WHERE t1.ID IS NULL
  

Другим способом сделать то же самое было бы использовать NOT EXISTS :

 SELECT
  columns
FROM table2 t2
WHERE NO EXISTS (
  SELECT *
  FROM table1 t1
  WHERE t2.ID = t1.ID
    AND t2.Date <= t1.Date
)