如何在SQL Server 2017上将一个表与另一个表联接,然后与自身联接?

时间:2019-07-13 15:16:52

标签: sql sql-server join

我有2个表,其中Table1(t1)具有主要数据,Table2(t2)具有数据之间的关系。

我需要一个查询来从条件如

的表(t1)中获取数据
WHERE t1.row = 1 AND t1.code = s1

但是此查询以(t1 left join t2 on t1.row = t2.row开头,然后生成的答案将在t1的t2.trow = t1.row上再次加入。

然后答案必须有一些列和行,这些列和行显示在底部。

您能帮我这个疑问吗?

Table1

Table2

Table Answer

我写了这个查询:

SELECT
    t1.code, t1_1.bed, t1_1.bes, 
    t2.t1row, t2.t2row
FROM 
    dbo.t1
LEFT OUTER JOIN 
    dbo.t2 ON t1.row = t2.t1row
LEFT OUTER JOIN 
    dbo.t1 t1_1 ON t2.t2row = t1_1.row
WHERE 
    t1.code = s1 And t1.row = '1'

但是此查询返回2行,而我需要5行!

3 个答案:

答案 0 :(得分:1)

我不确定为什么要链接回t1,因为只需将t1t2结合即可产生所需的结果。如果您SELECT DISTINCT,那么两个相似的行将被替换为一个

SELECT DISTINCT
    t1.row,
    CASE WHEN trow=1 THEN 'OK' ELSE null END AS t2_row,
    t1.bed, t1.bes, t1.code
FROM
    t1
    LEFT JOIN t2
        ON t1.row = t2.frow
WHERE t1.code='s1'
ORDER BY t1.row;

结果:

row  t2_row   bed     bes  code
1            10000          s1
2     OK             7500   s1
3     OK             2500   s1
4            20000          s1
5                   20000   s1

答案 1 :(得分:0)

在t2.trow列中使用CASE,并使用DISTINCT删除重复项

SELECT DISTINCT row,
    CASE WHEN trow = 1 THEN 'OK'
    ELSE ''
    END as t2_row,
    bed, bes, code
FROM t1
LEFT JOIN t2 ON t1.row = frow 
AND code = 's1'

答案 2 :(得分:0)

我认为这可以满足您的要求:

select t1.*,
       (case when exists (select 1
                          from t2
                          where t2.frow = t1.row and
                                t2.frow <> 1
                         )
             then 'OK'
        end)
from t1
where t1.code = 's1';