我有两张桌子。一个叫做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。有没有办法做到这一点?提前谢谢。
答案 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和名称之间的每个组合。然后,我们进行第二次连接以引入匹配的实际值。