Sql server SQL Server查询和外部联接

Sql server SQL Server查询和外部联接,sql-server,join,Sql Server,Join,考虑到桌子上的东西 IdStuff StuffName IdLanguage ------- --------- ---------- 1 Stuff 1 1 1 Stuff 2 2 而这一观点:大众语言 IdLanguage Name ---------- ---- 1 Language 1 2 Language 2 3 Language 3 我想获得: IdStuff

考虑到桌子上的东西

IdStuff  StuffName  IdLanguage
-------  ---------  ----------
1        Stuff 1    1
1        Stuff 2    2
而这一观点:大众语言

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,但没有成功

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

问题是只显示了2行,对于语言1和语言2…

右连接几乎从来都不是正确的方法。我认为您要寻找的是在不同的
文件
ID和
语言
行之间的
交叉连接
,然后是
文件
细节的
左连接(如果可用):

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

您需要
交叉连接的原因是,您基本上希望
stuff
中的每个不同ID与
language
中的每个记录相匹配,即使没有匹配的
IdLanguage
。一旦你有了这两个集合的笛卡尔积,你就想得到
StuffName
,如果它恰好有一个相应的
stuff
ID和
language
ID

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

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


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

至少让我们看看你的尝试。另外,我们如何“知道”我们应该为最后一行生成
IdStuff
1
?错误消息是什么?即使是交叉连接也不会做您想要做的事情,尽管它会稍微接近。您永远不会得到您想要的,因为对于语言3,IdStuff将为空。为什么第二行有一个字符串“材料1”而不是“材料2”"? 如果你要编造虚假的表格和数据,至少让它们有点道理。谢谢你的查询!如果您能解释为什么右连接不是一个解决方案,我将不胜感激。@user3104183您可能可以使用
右连接
获得正确的结果,但您可以重新排序连接,并使用
左连接
,而不是出于样式原因。。。大多数人都会同意,它只是比
RIGHT
更好地流动或读取。问题是相同的,即使使用左或右外部连接…@user3104183 Yea,在这两种情况下都需要
交叉连接。@user3104183因为即使没有匹配的行(第三行),您也需要一行,您需要交叉联接,因为使用语言3的表中的任何行都不存在左或右关系,因为不存在这样的行。我想,你也可以用一个并集来实现,但我不知道你如何在第一列中使用IdStuff=1。