我正在处理来自其他人的代码并看到我不理解的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
他们只是用一个表作为列吗?我以为你只能用列?
你能真的这样做吗?它是如何工作的?我不知道在哪里可以找到这种用法的解释,所以我在这里问。
如果有任何误解,请纠正我!
答案 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
为了使事情正确,它应该是相关的子查询。更多信息: