SQL newb在这里。 我在创建select语句时遇到了麻烦。
我有一个表REF
,其中包含id和值v;
+-----+----+
| REF | |
+-----+----+
| ID | V |
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
+-----+----+
在第二个表IND
中,我有三列id值;
+-----+-----+-----+
|IND | | |
|-----|-----|-----|
| ID1 | ID2 | ID3 |
| 1 | 2 | |
| | 3 | 4 |
| 5 | | |
| 6 | | 7 |
我想在三列中的每一列中收到REF.v accordinlgly的值(表格RES); ids是截然不同的,两者之间没有重叠。
+-----+-----+-----+
| RES | | |
+-----+-----+-----+
| ID1 | ID2 | ID3 |
| 10 | 20 | |
| | 30 | 40 |
| 50 | | |
| 60 | | 70 |
+-----+-----+-----+
答案 0 :(得分:3)
您可以使用三个子查询查询IND
表,以检索链接到已使用ID的值
试试这个:
SELECT
(SELECT V FROM REF WHERE REF.ID = IND.ID1) AS V_ID1,
(SELECT V FROM REF WHERE REF.ID = IND.ID2) AS V_ID2,
(SELECT V FROM REF WHERE REF.ID = IND.ID3) AS V_ID3
FROM IND
<强>更新强>
关于两个建议的解决方案(LEFT OUTER JOINs
Vs SUBQUERIES
)
我在Postgres 9.6引擎下尝试过Sql Fiddle。
时间相同,但关于LEFT OUTER JOIN的执行计划更复杂
答案 1 :(得分:1)
SELECT ref1.V AS RefV1, ref2.V AS RefV2, ref3.V AS RefV3
FROM IND i
LEFT OUTER JOIN ref ref1
ON ref1.ID = i.ID1
LEFT OUTER JOIN ref ref2
ON ref2.ID = i.ID2
LEFT OUTER JOIN ref ref3
ON ref3.ID = i.ID3
使用左外连接连接引用表三次,这使得引用表与IND表不匹配,从而导致缺少ID的空值。然后从每个连接的表中选择v值,确保对其进行别名,这样就可以区分它们。