2010-11-18 8 views
0

4 tablom var: t1, t2, t3, t4. T1.event_id, t1.event_name öğesinin t1.event_id öğesinin yalnızca 3/2 tablosunda (t2, t3, t4) bulunduğunu görüntülemem gerekiyor. Birleştirmeyi kullanmaya çalışıyorum ama yapabileceğim tek şey, tüm tablolarda bulunan event_ids değerini döndürmektir.Verilerin yalnızca 3 tablonun 2'sinde var olması koşuluyla 4 tabloya nasıl katılabilirim

İşte 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 tablonun tam 2'sine mi ihtiyacınız var? Veya sadece t2'de var olduğu, fakat t3 veya t4'ün de geçerli olmadığı durum böyle midir? – Doug

cevap

0

tam olarak 3 tablolardan 2, bu sorgu biraz daha mantık olmadan çalışmaz gerekirse ... ama eğer 3 ilişkiden birinin eksik olduğu durumu arıyor, olacak. Ancak, tam olarak 3 vaka için de başlamanız gerekir.

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 

Temelde, sol dış sonra yapabilirsiniz Sendika sonuçları birlikte verimli size her tablodan eksik satırları alacak null alt tablo en id karşılaştıran ve katılmak. Verilerin tam olarak bir tabloda eksik olmasını istiyorsanız, çalışmasını sağlamak için her alt sorgudaki diğer iki tabloya bir iç birleştirme yapmanız gerekir. Bir şey gibi: Maalesef

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

, şu anda kullanışlı Oracle bir kopyasını (ya da bu konuda herhangi bir DB) yok, ama SOL DIŞ her tabloya JOIN ve sonra aşağı filtre benim ilk düşünce Her tablodaki id'in varlığını çözme?

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 
İlgili konular