【问题标题】:sql query: column by id multiple timessql查询:多次按id列
【发布时间】:2018-02-01 13:55:45
【问题描述】:

这里是 SQL 新手。 我在创建选择语句时遇到了麻烦。

我有一张表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   |

我想在三列中的每一列(表 RES)中接收 REF.v 的值; id 是不同的,两者之间没有重叠。

+-----+-----+-----+
| RES |     |     |
+-----+-----+-----+
| ID1 | ID2 | ID3 |
| 10  | 20  |     |
|     | 30  | 40  |
| 50  |     |     |
| 60  |     | 70  |
+-----+-----+-----+

【问题讨论】:

标签: sql postgresql select multiple-columns


【解决方案1】:

您可以查询您的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 JOINsSUBQUERIES

我在 Postgres 9.6 引擎下尝试过 Sql Fiddle。

时间相同,但关于 LEFT OUTER JOIN 的执行计划更复杂

你可以看到SqlFiddle SUBQUERIESSqlFiddle LEFT OUTER JOINs

【讨论】:

  • 这样的子查询不是比联接效率低吗?
  • 左连接很昂贵。试试看
  • @JoeTaras 来自小提琴 - Left Outer Join:记录数:4;执行时间:19ms 子查询:记录数:4;执行时间:35ms - 您的查询需要额外的 14ms,几乎是这个小数据集上时间的两倍。
  • @Andrew 我想这是净流量。我已经测试过,结果是一样的。检查 Depesz 上的执行计划
  • @JoeTaras 不,你是对的,连接上的计划更复杂,但如果步骤成本较低,则更复杂的计划可以更有效地执行。无论哪种方式,我们的答案都有效。
【解决方案2】:
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

您使用左外连接连接引用表 3 次,这使引用表与 IND 表不匹配,从而导致您缺少 ID 的地方出现空值。然后从每个连接表中选择 v 值,确保为其设置别名,以便将它们区分开来。

【讨论】:

  • 亲爱的,我已经用 Sqlfiddle 测试更新了我的答案,供您和我的查询使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多