SQL Server查询和OUTER JOIN

时间:2014-01-27 14:01:46

标签: sql-server join

给出表格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行...

1 个答案:

答案 0 :(得分:10)

RIGHT JOIN几乎从来都不是正确的做法。我认为您要查找的是CROSS JOIN个ID和stuff行之间的language,然后LEFT JOINstuff个详细信息(如果有)。 :

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中的每个不同ID与language中的每条记录匹配,即使没有匹配{ {1}}。获得这两组笛卡尔积之后,如果恰好有IdLanguage ID和StuffName ID,则需要stuff

实现有点难以解释,因为要求有点奇怪,并且与表结构不匹配。

例如,为什么languageIdStuff表中不唯一?

我认为这是一个人为的例子,但它提出了许多其他问题。