2013-11-15 3 views
1

У меня есть запрос с несколькими левыми внешними соединениями, для простоты я просто включу их. Это выглядит примерно так:Несколько внешних соединений возвращают верхний результат

SELECT Object.ID, Gloss.name, Gloss.order, Title.name from Object 
LEFT OUTER JOIN Gloss on Gloss.object_id = Object.ID 
LEFT OUTER JOIN Title on Title.object_id = Object.ID 

Однако некоторые элементы имеют несколько Gloss, и я хочу вернуть только одну строку, либо с макс или мин Gloss.order. Пример вывод из моего запроса выглядит следующим образом:

|Object.ID | Gloss.name | Gloss.order | Title.name 
|4.00  | glossvalue1| 1   | TitleValue 
|4.00  | glossvalue2| 2   | TitleValue 
|3.00  | gloss3-1 | 11   | OtherTitle 
|3.00  | gloss3-2 | 13   | OtherTitle 
|3.00  | gloss3-3 | 15   | OtherTitle 

В идеале я хотел бы вернуть что-то вроде этого:

|Object.ID | Gloss.name | Gloss.order | Title.name 
|4.00  | glossvalue1| 1   | TitleValue 
|3.00  | gloss3-1 | 11   | OtherTitle 

Я думаю, что мне нужна некоторые минимальные или вещи, но у меня возникли проблемы комбинируя это с другим внешним соединением (которое не требует max или min). Любая помощь приветствуется, дайте мне знать, если вам нужна дополнительная информация.

ответ

1

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

SELECT Object.ID, (SELECT name FROM Gloss G WHERE G.object_id = X.object_id AND G.order = X.ord) AS [GlossName], 
    X.order, Title.name 
FROM Object 
LEFT OUTER JOIN 
    (SELECT object_id, MIN(order) ord FROM Gloss GROUP BY object_id) X 
ON X.object_id = Object.ID 
LEFT OUTER JOIN Title on Title.object_id = Object.ID 

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

+1

Сначала я получил «Имя столбца не было указано для столбца 2 ошибки« X », а затем было изменено« MIN »(порядок« до »MIN (порядок) ord' и' X.order' от SELECT до 'x.ord 'и я был в деле. Спасибо. – user2856332

+0

Да, правильно! Я обновил свой ответ на основе этого. – Szymon

0
SELECT Object.ID, min(Gloss.name), min(Gloss.order), Title.name from Object 
LEFT OUTER JOIN Gloss on Gloss.object_id = Object.ID 
LEFT OUTER JOIN Title on Title.object_id = Object.ID 
GROUP BY Object.ID,Title.name 
0
select object.ID, Gloss.name, min(Gloss.order) as order, Title.name 
from object 
left outer join Gloss on Gloss.object_id = object.ID 
left outer join Title on Title.object_id = object.ID 
group by object.ID, Gloss.name, Title.name 
Смежные вопросы