【问题标题】:Selecting multiple columns from a subquery从子查询中选择多个列
【发布时间】:2012-05-14 06:50:35
【问题描述】:

我搜索了很多,但仍然没有机会让子查询一次返回多个列。以下代码有效,但很糟糕:

SELECT
    (SELECT Column1 FROM dbo.fnGetItemPath(ib.Id)) AS Col1,
    (SELECT Column2 FROM dbo.fnGetItemPath(ib.Id)) AS Col2,
    (SELECT Column3 FROM dbo.fnGetItemPath(ib.Id)) AS Col3
FROM ItemBase ib

我实际上不知道如何将 ib.Id 传递给函数并在不调用 fnGetItemPath 函数 3 次的情况下获取整个 Column1、Column2、Column3 列。

提前致谢

【问题讨论】:

  • 你能贴出函数的代码吗?如果它是一个表值函数,那么它应该可以工作,
  • 是的,它是一个表值函数。但是上面的 SQL 代码确实效率不高,因为它必须分别运行 3 次不同的函数,这是没有用的。我需要一种机制来运行一次函数以一次获取三列。有什么想法吗?
  • 如果它是一个表值函数,那么你不必像上面那样做,你可以 SELECT * FROM dbo.fnGetItemPath(ib.Id))
  • 另外,它看起来不是运行代码 3 次,而是每个 ID 运行 3 次。你不能写 fnGetItemPath() 来输出完整的解决方案吗?即去掉 WHERE id = 函数的一部分...

标签: sql-server-2008 tsql subquery


【解决方案1】:

您可以将 ti 移动到“FROM”部分并使用outer apply(或交叉应用)。

自己检查语法,但它应该看起来像这样:

SELECT Column1, Column2, Column3
FROM ItemBase ib
Outer Apply dbo.fnGetItemPath(ib.Id)

【讨论】:

    【解决方案2】:

    这不行吗?

    select 
         (select column1, column2, column3 from dbo.fnGetItemPath(ib.Id)) 
    from ItemBase ib
    

    或者你需要别的东西吗?

    【讨论】:

    • 不,它没有。它失败了,因为“当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多