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)
他们只是用一张桌子作为专栏吗?我以为你只能用列?
你能真的这样做吗?它是如何工作的?
我不知道在哪里可以找到这种用法的解释,所以我在这里问.
如果有任何误解,请纠正我!
首先,我不相信您提供的代码实际上有效:
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)
为了使事情正确,它应该是相关子查询。更多信息:
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |