2013-05-31 2 views
1

У меня есть проблема с запросом см У меня есть две таблицы, скажу:Oracle сравнить два счетчика() различные таблицы

table a: 
progid  | name | type 
12   | john | b 
12   | anna | c 
13   | sara | b 
13   | ben | c 
14   | alan | b 
15   | george| b 

table b: 
progid  | name | type 
12   | john | b 
12   | anna | c 
13   | sara | b 
14   | alan | b 
15   | george| b 

Таблица А получает кол

progid | count(*) 
12  | 2 
13  | 2 
14  | 1 
15  | 1 

стола б получает

progid | count(*) 
12  | 2 
**13  | 1**<-this is what I want to find different count 
14  | 1 
15  | 1 

Я хочу найти, какая прогида в таблице b не находится в таблице a по счету (потому что, поскольку вы можете видеть прог-идентификатор, есть Я должен быть там в одно и то же время! Так Бен ушел, но ProgID 13 есть)

Так что я хочу, чтобы получить ProgID, где граф изменяется в таблицах, я попробовал:

select a.progid from 
(select progid ,count(*) total from tablea group by progid) a, 
(select progid ,count(*) total from tableb group by progid) b 
where 
a.progid=b.progid and a.total<>b.total; 

Я получаю b.total недопустимый идентификатор

if I use a.count(progid)<>b.count(progid) 

Ошибка говорит, что нельзя использовать функции группы, какие-либо идеи? Я в отчаянии!


нормально я проверил ваши ответы и вот оригинал один

select a.beneficiarioid from 
(select beneficiarioid,count(*) total from lmml_ejercicio_2012_3 where programaid=61 group by beneficiarioid order by beneficiarioid) a, 
(select beneficiarioid,count(*) total from ejercicio_2012_3 where programaid=61 group by beneficiarioid order by beneficiarioid) where 
a.beneficiarioid=b.beneficiarioid and a.total<>b.total; 

в любом случае, я буду попробовать свои querys и пусть вы знаете !! Большое спасибо!! Кстати, это Oracle 11g

+0

Какую версию Oracle вы используете? Ваше заявление отлично работает на Oracle XE –

+0

Я попробовал ваше заявление, и оно работает отлично для меня. Возможно, если бы вы могли разместить настоящие имена ваших таблиц и ваш реальный оператор sql. –

ответ

3

Вы должны быть в состоянии использовать подзапрос, чтобы каждый счет, а затем присоединиться к ним, используя FULL OUTER JOIN:

select coalesce(a.progId, b.progId) progid, 
    coalesce(a.atotal, 0) atotal, 
    coalesce(b.btotal, 0) btotal 
from 
(
    select progid, count(*) aTotal 
    from tablea 
    group by progId 
) a 
full outer join 
(
    select progid, count(*) bTotal 
    from tableb 
    group by progId 
) b 
    on a.progid = b.progid 
where coalesce(a.atotal, 0) <> coalesce(b.btotal, 0); 

SQL Fiddle with Demo См. Я использовал FULL OUTER JOIN, если у вас есть строки в одной таблице, которых нет в другой таблице.

+0

+1: Для очень большого количества уникальных прогид может быть полезно переписать с помощью обычных табличных выражений. –

1

Даже если ваш запрос отлично работает на моей базе данных, я бы предпочел установить операцию:

(select progid ,count(*) total from tablea group by progid) 
minus 
(select progid ,count(*) total from tableb group by progid) 
+0

, но если на таблице были регистры, у которых не было соответствующей прогиды на таблице, это не показало бы ее. Я думаю, что @bluefeet FULL OUTER JOIN будет лучше в этом случае. –

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