Есть ли синтаксис «НЕ ИМЕЕТ», например «ГДЕ ХХХ НЕ В»? - PullRequest
4 голосов
/ 09 марта 2011
  1. У меня есть несколько запросов, чтобы получить номера ID строк, которые будут удалены в будущем.
  2. Номера строк помещаются в строку и помещаются в запрос ниже (где вы видите "2 ").
  3. Я хочу, чтобы результаты игнорировали строки (как если бы они были уже удалены).

    SELECT MAX(T1.id) AS MAXid
    FROM transactions AS T1 
    WHERE id NOT IN ( 2 ) 
    GROUP BY T1.position 
    ORDER BY T1.position
    

Я предполагаю, чтоМне нужно заменить строку «WHERE» на «HAVING», но я не могу найти синтаксис «NOT HAVING».

Способ, которым этот запрос в настоящее время написан, не будет возвращать строку для T1.position, еслиМаксимальный идентификатор для позиции указан в предложении WHERE.

Как мне получить этот запрос, чтобы дать мне максимальный идентификатор для позиции T1., пропуская строки с идентификаторами, перечисленными в предложении WHERE?

Ответы [ 4 ]

4 голосов
/ 09 марта 2011

HAVING id NOT IN (2) должно работать; [NOT] IN не ограничивается WHERE пунктами.

3 голосов
/ 09 марта 2011

HAVING - это не то, что вам нужно - это полезно, только если вы хотите фильтровать по MAX. Например, если вы не хотите получать все MAXids, а только те, которые больше 2, вы можете использовать HAVING MAXid> 2.

Насколько я понимаю, вы хотите игнорировать некоторые строки и рассчитать MAXid оставшихся строк. Для этого ваше утверждение выглядит правильно для меня. Если позиция не указана в наборе результатов, если все ее идентификаторы указаны в предложении NOT IN. Это разумно, так как ничего не осталось, вы могли бы рассчитать МАКС. Если некоторые из идентификаторов позиции указаны в NOT IN, а другие , а не , вы должны получить МАКС из тех, которые не перечислены в NOT IN.

Если ваш набор результатов не соответствует этим объяснениям, вам следует отладить строку, вставленную в NOT IN, - возможно, она случайно содержит слишком много идентификаторов.

1 голос
/ 09 марта 2011

Допустимый синтаксис для HAVING такой:

SELECT MAX(T1.id) AS MAXid
FROM transactions AS T1 
GROUP BY T1.position 
HAVING MAX(T1.id) NOT IN ( 2 ) 
ORDER BY T1.position
0 голосов
/ 09 марта 2011

ты пробовал с

SELECT MAX(t1.id) AS MAXid 
FROM transactions t1 
WHERE id  <> ANY (2) 
GROUP BY t1.position ORDER BY t1.position
...