SQL-запрос с условным JOIN - PullRequest
       9

SQL-запрос с условным JOIN

0 голосов
/ 13 апреля 2010

Сценарий:

Table1
CatID | Имя | Описание

Table2
ItId | Название | Дата | CatId (внешний ключ)

Я хочу вернуть все строки из Таблицы1 и Заголовок, Дата из Таблицы2, где Возвращаемая таблица 2 должна быть самой последней по столбцу даты. (во второй таблице много элементов с тем же CatId, и мне нужно только самое последнее)

У меня есть 2 запроса, но я не могу объединить их:

Query 1:  
SELECT Table1.Name,  Table1.Description,
       Table2.Title, Table2.Date
FROM 
       Table1 LEFT JOIN Table2 ON Table1.CatId=Table2.CatId

Query2:

SELECT TOP 1 Table2.Title, Table2.Date
FROM 
    Table2
WHERE 
    Table2.CatId = @inputParam
ORDER BY Table2.Date DESC

Ответы [ 3 ]

2 голосов
/ 13 апреля 2010

Вы можете использовать UNION, но вам нужно, чтобы столбцы совпадали:

Хорошо, перечитав вопрос, я понимаю, что вы пытаетесь сделать.

Это должно сработать:

SELECT Table1.Name,  Table1.Description,
 T2.Title, T2.Date

FROM
 Table1

LEFT JOIN (
 SELECT CatId, Title, Date, ROW_NUMBER() over (ORDER BY CatId, Date DESC) - RANK() over (ORDER BY CatID) as Num

 FROM  Table2) T2 on T2.CatId = Table1.CatId AND T2.Num = 0
0 голосов
/ 13 апреля 2010

Звучит так, как будто вы говорите о групповом максимуме (самая новая строка в Table2 для каждой соответствующей строки в Table1), и в этом случае проще всего использовать ROW_NUMBER:

WITH CTE AS
(
    SELECT
        t1.Name, t1.Description, t2.Title, t2.Date,
        ROW_NUMBER() OVER (PARTITION BY t1.CatId ORDER BY t2.Date DESC) AS Seq
    FROM Table1 t1
    LEFT JOIN Table2 t2
        ON t2.CatId = t1.CatId
)
SELECT *
FROM CTE
WHERE Seq = 1
OR Date IS NULL
0 голосов
/ 13 апреля 2010

Разве это не должно работать?

SELECT Table1.Name,  Table1.Description,
   T2.Title, T2.Date
FROM 
   Table1 LEFT JOIN (

SELECT TOP 1 Table2.CatId Table2.Title, Table2.Date
FROM 
Table2
WHERE 
Table2.CatId = Table1.catId 
ORDER BY Table2.Date DESC

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