#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, которое здесь не представлено. Концепция та же самая.