Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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_Mysql_Join_Left Join - Fatal编程技术网

Sql 如何在左联接分支内强制联接?

Sql 如何在左联接分支内强制联接?,sql,mysql,join,left-join,Sql,Mysql,Join,Left Join,我需要左连接到整个t2+t3分支,但是如果我能在t1和t2之间找到匹配的连接,我想强制t2和t3连接 SELECT T1.name,T2.bob,T3.a FROM T1 LEFT JOIN T2 ON t1.id = t2.t1_id JOIN T3 ON t2.id = T3.t2_id 语法是什么 样本数据: T1 [id,name] 1 aaa 2 bbb 3 ccc T2 [id,t1_id,bob] 1,1,777 2,1,888 2,2,999 T3

我需要左连接到整个t2+t3分支,但是如果我能在t1和t2之间找到匹配的连接,我想强制t2和t3连接

   SELECT T1.name,T2.bob,T3.a
     FROM T1
LEFT JOIN T2 ON t1.id = t2.t1_id
     JOIN T3 ON t2.id = T3.t2_id
语法是什么

样本数据:

T1 [id,name]
1 aaa
2 bbb
3 ccc

T2 [id,t1_id,bob]
1,1,777
2,1,888
2,2,999

T3[id,t2_id,a]
1,2,'yeh'
预期结果:

 [name] , [a]   , [bob]
  aaa   , 'yeh' , 888
  bbb   , NULL  , NULL
  ccc   , NULL  , NULL

编辑:此查询返回样本数据的预期结果- (另请注意,此查询是在下面Treefrog回答的帮助下进行的)-

我以前的回答-

SELECT a
FROM T1 as t1
INNER JOIN T2 as t2 ON t1.id = t2.t1_id
LEFT JOIN T3 as t3 ON t2.id = t3.t2_id

这两个都会给你结果。不确定哪一个会表现更好

嵌套语句:

SELECT [name], NULL AS [a], NULL AS  [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NULL
AND (SELECT COUNT(*) FROM t1 AS t1b LEFT OUTER JOIN t2 AS t2b ON t1b.id = t2b.t1_id LEFT OUTER JOIN t3 AS t3b ON t2b.id = t3b.t2_id WHERE t1.id = t1b.id AND t3b.a IS NOT NULL) = 0
UNION
SELECT [name], [a], [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NOT NULL
ORDER BY t1.name
临时表格:

CREATE TABLE #tmp_Rslt([name] varchar(50), [a] varchar(50), [bob] varchar(50))

--select matches
INSERT INTO #tmp_Rslt
SELECT [name], [a], [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NOT NULL
ORDER BY t1.name

--select t1's that didn't have matches
INSERT INTO #tmp_Rslt
SELECT [name], NULL AS [a], NULL AS  [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NULL
AND t1.[name] NOT IN (SELECT DISTINCT [name] FROM #tmp_Rslt)

SELECT *
FROM #tmp_Rslt

--cleanup.
DROP TABLE #tmp_Rslt

这应该在MySQL中工作

SELECT * FROM T1
LEFT JOIN (T2
 INNER JOIN T3 ON T2.id=T3.t2_id
) ON T1.id= T2.t1_id

抱歉,但是不,这不会强制t2和t3只有在它们都有数据时才连接。有些人忘记了我们不是心灵感应的:(@Italy Maov-编辑了我的答案。我也正试图在这里帮助你。你不必否决我。如果你觉得它错了,那么你可以让我知道。如果它没有帮助,你将尝试更正它或删除它。@Sachin Shanbhag-见编辑的问题,我取消了我的否决票(我真的把投票看作是不是个人的东西,只是标记错误的答案,对不起,如果我冒犯了你)。这个答案正是我需要的……为简单的答案而投票,从来没有改变和使用正确的连接,所以你想排除行[a]不是null和[Bob ]吗?是空的吗?@Lynette Duffy-不…。这是一个类似AND语句的语句。要么我得到[A]和[bob],要么我得不到(空的,空的)。我不想在没有[bob]的情况下得到[A],反之亦然。
CREATE TABLE #tmp_Rslt([name] varchar(50), [a] varchar(50), [bob] varchar(50))

--select matches
INSERT INTO #tmp_Rslt
SELECT [name], [a], [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NOT NULL
ORDER BY t1.name

--select t1's that didn't have matches
INSERT INTO #tmp_Rslt
SELECT [name], NULL AS [a], NULL AS  [bob]
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NULL
AND t1.[name] NOT IN (SELECT DISTINCT [name] FROM #tmp_Rslt)

SELECT *
FROM #tmp_Rslt

--cleanup.
DROP TABLE #tmp_Rslt
SELECT * FROM T1
LEFT JOIN (T2
 INNER JOIN T3 ON T2.id=T3.t2_id
) ON T1.id= T2.t1_id