Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左外部联接的行为类似于内部联接_Sql_Sql Server_Tsql_Join_Left Join - Fatal编程技术网

Sql 左外部联接的行为类似于内部联接

Sql 左外部联接的行为类似于内部联接,sql,sql-server,tsql,join,left-join,Sql,Sql Server,Tsql,Join,Left Join,我有三张桌子:T1,T2,T3 我需要在结果中包含T1中的所有行,如果T2和T3中有匹配的记录,那么也输出它们 所以我的问题看起来像 SELECT * FROM T1 LEFT JOIN T2 ON T1.Id = T2.Id INNER JOIN T3 ON T2.SecondId = T3.Id 但结果是,我只收到T3中有一些记录的记录。 这和我写的一样吗 SELECT * FROM T1 LEFT JOIN T2 ON T1.Id = T2.Id WHERE T2.Val

我有三张桌子:T1,T2,T3

我需要在结果中包含T1中的所有行,如果T2和T3中有匹配的记录,那么也输出它们

所以我的问题看起来像

SELECT *
FROM T1 
LEFT JOIN T2
  ON T1.Id = T2.Id
INNER JOIN T3
  ON T2.SecondId = T3.Id
但结果是,我只收到T3中有一些记录的记录。 这和我写的一样吗

SELECT *
FROM T1 
LEFT JOIN T2
  ON T1.Id = T2.Id
WHERE T2.Value = 4

where LEFT JOIN的行为类似于内部JOIN,因为where子句?

您可能需要的语法是:

SELECT *
FROM T1 LEFT JOIN
     T2
     ON T1.Id = T2.Id LEFT JOIN
     T3
     ON T2.SecondId = T3.Id
如果没有第二个
左连接
,则
内部连接
会过滤掉不匹配项。这是因为对于那些不匹配项,
T2.SecondId
将为
NULL
。这是正确的方法;显式检查
NULL
s有一些边缘情况不起作用

对于第二个查询:

SELECT *
FROM T1 LEFT JOIN
     T2
     ON T1.Id = T2.Id AND T2.Value = 4

是的,你明白了。该条件需要进入
ON
子句。
外部联接
从一侧(左侧或右侧)返回另一侧没有匹配行的行。
on
子句定义匹配条件并允许空值。您可以使用
where
子句,但需要对其进行编码以正确处理空值,例如
。。。其中T2.Value为NULL或T2.Value=4以使其按预期工作。@GordonLinoff所以我需要使用左连接两次来获得我想要的,对吗?这是一个常见问题解答。在考虑发帖之前,请阅读您的教科书和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。如果你发布一个问题,用一句话作为标题。反思你的研究。请参阅文本上方的投票箭头鼠标(&T)。好的,明白。谢谢