给出表格Stuff
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
我尝试过RIGHT JOIN,但我没有成功......
SELECT
S.IdStuff, S.StuffName, vwLanguages.IdLanguage
FROM
Stuff S
RIGHT JOIN vwLanguages ON vwLanguages.IdLanguage = S.IdLanguage
问题是,对于语言1和语言2只显示了2行...
答案 0 :(得分:10)
RIGHT JOIN
几乎从来都不是正确的做法。我认为您要查找的是CROSS JOIN
个ID和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
您需要CROSS JOIN
的原因是您基本上希望stuff
中的每个不同ID与language
中的每条记录匹配,即使没有匹配{ {1}}。获得这两组笛卡尔积之后,如果恰好有IdLanguage
ID和StuffName
ID,则需要stuff
。
实现有点难以解释,因为要求有点奇怪,并且与表结构不匹配。
例如,为什么language
在IdStuff
表中不唯一?
我认为这是一个人为的例子,但它提出了许多其他问题。