我正在尝试在像
这样的键上加入2个表datetime
现在,我有一个第三个表,它有一个外键,我想加入t2的id ...当我这样做时
SELECT column1,column2
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.t2id = t2.id
我不知道我是否应该LEFT JOIN
Table3 t3 ON t3.t2id = --<-------------- This is where I'm lost
或ON t3.t2id = t1.t2id
我需要的是第一次加入后仍然在图片中的t2ids列表。但是,似乎如果我指定上述任何一个,它只会在第一次连接之前从原始表中拉出id?
再澄清一次:我正在尝试基本上执行Table1和Table2的ON t3.t2id = t2.id
,得到结果表,然后获取这些结果的t2ids并将它们输入到最终连接中以便最终result包含Table3的所有行以及第一次连接的数据
答案 0 :(得分:2)
你说:“最终结果包含Table3的所有行以及第一次加入的数据”。
这意味着你需要
Table3 LEFT JOIN <previous results>
而不是
<previous results> LEFT JOIN Table3
编写它的最简单方法是使用公用表表达式:
WITH
CTE_InnerJoin
AS
(
SELECT column1, column2, t1.t2id
FROM
Table1 t1
INNER JOIN Table2 t2 ON t1.t2id = t2.id
)
SELECT
CTE_InnerJoin.column1
,CTE_InnerJoin.column2
,Table3....
FROM
Table3
LEFT JOIN CTE_InnerJoin ON CTE_InnerJoin.t2id = Table3.t2id
;
您在CTE中包含的列无关紧要:t1.t2id
或t2.id
,其中的值是相同的,因为它们是内部连接在一起的。
答案 1 :(得分:2)
JOIN已经完全按照您的意愿行事。 JOIN
始终不在两个表之间。通常,它位于之前连接的结果之间。
SELECT column1,column2
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.t2id = t2.id
LEFT JOIN
Table3 t3 ON t3.t2id = t2.id
在您在此处撰写最终ON
子句时,您要加入的内容正好左侧上一个INNER JOIN
的结果右边的表Table3
。所有t1
,t2
和t3
都在ON
子句的范围内,但请注意,t1
和t2
现在都用作别名为同一行 - 前一个INNER JOIN
。
作为另一个例子,考虑“钻石加入”:
SELECT
*
FROM
t1
left join
t2
on
t1.a = t2.b
left join
t3
on
t1.c = t3.d
inner join
t4
on
t2.e = t4.f OR
t3.g = t4.h
这是一种基于两个替代连接来连接两个表(t1
和t4
)的方法。请注意,在最后的inner join
中,“左”的内容是已加入表t1
,t2
和t3
的结果。
答案 2 :(得分:0)
加入具有外键的表
试试这个......
SELECT column1,column2
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.t2id = t2.id
LEFT join Table3 t3 ON t2.id=t3.t2id
答案 3 :(得分:0)
或者像这样。
SELECT t12.column1 ,
t12.column2 ,
t3.*
FROM (
--- INNER JOIN of Table1 and Table2, get the resulting table,
SELECT t1.column1 ,
t2.column2 ,
t1.t2id --- or t2.id doesn't matter because its inner join
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.t2id = t2.id
) T12
LEFT JOIN Table3 T3 ON t3.t2id = t1.t2id --- then get the t2ids of those results
--- and feed them into a final join
--- if you want to get all rows from Table3, Change LEFT JOIN Table3 T3 ON t3.t2id = T1.t2id
--- into RIGHT JOIN Table3 T3 ON t3.t2id = T1.t2id
答案 4 :(得分:0)
如果您希望表3中的所有行和table1内部的匹配行连接到table2,那么您可以使用以下语法:
select t3.*,
column1, column2
from table3 t3
left join table2 t2
inner join table1 t1
on t1.t2id = t2.id
on t3.t2id = t2.id
答案 5 :(得分:0)
试试这个
select t3.*, column1, column2
from
table1 t1 inner join table2 t2 on t1.t2id = t2.id
right outer join table3 t3 on t3.t2id = t2.id
等于
select t3.*, column1, column2
from
table1 t1 inner join table2 t2 on t1.t2id = t2.id
right outer join table3 t3 on t3.t2id = t1.t2id