2017-11-13 1 views
1

Wenn diese Abfrage keine B-Werte, aber A-Werte hat, kann ich null haben, wo keine Werte sind?Rerurn null, wenn Unterabfrage keinen Wert hat sql

SELECT A, B 
FROM 
(SELECT title as A 
FROM TABLE1 
INNER JOIN TABLE2 ON TABLE1_TABLE2_ID = TABLE2_ID 
INNER JOIN TABLE3 ON TABLE1_TABLE3_ID = TABLE3_ID 
WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'A'), 

(SELECT title as B 
FROM TABLE1 
INNER JOIN TABLE2 ON TABLE1_TABLE2_ID = TABLE2_ID 
INNER JOIN TABLE3 ON TABLE1_TABLE3_ID = TABLE3_ID 
WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'B') 

Zum Beispiel diese Tabelle

A  B 
--------------- 
Computer null 

zeigen sein muss, die Werte zeigen, aber jetzt nur, wenn Id A und Typ Typ B

+2

Werfen Sie einen Blick in FULL OUTER JOIN – mrks

+0

Wie viele Zeilen erwarten Sie für 'A' und' B' Unterabfragen? – MT0

+0

@ MT0, es ist immer ein anderer Wert –

Antwort

1

Es ist als LEFT CROSS JOIN nicht so etwas hat, aber man kann es implementieren ein LEFT JOIN mit:

SELECT a.A, b.B 
FROM (SELECT title as A 
     FROM TABLE JOIN 
      TABLE2 
      ON TABLE_TABLE2_ID = TABLE2_ID JOIN 
      TABLE3 
      ON TABLE_TABLE3_ID = TABLE3_ID 
     WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'A' 
    ) a, LEFT JOIN 
    (SELECT title as B 
     FROM TABLE JOIN 
      TABLE2 
      ON TABLE_TABLE2_ID = TABLE2_ID JOIN 
      TABLE3 
      ON TABLE_TABLE3_ID = TABLE3_ID 
     WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'B' 
    ) b 
    ON 1 = 1; 
+0

Danke, es ist Arbeit. Was bedeutet "ON 1 = 1"? –

+0

@EmmaW. . . . Das ist einfach ein Ausdruck, der immer als wahr bewertet wird. –

0
SELECT A, B 
FROM 
(SELECT title as A 
FROM TABLE 
INNER JOIN TABLE2 ON TABLE_TABLE2_ID = TABLE2_ID 
INNER JOIN TABLE3 ON TABLE_TABLE3_ID = TABLE3_ID 
WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'A')AA 
left join 
(SELECT title as B 
FROM TABLE 
INNER JOIN TABLE2 ON TABLE_TABLE2_ID = TABLE2_ID 
INNER JOIN TABLE3 ON TABLE_TABLE3_ID = TABLE3_ID 
WHERE TABLE_TABLE3_ID = 2008 AND TABLE_TYP LIKE 'B')BB 
on AA.A=BB.B 

Hope this will solve your problem... 
1

Es ist unklar, welche Daten Sie haben aber Sie können PIVOT verwenden, und ein Self-Join zu vermeiden, wenn Sie erwarten, Null-oder-eine Zeile pro TABLE_TYP:

SQL Fiddle

Oracle 11g R2 Schema Setup:

CREATE TABLE TABLE1 (table1_table2_id, table1_table3_ID) AS 
SELECT 1, 2008 FROM DUAL; 

CREATE TABLE TABLE2 (table2_ID, table_typ) AS 
SELECT 1, 'A' FROM DUAL; 

CREATE TABLE TABLE3 (table3_ID, title) AS 
SELECT 2008, 'Computer' FROM DUAL; 

Abfrage 1:

SELECT * 
FROM (
    SELECT title, 
     table_typ 
    FROM TABLE1 
     INNER JOIN TABLE2 ON TABLE1_TABLE2_ID = TABLE2_ID 
     INNER JOIN TABLE3 ON TABLE1_TABLE3_ID = TABLE3_ID 
    WHERE TABLE1_TABLE3_ID = 2008 
    AND TABLE_TYP IN ('A', 'B') 
) 
PIVOT (MAX(title) FOR Table_Typ IN ('A' AS A, 'B' AS B)) 

Results:

|  A |  B | 
|----------|--------| 
| Computer | (null) | 

Wenn Ihre Unterabfragen mehr Zeilen zurückgeben erwarten dann würden Sie nicht in der Lage sein, genau dieses Verfahren zu verwenden (aber immer noch may be able to use PIVOT, und die Vermeidung von Selbstverknüpfung, je auf Ihre Anforderungen).

+0

Vielen Dank, aber das ist nicht genau das, was ich brauche. Denn dann muss ich alle Daten aus Tabellen lesen und ich benutze dies in 'sqldatareader'. –

Verwandte Themen