Как можно объединить 4 таблицы с условием, что данные существуют только в 2 из 3 таблиц - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть 4 таблицы: t1, t2, t3, t4. Мне нужно отобразить t1.event_id, t1.event_name, где t1.event_id существуют только в 2 из 3 таблиц (t2, t3, t4). Я пытаюсь использовать соединение, но все, что я могу сделать, это вернуть event_ids, которые существуют во всех таблицах.

Вот DDL.sql.

CREATE TABLE t1 
(event_id       NUMBER(15) NOT NULL,
event_name       VARCHAR2(80),
CONSTRAINT pk_event PRIMARY KEY (event_id));

CREATE TABLE t2 
(eid       NUMBER(15) NOT NULL,
equipment      VARCHAR2(100),
CONSTRAINT fk_eid2 FOREIGN KEY (eid)
REFERENCES t1 (event_id) ON DELETE CASCADE);

CREATE TABLE t3
(eid        NUMBER(15) NOT NULL,
security       VARCHAR2(100),
CONSTRAINT fk_eid3 FOREIGN KEY (eid)
REFERENCES t1 (event_id) ON DELETE CASCADE);

CREATE TABLE t4 
(eid       NUMBER(15) NOT NULL,
setup_by      TIMESTAMP,
CONSTRAINT fk_eid4 FOREIGN KEY (eid)
REFERENCES t1 (event_id) ON DELETE CASCADE);

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

К сожалению, в данный момент у меня нет удобной копии Oracle (или какой-либо БД), но моя первая мысль - ЛЕВЫЕ ВНЕШНИЕ СОЕДИНИТЬ с каждой таблицей, а затем отфильтровать, расшифровав существование идентификатора вкаждый стол?

SELECT t1.event_id, t1.event_name
  FROM t1
       LEFT OUTER JOIN t2 ON t1.event_id = t2.eid
       LEFT OUTER JOIN t3 ON t1.event_id = t3.eid
       LEFT OUTER JOIN t4 ON t1.event_id = t4.eid
 WHERE (
        DECODE(t2.eid, null, 0, 1) + 
        DECODE(t3.eid, null, 0, 1) + 
        DECODE(t4.eid, null, 0, 1)
       ) >= 2
0 голосов
/ 19 ноября 2010

Если вам нужно ровно 2 из 3 таблиц, этот запрос не будет работать без некоторой дополнительной логики ... но если вы ищете случай, когда отсутствует одно из 3 отношений, он будет работать. Тем не менее, это должно привести вас к делу 2 из 3.

select t1.event_id, t1.event_name from t1 left outer join t2 on t1.event_id = t2.eid where t2.eid is null
union
select t1.event_id, t1.event_name from t1 left outer join t3 on t1.event_id = t3.eid where t3.eid is null
union
select t1.event_id, t1.event_name from t1 left outer join t4 on t1.event_id = t4.eid where t4.eid is null

По сути, левое внешнее объединение, сравнивающее идентификатор подтаблицы с нулем, эффективно выдает вам строки, отсутствующие в каждой таблице, и затем вы можете объединять результаты вместе. Если вы хотите убедиться, что данные отсутствуют только в одной таблице, вам необходимо выполнить внутреннее соединение с двумя другими таблицами в каждом подзапросе, чтобы убедиться, что они работают. Что-то вроде:

select t1.event_id, t1.event_name from t1 left outer join t2 on t1.event_id = t2.eid 
inner join t3 on t1.event_id = t3.eid inner join t4 on t1.event_id = t4.eid 
where t2.eid is null
union
select t1.event_id, t1.event_name from t1 left outer join t3 on t1.event_id = t3.eid 
inner join t2 on t1.event_id = t2.eid inner join t4 on t1.event_id = t4.eid
where t3.eid is null
union
select t1.event_id, t1.event_name from t1 left outer join t4 on t1.event_id = t4.eid 
inner join t3 on t1.event_id = t3.eid inner join t2 on t1.event_id = t2.eid
where t4.eid is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...