【发布时间】: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