SQL左连接返回多个条件的空条目

时间:2017-02-20 08:50:25

标签: sql-server

我有两张桌子。一个叫做tbl_id,一个叫做tbl_values。

tbl_id如下:

property_id | Name  
1           | Height   
2           | Depth  
3           | Length  
4           | Weight

tbl_values如下:

property_id | submission_ID | Value  
2           | 100           | 123.5  
3           | 100           | 22.4  
1           | 200           | 548.0  
3           | 200           | 34.2  
4           | 200           | 17.9

我想要的输出是:

submission_ID | Name   | Value  
100           | Height | NULL  
100           | Depth  | 123.5  
100           | Length | 22.4  
100           | Weight | NULL  
200           | Height | 548.0  
200           | Depth  | NULL  
200           | Length | 34.2  
200           | Weight | 17.9

我到目前为止的SQL是这样的:

SELECT t2.submission_ID, t1.Name, t2.Value  
FROM tbl_id t1  
LEFT JOIN tbl_values t2 ON t2.property_id = t1.property_id AND submission_ID IN (100,200)  
ORDER BY t2.submission_ID

此SQL在SQL Server 2014中运行,为每个submission_ID分别返回我想要的值,但不返回NULL。有没有办法做到这一点?提前谢谢。

1 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT t2.submission_ID,
       t1.Name,
       t3.Value
FROM tbl_id t1
CROSS JOIN
(
    SELECT DISTINCT submission_ID
    FROM tbl_values
) t2
LEFT JOIN tbl_values t3
    ON t1.property_id   = t3.property_id AND
       t2.submission_id = t3.submission_id
ORDER BY t2.submission_ID,
         t1.property_id

我已经在Postgres本地测试了这个查询(我没有SQL Server),它似乎正在运行。这里的技巧是第一个连接,它生成提交ID和名称之间的每个组合。然后,我们进行第二次连接以引入匹配的实际值。