2014-01-14 2 views
3

У меня возникла проблема с запросом, который я собрал вместе, я объяснил это по http://www.sql-server-helper.com/error-messages/msg-147.aspx (внизу страницы), и я не вижу большой разницы в моем коде к примеру, отличному от добавления в предложение WHERE и Inner Join.WHERE ID = MAX (ID) Получение ошибки Агрегат может не отображаться

Но я все еще получаю следующее сообщение об ошибке:

Msg 147, Level 15, State 1, Line 5
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

Это мой собственный код:

SELECT * 
FROM [dbo].[mail] AS rm 
    INNER JOIN [dbo].[mytbl] AS ec ON [rm].[webref] = [ec].[Webref] 
WHERE rm.[webref] = 'XYZ-594112' 
    AND [[email protected]] = (SELECT MAX([[email protected]]) 
         FROM  [dbo].[mytbl] 
        ) 

Может кто-нибудь пролить свет на то, почему это происходит?

EDIT:

CREATE TABLE [dbo].[mail](
[id] [int] IDENTITY(1,1) NOT NULL, 
[date] [datetime] NULL, 
[webref] [nvarchar](20) NULL 
) ON [PRIMARY] 

Другая таблица на самом деле вид, который состоит из нескольких других таблиц, однако урезанная версия будет:

CREATE TABLE [dbo].[mytbl](
[[email protected]] [varchar](10) NULL, 
[Webref] [varchar](30) NULL) ON [PRIMARY] 

EDIT UPDATE:

Теперь возникает следующая ошибка:

SELECT * 
FROM [FreshSystems].[dbo].[mail] AS rm 
    INNER JOIN [dbo].[mytbl] AS ec ON [rm].[webref] = [ec].[Webref] 
WHERE rm.[webref] = 'XYZ-594112' 
HAVING [[email protected]] = (SELECT MAX([[email protected]]) 
         FROM  [dbo].[mytbl] 
        ) 

Ошибка

Msg 8121, Level 16, State 1, Line 5 
Column '[email protected]' is invalid in the HAVING clause because it is not  contained in either an aggregate function or the GROUP BY clause. 

РАБОЧАЯ:

SELECT * 
FROM [dbo].[mail] AS rm 
LEFT OUTER JOIN [dbo].[mytbl] AS ec ON [rm].[webref] = [ec].[Webref] 
WHERE rm.[webref] = 'XYZ-594112' 
AND [[email protected]] = (SELECT MAX([[email protected]]) 
        FROM  [dbo].[mytbl] 
        WHERE [Webref] = 'XYZ-594112' 
       ) 
+2

Это выглядит как действительный запрос SQL, странно. – Magnus

+0

Не могли бы мы увидеть DDL для двух таблиц? Не удается воспроизвести первые таблицы, которые попали в руки ... – AakashM

+0

Я тоже не могу воспроизвести ... –

ответ

0

РАБОТА КОД:

SELECT * 
FROM [dbo].[mail] AS rm 
LEFT OUTER JOIN [dbo].[mytbl] AS ec ON [rm].[webref] = [ec].[Webref] 
WHERE rm.[webref] = 'XYZ-594112' 
AND [[email protected]] = (SELECT MAX([[email protected]]) 
        FROM  [dbo].[mytbl] 
        WHERE [Webref] = 'XYZ-594112' 
       ) 
1

Я хотел бы использовать что-то вроде этого

select * 
from [dbo].[mail] as rm 
join [dbo].[mytbl] as ec 
on  [rm].[webref] = [ec].[webref] 
join (select max([[email protected]]) y 
      from  [dbo].[mail] 
     ) x 
on  [[email protected]] = x.y 
where rm.[webref] = 'xyz-594112' 
1

Просто порядке [email protected] desc и взять верх 1:

SELECT TOP 1 * WITH TIES 
FROM mail rm 
JOIN mytbl ec ON rm.webref = ec.Webref 
WHERE rm.webref = 'XYZ-594112' 
ORDER BY [email protected] desc 

Кроме того, я удалил все ненужные символы.

+0

Это не та же семантика, что и исходный запрос.Это было бы ближе с 'WITH TIES', но все же не то же самое. Также [исключение схемы не является улучшением] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/bad-habits-to-kick-avoiding-the-schema-prefix.aspx) –

+0

@ MartinSmith Я действительно думал о связях для max, но проигнорировал это, потому что я никогда не использовал его с привязками (но не поклонником MS), но я помню, что видел его - просто не понимал, насколько прост синтаксис, поэтому я рад, что вы побудило меня использовать его. Что касается схемы и общего квадратного кронштейна, не соглашайтесь полностью: это беспорядок ИМХО, и если вы делитесь сервером с другой схемой «один день», я говорю об этом, если это происходит * (если я это делаю) (хотя я смягчил свой комментарий, чтобы удалить мнение от факта) – Bohemian

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