Подтвердить что ты не робот

Как выбрать одну запись в левом соединении

Мне нужно выбрать конкретную модель из таблицы моделей, используя ее ключ 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

Как настроить мой запрос, чтобы выбрать только самую первую рекламную кампанию для конкретной модели?

4b9b3361

Ответ 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