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

Hen*_*ang 5 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
  ...
Run Code Online (Sandbox Code Playgroud)

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

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

他们只是用一张桌子作为专栏吗?我以为你只能用列?

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

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

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

Luk*_*zda 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
Run Code Online (Sandbox Code Playgroud)

它基本上与以下相同:

SELECT 1 AS c
   , (SELECT 'a', 'b' FROM dual)
FROM dual
-- and will yield
-- ORA-00913: too many values
Run Code Online (Sandbox Code Playgroud)

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

SELECT 1 AS c
   , (SELECT 'a' FROM dual)  -- one column and one value subquery
FROM dual
Run Code Online (Sandbox Code Playgroud)

如果您想在外部查询中每行返回多于一列,您可以使用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
Run Code Online (Sandbox Code Playgroud)

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