2017-02-20 54 views
2

我有两个表。一个叫做tbl_id,另一个叫做tbl_values。SQL左连接为多个条件返回空条目

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

尝试此查询:

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服务器),它似乎是工作。这里的诀窍是第一次连接,它会生成提交ID和名称之间的每个组合。然后,我们进行第二次连接,以获得匹配的实际值。

+0

太棒了!谢谢蒂姆!这像一个魅力。 – sonarclick

+0

我upvoted,但我需要15分,它被记录。我只有13.对不起... – sonarclick

+0

不知道。刚刚做到了。 – sonarclick