【问题标题】:Use Inner Select value in Where Clause在 Where 子句中使用内部选择值
【发布时间】:2014-10-13 15:30:54
【问题描述】:

我有一个 SQL 查询,我试图在外部 where 子句中使用 subs 选择 value。

SELECT   count(A.[processID]) AS total,
         B.[process] AS processName,
         (SELECT   TOP 1 LocationDesc
          FROM     dbo.EmployeeTable_Historical AS D
          WHERE    C.leaver = D.QID
          ORDER BY meta_logDate DESC)
FROM     dbo.attritionDataPrevention AS A
         INNER JOIN
         attritionProcesses AS B
         ON A.[processID] = B.[processID]
         INNER JOIN
         dbo.attritionData AS C
         ON A.[recordID] = C.recordID
WHERE    D.[locationDesc] IN (SELECT location
                              FROM   @table)
         AND YEAR(C.[leaveDate]) = @year
GROUP BY B.[processID]
ORDER BY total DESC
FOR      XML PATH ('type'), TYPE, ELEMENTS, ROOT ('root');

在我的主要WHERE 子句中,它说它不能绑定WHERE D.[locationDesc]。 S 别名在子查询中,所以我不太确定如何使用它的值。

更新

根据建议,我将代码更改为以下内容:

SELECT   count(A.[processID]) AS total,
                         B.[process] AS processName
FROM     dbo.attritionDataPrevention AS A
         INNER JOIN
         attritionProcesses AS B
         ON A.[processID] = B.[processID]
         INNER JOIN 
         dbo.attritionData AS C
         ON A.recordID = C.recordID,
         (
             SELECT TOP 1 D.LocationDesc
             FROM dbo.EmployeeTable_Historical AS D
             WHERE C.leaver = D.QID
             ORDER BY D.[meta_logDate] DESC
         ) AS D
WHERE    D.locationDesc IN (SELECT location FROM @table)
         AND YEAR(C.[leaveDate]) = @year
GROUP BY B.[process]
ORDER BY total DESC
FOR      XML PATH ('type'), TYPE, ELEMENTS, ROOT ('root');

现在唯一的问题是WHERE C.leaver 不会绑定到内部连接。

【问题讨论】:

  • 将子选择语句放在查询的选择部分通常表示查询格式不正确。将该子选择向下移动到您的 from 语句中并为其命名,然后您可以访问其字段。
  • @paqogomez 当我这样做时,我无法再访问 FROM 语句的子选择中的 C.leaver - 不知道为什么
  • 您的编辑与我建议的不太一样,这将导致笛卡尔积。为什么在子选择中需要它?需要前1名的结果是什么?
  • 历史表包含用户任何时候数据变化的多条记录。我订购的是 DESC 以获取他们最近/当前的更改,并且由于每个用户可以有多个记录,我需要 1 个结果
  • 而不仅仅是添加, 尝试inner join (subselect) d on d.QID = C.leaver

标签: sql sql-server tsql stored-procedures sqlxml


【解决方案1】:

试试这个:

SELECT   count(A.[processID]) Over (Partition by B.[processID]) AS total,
         B.[process] AS processName,
         (SELECT   TOP 1 LocationDesc
          FROM     dbo.EmployeeTable_Historical AS D
          WHERE    C.leaver = D.QID
          AND D.[locationDesc] IN (SELECT location FROM @table)
          ORDER BY meta_logDate DESC)
FROM     dbo.attritionDataPrevention AS A
         INNER JOIN
         attritionProcesses AS B
         ON A.[processID] = B.[processID]
         INNER JOIN
         dbo.attritionData AS C
         ON A.[recordID] = C.recordID
WHERE    YEAR(C.[leaveDate]) = @year
ORDER BY total DESC
FOR      XML PATH ('type'), TYPE, ELEMENTS, ROOT ('root');

【讨论】:

  • 唯一的问题是我不想按leaver 分组,但它现在迫使我在选择语句中。
  • 我对我的答案进行了一些编辑,如果您不想对 Select 语句中使用的任何其他列进行分组,您可以使用 partition by 子句。另外请检查是否需要按 ProcessID 分组,同时要计算 ProcessIds 。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多