2014-01-27 3 views
-4

Учитывая таблицу МатериалSQL и OUTER JOIN

IdStuff StuffName IdLanguage 
------- --------- ---------- 
1  Stuff 1 1 
1  Stuff 2 2 

и вид: vwLanguages ​​

IdLanguage Name 
---------- ---- 
1   Language 1 
2   Language 2 
3   Language 3 

Я хотел бы получить:

IdStuff StuffName IdLanguage 
------- --------- ---------- 
1   Stuff 1 1 
1   Stuff 2 2 
1   NULL  3 

Я попытался с ПРАВОЕ СОЕДИНЕНИЕ, но я не сделал этого ...

SELECT 
    S.IdStuff, S.StuffName, vwLanguages.IdLanguage 
FROM 
    Stuff S 
    RIGHT JOIN vwLanguages ON vwLanguages.IdLanguage = S.IdLanguage 

Проблема заключается в том, что только 2 строки приведены для языка 1 и 2 языка ...

+4

Покажите нам свою попытку, по крайней мере. Кроме того, как мы «знаем», что мы должны генерировать значение 'IdStuff'' 1' для последней строки? –

+0

Какое сообщение об ошибке? –

+0

Даже CROSS JOIN не будет делать то, что вам нужно, хотя это будет немного ближе. –

ответ

10

RIGHT JOIN почти никогда не правильный подход. Я думаю, что вы ищете является CROSS JOIN между различными stuff идентификаторов и language строк, а затем LEFT JOIN к stuff деталей при их наличии .:

SELECT 
    subStuff.IdStuff, 
    s.StuffName, 
    l.IdLanguage 
FROM 
(
    SELECT DISTINCT IdStuff 
    FROM Stuff 
) subStuff 
CROSS JOIN vwLanguages l 
LEFT JOIN Stuff s 
    ON s.IdStuff = subStuff.IdStuff 
    AND s.IdLanguage = l.IdLanguage 

SQL Fiddle

Причина, по которой вам нужно CROSS JOIN заключается в том, что вы в основном хотите, чтобы каждый отдельный идентификатор от stuff соответствовал каждой записи с language, даже если нет соответствующего IdLanguage. Как только у вас есть это декартово произведение этих двух наборов, вы хотите получить StuffName, если у него есть соответствующий stuff ID и language ID.

Реализация немного сложна для объяснения, потому что требования немного странные и на самом деле не соответствуют вашей структуре таблиц.

Например, почему IdStuff не является уникальным в таблице stuff?

Я предполагаю, что это надуманный пример, но он вызывает много других вопросов.

+0

благодарит за запрос! Я был бы признателен, если бы вы объяснили, почему RIGHT JOIN не является решением? – user3104183

+0

@ user3104183 Вероятно, вы можете получить правильные результаты с помощью 'RIGHT JOIN', но вместо этого вы можете упорядочить свои соединения и использовать' LEFT' вместо этого по причинам стиля ... большинство людей согласятся, что оно просто течет или читается лучше, чем ' RIGHT'. –

+0

Проблема такая же, даже при внешнем соединении LEFT или RIGHT ... – user3104183