2014-10-13 3 views
0

У меня есть SQL-запрос, в котором я пытаюсь использовать subslect value во внешнем where.Использовать внутреннее значение выбора в разделе Where

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 статьи, он говорит, что не может BIND WHERE D.[locationDesc]. Алиас S находится в подчиненном запросе, поэтому я не слишком уверен, как использовать его значение.

UPDATE

За предложение, я изменил код на следующее:

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 обыкновение привязывать к внутреннему соединению.

+1

Ввод подвыбора заявления в выбранной части запроса, как правило, признак плохо сформированный запрос. Переместите этот подзапрос вниз в свой оператор from и его псевдоним, затем вы можете получить доступ к его полям. – paqogomez

+0

@paqogomez, когда я это сделал, я больше не могу получить доступ к C.leaver, который находится в sub select в 'FROM', - не знаю, почему – SBB

+0

. Ваше редактирование не совсем то, что я предложил, это приведет к декартовому продукту. Зачем вам это нужно в подзапросе? Что это за результат, который требует верх 1? – paqogomez

ответ

0

Попробуйте это:

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'); 
+0

Единственное, с этим я не хочу группировать 'leaver', но это заставляет меня теперь, чтобы это было в select select. – SBB

+0

Я внесла некоторые изменения в свой ответ, вы можете использовать предложение partition by, если вы не хотите группировать ни один другой столбец, используемый в инструкции Select. Также проверьте, требуется ли вам группировать по ProcessID, в то время как вы хотите подсчитать ProcessIds. – Sagar

Смежные вопросы