SQL Server查询和OUTER JOIN

use*_*183 -4 sql-server join

鉴于桌子的东西

IdStuff  StuffName  IdLanguage
-------  ---------  ----------
1        Stuff 1    1
1        Stuff 2    2
Run Code Online (Sandbox Code Playgroud)

和观点:vwLanguages

IdLanguage   Name
----------   ----
1            Language 1
2            Language 2
3            Language 3
Run Code Online (Sandbox Code Playgroud)

我想获得:

IdStuff   StuffName  IdLanguage
-------   ---------  ----------
1         Stuff 1    1
1         Stuff 2    2
1         NULL       3
Run Code Online (Sandbox Code Playgroud)

我试过RIGHT JOIN,但我没有成功......

SELECT
    S.IdStuff, S.StuffName, vwLanguages.IdLanguage
FROM
    Stuff S
    RIGHT JOIN vwLanguages ON vwLanguages.IdLanguage = S.IdLanguage
Run Code Online (Sandbox Code Playgroud)

问题是只显示了2行,语言1和语言2 ...

Mic*_*son 10

RIGHT JOIN几乎从来都不是正确的方法.我认为你在寻找什么是一个CROSS JOIN独特的之间stuff的ID和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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

您需要的原因CROSS JOIN是您基本上希望每个不同的ID stuff与每个记录匹配language,即使没有匹配IdLanguage.一旦你拥有这两组的笛卡尔积,那么你就想得到StuffName它是否碰巧有相应的stuffID和languageID.

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

例如,为什么表中IdStuff不是唯一的stuff

我假设这是一个人为的例子,但它提出了很多其他问题.

  • @ user3104183因为即使根本没有匹配(第三行)你想要一行,你需要交叉连接,因为与表3中的任何行没有左右关系,因为没有这样的行存在.我想,你也可以用一个联盟来做,但后来我不知道你在第一列中的IdStuff = 1. (3认同)