【问题标题】:Select result of subquery in CTE在 CTE 中选择子查询的结果
【发布时间】:2016-01-22 00:31:42
【问题描述】:

我正在使用其中包含子查询的 CTE。然后我尝试从 CTE 中的子查询结果中进行选择,但我收到了 Invalid Column Name 错误。

查询:

DECLARE @User AS VARCHAR(50)
SET @User = 'test.user'

WITH cte AS (
SELECT 
    o.db_OrderNo,
    o.db_Deferral
FROM
    tblOrders o
    LEFT JOIN tblUserProfile up on up.db_UserId = o.db_RTS
WHERE
    o.db_Deleted = 0
    AND (select OrderBucketId from Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) as Task) IN (1, 2, 3, 4)
    AND up.db_Email LIKE @User + '%'
)
SELECT COUNT(DISTINCT (CASE WHEN Task = 1 AND db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderInEvalCount,
   COUNT(DISTINCT (CASE WHEN Task = 2 AND db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderInDfcCount,
   COUNT(DISTINCT (CASE WHEN Task IN (3, 4) AND (select OrderStepId from Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo)) NOT IN (37, 39) AND
                             db_Deferral = 0 THEN db_OrderNo
                   END)) as OrderWipCount,
   COUNT(DISTINCT (CASE WHEN db_Deferral <> 0 THEN db_OrderNo
                   END)) as OrderInPendedCount
FROM cte;

它没有将Task 识别为列。不太习惯做子查询,所以格式可能是错误的。不确定临时表是否可以在这里提供帮助。任何帮助将不胜感激。

【问题讨论】:

  • 在你的 CTE 中唯一算作列的是它的主要 select 语句中的东西;所以,db_OrderNodb_Deferral。如果您想在 CTE 之外使用 Task 进行操作,则必须将其包含在这些列中。
  • 这部分子查询好像没什么意义!... AND (select OrderBucketId from Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) as Task) IN (1, 2, 3, 4)
  • 我建议删除那个 AND 子句,然后尝试运行查询,然后找出该部分应该做什么,

标签: sql sql-server sql-server-2008 subquery common-table-expression


【解决方案1】:

您的子查询位于WHERE 子句中。列仅来自 FROM 子句。您可以通过多种方式处理此问题。如果您知道子查询不返回重复项,则使用CROSS APPLY 将逻辑移至FROM 子句:

WITH cte AS (
      SELECT o.db_OrderNo, o.db_Deferral
      FROM tblOrders o LEFT JOIN
           tblUserProfile
           up on up.db_UserId = o.db_RTS CROSS APPLY
           Main.udfGetOrderStatusStepInfoByOrderNo(o.db_OrderNo) t
      WHERE o.db_Deleted = 0 AND
            t.OrderBucketId  IN (1, 2, 3, 4) AND
            up.db_Email LIKE @User + '%'
     )

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多