如何获取一个JOIN的结果,然后将它们提供给T-SQL中的单独连接?

时间:2017-05-26 05:19:48

标签: sql sql-server tsql join

我正在尝试在像

这样的键上加入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的所有行以及第一次连接的数据

6 个答案:

答案 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.t2idt2.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。所有t1t2t3都在ON子句的范围内,但请注意,t1t2现在都用作别名为同一行 - 前一个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

这是一种基于两个替代连接来连接两个表(t1t4)的方法。请注意,在最后的inner join中,“左”的内容是已加入表t1t2t3的结果。

答案 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