【问题标题】:Can you use a table as a column in SQL SELECT statement?您可以在 SQL SELECT 语句中将表用作列吗?
【发布时间】:2018-05-28 02:55:21
【问题描述】:

我正在使用其他人的代码,并且看到了一些我不理解的 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

他们只是将表格用作列吗?我以为你只能使用列?

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

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

如有误会请指正!

【问题讨论】:

  • 你确定它是 columnA , columnB 而不是 columnA || columnB?
  • 只有a列,我在问题代码中写错了。我已经修改并修复了错误
  • 这称为标量子查询,在SQL语句中比较常见。

标签: sql oracle subquery


【解决方案1】:

首先我不相信你提供的代码真的有效:

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

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

【讨论】:

  • 只有a列,我在问题代码中写错了。我已经修改并修复了错误
  • @HenryYang 所以正如我所写的,它不是表,而是标量子查询表达式。
  • 是的,非常感谢您的回答和提供更多信息的 URL!我想我现在明白这个表达的意思了。但是,请您为我澄清以下内容吗?对于第一个 URL,它提到标量子查询表达式不能用作列的默认值,这是否意味着 SELECT 语句中列出的列不是默认值?如果是这种情况,列的默认值是什么?而且,我看到你写了SELECT 1 AS c,这是否意味着你想创建一个包含名为 c 的列的表,并使该表的所有行都有一个值为 1 的 c 列?
  • 最后,我可以假设dual table 是一个只有两个元素的表,而不是包含两个以上元素的两列吗?因为您没有使用FETCH FIRST 1 ROWS ONLY,这意味着如果dual 包含两个以上的元素,您将获得多个元素,并且根据您的回答,这将无法形成标量子查询。
  • 我明白了,谢谢你的额外解释!我现在明白了!
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 2023-01-16
  • 2013-02-20
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多