2015-05-21 3 views
0

У меня есть этот запрос в SQL Server:Invalid ошибка столбца в SQL Server

SELECT 
    cr.formno, cr.controlid as formid, 
    min(cr.series) as formstartseries, 
    max(cr.series) as formendseries, 
    (SELECT currentseries 
    FROM af_inventory 
    WHERE objid=cr.controlid) AS afi_currentseries, 
    (SELECT currentseries 
    FROM af_control 
    WHERE objid=cr.controlid) AS afc_currentseries 
FROM cashreceipt cr 
WHERE cr.collector_objid='USR409c49cc:1488078ce62:-7958' 
    AND cr.objid NOT IN (SELECT objid 
         FROM remittance_cashreceipt 
         WHERE objid=cr.objid) 
GROUP BY cr.formno, cr.controlid 
HAVING formstartseries <> afi_currentseries 

После выполнения этого запроса, он выдает ошибку:

Invalid column name formstartseries , afi_currentseries

Что случилось?

+0

и не может использовать псевдоним столбца внутри groupby или – Sachu

ответ

1

Вы не можете использовать имена столбцов ALIASed в предложении HAVING. Попробуйте следующее:

SELECT 
    cr.formno, 
    cr.controlid AS formid, 
    MIN(cr.series) AS formstartseries, 
    MAX(cr.series) AS formendseries, 
    (
    SELECT 
     currentseries 
    FROM 
     af_inventory 
    WHERE 
     objid = cr.controlid 
) AS afi_currentseries, 
    (
    SELECT 
     currentseries 
    FROM 
     af_control 
    WHERE 
     objid = cr.controlid 
) AS afc_currentseries 
FROM 
    cashreceipt cr 
WHERE 
    cr.collector_objid = 'USR409c49cc:1488078ce62:-7958' 
    AND cr.objid NOT IN (SELECT 
          objid 
         FROM 
          remittance_cashreceipt 
         WHERE 
          objid = cr.objid) 
GROUP BY 
    cr.formno, 
    cr.controlid 
HAVING 
    MIN(cr.series) 
<> 
(SELECT currentseries 
FROM af_inventory 
WHERE objid=cr.controlid) 
+0

Вы используете неправильный подвыбор в своем предложении. – NickyvV

+0

OMG! Твое право. Я исправил это. Я надеюсь. – JohnS

+0

Вы ничего не изменили в подвыборке, а ОП также отметили это как ответ? – NickyvV

1

вы не можете использовать псевдоним столбца в GroupBy и Having попробовать ниже

select 
cr.formno, 
formid, 
formstartseries, 
formendseries, 
afi_currentseries, 
afc_currentseries 
from 
(select 
cr.formno, cr.controlid as formid, 
min(cr.series) as formstartseries, 
max(cr.series) as formendseries, 
(select currentseries from af_inventory where objid=cr.controlid) as afi_currentseries, 
(select currentseries from af_control where objid=cr.controlid) as afc_currentseries 
from cashreceipt cr 
where cr.collector_objid='USR409c49cc:1488078ce62:-7958' 
and cr.objid not in (select objid from remittance_cashreceipt where objid=cr.objid))as T 
group by cr.formno, formid, 
having formstartseries <> afi_currentseries 
2

Псевдоним назначается в SELECT не может быть использовано в предложении HAVING, поскольку SELECT фаза выполняется позже , посмотрите на Logical Query Processing. Вы можете использовать cte и затем включить WHERE пункт вроде этого:

WITH cte 
AS (
    SELECT cr.formno 
     ,cr.controlid AS formid 
     ,min(cr.series) AS formstartseries 
     ,max(cr.series) AS formendseries 
     ,(
      SELECT currentseries 
      FROM af_inventory 
      WHERE objid = cr.controlid 
      ) AS afi_currentseries 
     ,(
      SELECT currentseries 
      FROM af_control 
      WHERE objid = cr.controlid 
      ) AS afc_currentseries 
    FROM cashreceipt cr 
    WHERE cr.collector_objid = 'USR409c49cc:1488078ce62:-7958' 
     AND cr.objid NOT IN (
      SELECT objid 
      FROM remittance_cashreceipt 
      WHERE objid = cr.objid 
      ) 
    GROUP BY cr.formno 
     ,cr.controlid 
    ) 
SELECT * 
FROM cte 
WHERE formstartseries <> afi_currentseries 
1

Просто измените свой последний код:

... 
HAVING formstartseries <> afi_currentseries 

этой

... 
HAVING min(cr.series) <> (SELECT currentseries 
          FROM af_inventory 
          WHERE objid=cr.controlid) 
Смежные вопросы