2010-11-18 12 views
0

私は4つのテーブル:t1、t2、t3、t4を持っています。 t1.event_id、t1.event_nameを表示する必要があります.t1.event_idは、3つのテーブルのうち2つ(t2、t3、t4)にしか存在しません。私はjoinを使用しようとしますが、私ができることはすべてのテーブルに存在するevent_idsを返すことだけです。どのようにデータが3つのテーブルのうちの2つに存在するという条件で4つのテーブルを結合できますか

ここには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); 
+0

3つのテーブルのうち正確に2つが必要ですか?あるいは、それがt2のみに存在するが、t3またはt4も有効でない場合があるか? – Doug

答えて

0

あなたは正確に3つのテーブルの2は、このクエリはもう少しロジックなしで動作しません。必要な場合は...しかし、もしあなたは3つの関係のうちの1つが欠けている場合を探しています。しかし、それはちょうど3のケースのちょうど2のために始める必要があります。

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 

は基本的には、左の外側には、nullにサブテーブルのIDを比較すると、一緒に結果を効率的にあなたが各テーブルから欠落している行を取得し、次にあなたができる労働組合ます参加します。データが正確に1つのテーブルに存在しないようにするには、各サブクエリの他の2つのテーブルに対して内部結合を行い、それが機能することを確認する必要があります。現時点では

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 
1

残念ながら、私は(そのことについてまたは任意のDB)のOracleのコピーを持っていない便利な、私の最初の考えは各テーブルにJOINをLEFT OUTERにあり、その後で絞り込む:ような何か各テーブルのIDの存在をデコードする?

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 
関連する問題