你能在SQL SELECT语句中使用表作为列吗?

时间:2018-05-28 02:55:21

标签: sql oracle subquery

我正在处理来自其他人的代码并看到我不理解的Oracle SQL的一些用法:

  SELECT
    column1, column2,
    (
      SELECT columnA
      FROM tableA
      JOIN tableB ON tableA.table_b_fk = tableB.my_pk
      FETCH FIRST 1 ROWS ONLY
    ) AS column3
  FROM tableC
  ...

我无法理解他们为什么使用这个:

(
  SELECT columnA
  FROM tableA
  JOIN tableB ON tableA.table_b_fk = tableB.my_pk
  FETCH FIRST 1 ROWS ONLY
) AS column3

他们只是用一个表作为列吗?我以为你只能用列?

你能真的这样做吗?它是如何工作的?

我不知道在哪里可以找到这种用法的解释,所以我在这里问。

如果有任何误解,请纠正我!

1 个答案:

答案 0 :(得分:3)

首先,我不相信您提供的代码确实有效:

SELECT
    column1, column2,
    (
      SELECT columnA, columnB
      FROM tableA
      JOIN tableB ON tableA.table_b_fk = tableB.my_pk
      FETCH FIRST 1 ROWS ONLY
    ) AS column3
FROM tableC

它基本上与:

相同
SELECT 1 AS c
   , (SELECT 'a', 'b' FROM dual)
FROM dual
-- and will yield
-- ORA-00913: too many values

您看到的构造是SELECT列表中的标量子查询(它本身不是表格)。它必须返回一行和一个值(因此你有FETCH FIRST 1 ROWS ONLY)。

SELECT 1 AS c
   , (SELECT 'a' FROM dual)  -- one column and one value subquery
FROM dual

如果要在外部查询中每行返回多个列,可以使用CROSS/OUTER APPLY

SELECT column1, column2, s.*
FROM tableC
OUTER APPLY (SELECT columnA, columnB
             FROM tableA
             JOIN tableB ON tableA.table_b_fk = tableB.my_pk
             FETCH FIRST 1 ROWS ONLY) s

为了使事情正确,它应该是相关的子查询。更多信息: