Как выбрать одну запись в левом соединении
Мне нужно выбрать конкретную модель из таблицы моделей, используя ее ключ ModelID. Мне также нужно добавить рекламный блок из таблицы Model_Content. Однако таблица Models_Content имеет несколько рекламных блоков для каждой модели. Мне нужно выбрать только первый рекламный ролик.
Мои таблицы выглядят следующим образом:
Models // table
ModelID // pk
Model // varchar
Models_Content // table
ContentID // pk
ModelID // fk
Content // varchar
SELECT M.ModelID, M.Model, C.Content
FROM Models M LEFT JOIN Models_Content C ON M.ModelID = C.ModelID
WHERE M.ModelID = 5
Как настроить мой запрос, чтобы выбрать только самую первую рекламную кампанию для конкретной модели?
Ответы
Ответ 1
SELECT
M.ModelID, M.Model, C.Content
FROM
Models M
LEFT JOIN
Models_Content C
ON C.ContentID = (SELECT MIN(ContentID) FROM Models_Content WHERE ModelID = M.ModelID)
WHERE
M.ModelID = 5
или
;WITH sorted_content AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY ModelID ORDER BY ContentID) AS itemID,
*
FROM
Models_Content
)
SELECT
M.ModelID, M.Model, C.Content
FROM
Models M
LEFT JOIN
sorted_content C
ON C.ModelID = M.ModelID
AND C.itemID = 1
WHERE
M.ModelID = 5
Ответ 2
Ответ Sean - это лучшее конкретное решение, но просто добавить другое "обобщенное" решение
SELECT M.ModelID,
M.Model,
C.Content
FROM Models M
OUTER APPLY (SELECT TOP 1 *
FROM Models_Content C
WHERE M.ModelID = C.ModelID
ORDER BY C.ContentID ASC) C
WHERE M.ModelID = 5
Ответ 3
SELECT TOP 1 M.ModelID, M.Model, C.Content
FROM Models M LEFT JOIN Models_Content C ON M.ModelID = C.ModelID
WHERE M.ModelID = 5
ORDER BY C.ContentID ASC
Ответ 4
Измените свой JOIN
на:
LEFT JOIN (SELECT ModelID, MAX(Content) as Content FROM Models_Content GROUP BY ModelID)
Это предполагает, что вам не важно, какой Content
вы получите.
Ответ 5
вы можете выбрать MIN ( contentID )
Ответ 6
Это может быть расширение ответа Рэнди, но это мне не совсем понятно.
По соображениям производительности я хотел свести к минимуму количество операторов SELECT
в моем запросе, поэтому я использовал оператор MIN
в основном выборе, а не в JOIN
:
SELECT
table_1.id AS id,
table_1.name AS name,
MIN(table_2.id) AS table_2_id
FROM table_1
LEFT JOIN table_2 ON table_2.table_1_id = table_1.id
-- additional JOINs and WHERE excluded
GROUP BY table_1.id, table_1.name
LIMIT 5
Могут быть компромиссы в зависимости от общего объема данных. ИДК. Мой запрос должен туннелировать данные из состояния, удаленного несколькими шагами.
Ответ 7
SELECT M.ModelID
, M.Model
, (SELECT TOP 1 Content
FROM Models_Content
WHERE ModelID = M.ModelID
ORDER BY ContentId ASC) as Content
FROM Models M
WHERE M.ModelID = 5