Oracle SQL — соединение и наличие

#sql

#sql

Вопрос:

Я пытаюсь получить учетные записи, которые появляются более одного раза в таблице контрактов, независимо от того, сколько раз они были объединены в таблице c_map.

 CREATE TABLE cntrct (
  cntrct_id VARCHAR(10),
  account_id varchar(10)
);
CREATE TABLE c_map (
  cntrct_id VARCHAR(10)
);


INSERT INTO cntrct VALUES (1,'a');
insert into cntrct values (2,'b');
insert into cntrct values (3,'c');
insert into cntrct values (4,'b');

INSERT INTO c_map VALUES (1);
INSERT INTO c_map VALUES (1);
INSERT INTO c_map VALUES (1);
insert into c_map values (2);
insert into c_map values (2);
insert into c_map values (2);
insert into c_map values (3);
insert into c_map values (3);
insert into c_map values (3);
commit;

select ct.account_id
from cntrct ct, c_map cm
where ct.cntrct_id = cm.cntrct_id
group by ct.account_id
having count(ct.account_id)> 1
 

Скрипка:
http://sqlfiddle.com /#!4/cec1b7/4

Я ожидаю вывода:

  b
 

Но вместо этого я получаю их все. Как я могу ограничить его, чтобы он не учитывал таблицу c_map при запуске having count()> 1?

Спасибо,

Ответ №1:

получите учетные записи, которые появляются более одного раза в таблице контрактов, независимо от того, сколько раз они были объединены в таблице c_map.

Зачем вообще присоединяться? Нужная вам информация находится в таблице контрактов:

 select account_id
from cntrct 
group by account_id
having count(*) > 1
 

Возможно, вы хотите отфильтровать набор данных по идентификатору контракта, который существует в таблице map. Если это так, я бы рекомендовал exists :

 select account_id
from cntrct c
where exists (select 1 from c_map m where m.cntrct_id = c.cntrct_id)
group by account_id
having count(*) > 1
 

Комментарии:

1. потому что это упрощено. Мне нужно принять во внимание условие в таблице c_map, которое здесь не представлено. Концепция та же самая.