2013-02-08 5 views
2

У меня есть запрос, как:COUNT() по результатам Кроме

SELECT 
    id 
FROM 
    table1 
INNER JOIN 
    ... 
WHERE 
    ... 
    AND eventtype IN (2000120, 2000121, 2000122, 2000123, 2000130) 

EXCEPT 

SELECT 
    id 
FROM 
    table1 
INNER JOIN 
    ... 
WHERE 
    ... 
    AND eventtype IN (2000123,2000130,2000134,2000135) 

Обратите внимание, что запросы и идентичны, за исключением последнего где-п.

Теперь я хотел бы подсчитать количество записей, возвращаемых этим выше запросом.

Как сделать заказ?

Большое спасибо

+0

В запросах отличается только предикат? –

+0

Извините, я не понимаю. Как вы это понимаете? – Atmocreations

+0

Вам также нужно получить результирующий набор? – rkrdo

ответ

4

использование COUNT и обернуть его внутри SUBQUERY

SELECT COUNT(ID) 
FROM (
     SELECT id 
     FROM table1 
     INNER JOIN... 
     WHERE... 
       AND eventtype IN (2000120, 2000121, 2000122, 2000123, 2000130) 
     EXCEPT 
     SELECT id 
     FROM table1 
     INNER JOIN... 
     WHERE... 
       AND eventtype IN (2000123, 2000130, 2000134, 2000135) 
     ) s 
+1

Спасибо за ваш очень быстрый ответ. Это работает ... Один результирующий вопрос: поскольку оба sub-SELECT являются точно такими же (кроме события), может ли оптимизировать запрос? Кроме того, у меня есть, например, предложение WHERE ('eventtime BETWEEN '2013-02-08 00:00:00' AND '2013-02-08 23: 59: 59'') в обоих запросах – Atmocreations

+0

, что вы приветствуете': D' –

0

Также вы можете использовать EXISTS с INTERSECT подзапроса

SELECT COUNT(ID) 
FROM table1 t1 INNER JOIN ... 
WHERE ... AND eventtype IN (2000120, 2000121, 2000122, 2000123, 2000130) 
AND NOT EXISTS (
SELECT 1 
FROM table1 t2 INNER JOIN ... 
WHERE ... AND eventtype IN (2000123, 2000130, 2000134, 2000135) 
AND EXISTS (SELECT t1.ID 
      INTERSECT 
      SELECT t2.ID)) 
1

вам просто нужен первый запрос для того, что вы хотите, вам не нужно включать значение 2000130, если оно вам не нужно, и поэтому другие значения, которые вы не хотите показывать в запросе ,

SELECT 
    id 
FROM 
    table1 
INNER JOIN 
    ... 
WHERE 
    ... 
    AND eventtype IN (2000120, 2000121, 2000122, 2000123) 

Если вам необходимо исключить некоторые значения из некоторого запроса можно использовать

AND eventtype NOT IN (2000130) 

но не оба сразу. И считать только регулярное использование SELECT COUNT(id) или подзапрос, если хотите.

+0

Хорошая попытка. Но это действительно не работает, потому что запрос более сложный. Фактически, «id» сводится к одному значению DISTINCT, в то время как больше значений будет существовать. С вашим вариантом я исключаю ценности, которых нет в любом случае. Мне нужно сделать это так. – Atmocreations

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