URL: https://www.overclockers.at/coding-stuff/sql-join-problem_254298/page_1 - zur Vollversion wechseln!
folgendes problem, ich sitze momentan komplett auf der leitung..
Ich habe zwei tabellen in einer Oracle DB
Code:Tabelle 1 --------- 1 Test1 2 Test2 3 Test3 4 Test4 Tabelle 2 --------- Test1 A Test2 B Test3 A Test3 B Test4 B Test4 C
Quick und Dirty fällt mir ein Subquerie mit where spalte2 = 'A' ein
hatte ich schonmal, aber dann fehlen mir die spalte != A komplett.
oder ich bin zu deppat...
so eventuell?
Code: SQLselect t1.name, t2.category from table1 t1 left outer join table2 t2 on (t2.name = t1.name AND t2.category = 'A');
selbiges ergebnis. war mein erster gedanke (vom MySQL her, aber eventuell funktioniert Oracle hier anders?),aber die != A fehlen dann komplett.
im prinzip solls am ende so aussehen:
Code:1 Test1 A 2 Test2 3 Test3 A 4 Test4
das tut es bei mir. Es ist halt wichtig, dass es left outer join ist. Das sorgt dafür, dass das ergebnis auch die Inhalte der Linken Seite enthält, wenn das join kriterium nicht aufgeht.
Code: SQLcreate table table1 ( name varchar2(50) ); --drop table table1; create table table2 ( name varchar2(50), category varchar2(50) ); --drop table table2; insert into table1 values ('test1'); insert into table1 values ('test2'); insert into table1 values ('test3'); insert into table1 values ('test4'); insert into table2 values ('test1', 'A'); insert into table2 values ('test2', 'B'); insert into table2 values ('test3', 'A'); insert into table2 values ('test3', 'B'); insert into table2 values ('test4', 'B'); insert into table2 values ('test4', 'C'); select t1.name, t2.category from table1 t1 left outer join table2 t2 on (t2.name = t1.name AND t2.category = 'A');
Code:output: test2 test4 test3 A test1 A
interessant. ich bekomme
Code:1 Test1 A 3 Test3 A
Wenn du als Ergebnis eh nur eine Spalte aus T2 haben willst, warum dann ein Join?
Gibt dir eine Liste mit allen Einträgen der zweiten Spalte (C2) aus der zweiten Tabelle (T2), wobei alle Ergebnisse != 'A' genulled werden.Code: SQLSELECT CASE WHEN C2 = 'A' THEN C2 ELSE NULL END AS Result FROM T2;
Code: SQLSELECT C1, CASE WHEN C2 = 'A' THEN C2 ELSE NULL END AS Result FROM T2;
ja ich will die aus T1 auch haben.
Mit meeps query bekomm ich aber nur noch die "A" einträge zurück, mit deinem dafür alle. Test3 und Test4 sind dann doppelt drin. einmal mit A und einmal Null.
Und du bist dir sicher, dass du einen left outer join machst?
Kannst du deine query mal posten?
Ah okay, ich glaub jetzt versteh ich, was du willst.
meepmeeps Query sollte dann passen (vlt noch SELECT DISTINCT, falls du mehrere Einträge mit T2.C2 = A pro Test hast).
Code: SQLSELECT DISTINCT B.BOOKINGNUMBER, B.TRAVELSTARTDATE, BPB.BUSINESSPARTNERNUMBER, BN.DEFAULTDESCRIPTION FROM BOOKING B LEFT JOIN TOP_SPR_PROD.BUSINESSPARTNERBASE BPB ON B.PAYINGBP_ID = BPB.ID LEFT JOIN BOOKINGSERVICE BS ON BS.BOOKING_ID = B.ID LEFT OUTER JOIN TOP_SPR_PROD.BOOKINGNOTE BN ON BN.BOOKINGSERVICE_ID = BS.ID AND BN.DEFAULTDESCRIPTION LIKE '*BN%' WHERE BPB.BUSINESSPARTNERNUMBER = '123' AND BN.NOTETYPE_ID = '81' ORDER BY B.BOOKINGNUMBER
ohne dem join auf BOOKINGNOTE (also die Zeile komplett weg) enthält das Ergebnis die erwarteten Inhalte aus BOOKING?
'*BN%' matched auch sicher die gesuchten Inhalte aus BN.DEFAULTDESCRIPTION?
Zitat aus einem Post von Umlüxhatte ich schonmal, aber dann fehlen mir die spalte != A komplett.
oder ich bin zu deppat...
oderCode: SQLwith tab1 as ( select decode(rownum, 1, 1, 2, 2, 3, 3, 4, 4) as id, decode(rownum, 1, 'Test1', 2, 'Test2', 3, 'Test3', 4, 'Test4') as wert from dual connect by level <= 4 ), tab2 as ( select decode(rownum, 1, 'Test1', 2, 'Test2', 3, 'Test3', 4, 'Test3', 5, 'Test4', 6, 'Test4') as wert, decode(rownum, 1, 'A', 2, 'B', 3, 'A', 4, 'B', 5, 'B', 6, 'C') as result from dual connect by level <= 6) select tab1.*, (select result from tab2 where tab2.wert = tab1.wert and tab2.result = 'A') from tab1;
Code: SQLselect tab1.*, tab2.* from tab1 left join tab2 on (tab2.wert = tab1.wert and tab2.result = 'A')
lass ich das "AND BN.DEFAULTDESCRIPTION LIKE '*BN%'" einfach weg, erhalte ich alle daten, ja.
halt teilweise doppelt und dreifach, da es wie gesagt zu jeder BOOKINGNUMBER mehrere unterschiedliche BOOKINGNOTES geben kann.
mit dem AND.. bekomme ich nur noch die "*BN%"
aktuell spiele ich mich gerade mit LISTAGG herum um. idee wäre die Notes einfach zu kombinieren und dann auf den suchstring zu prüfen.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025