2010-12-28 13 views
8

Ich verwende Oracle 11gR2 und ich versuche, eine Abfrage zu schreiben, die Adressdaten aus zwei Tabellen, CUSTOMERS und LOCATIONS zurückgibt. Ein bestimmter Kunde kann (oder muss nicht) verschiedene Standorte haben, jeder mit seiner eigenen Adresse.Links Join, der immer null Datensätze enthält

Ich möchte die Adresse für jeden Kunden und alle ihre Standorte zurückgeben. Zum Beispiel enthalten, wenn die Tabellen Daten wie:

 
CUSTOMERS 
CUSTOMER_ID ADDRESS 
    1   "New York" 
    2   "California"

LOCATIONS CUSTOMER_ID LOCATION_ID ADDRESS 1 1 "New Jersey"

Dann möchte ich die Ergebnisse wie folgt aussehen:

 
CUSTOMER_ID LOCATION_ID ADDRESS 
    1       "New York" 
    1    1  "New Jersey" 
    2      "California"

Mein erster Gedanke so etwas wie das war:

SELECT 
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS 
FROM 
CUSTOMERS 
LEFT JOIN 
LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID) 

Das Problem dabei ist, dass, wenn ein Kunde Standorte hat, es keine Zeile mit Nullwerten fo zurückgibt r Standortdaten, so bekomme ich keine Zeile mit der Adresse in der CUSTOMERS Tabelle. Es gibt mir so etwas wie dieses:

 
CUSTOMER_ID LOCATION_ID ADDRESS 
    1    1  "New Jersey" 
    2      "California" 

Es ist die New York Adresse für customer 1 fehlt. Ich habe versucht, diese ...

SELECT 
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS 
FROM 
CUSTOMERS 
LEFT JOIN 
LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID OR LOCATIONS.CUSTOMER_ID IS NULL) 

Aber es gab mir die gleichen Ergebnisse wie die erste Abfrage. Gibt es eine Möglichkeit, einen Nulldatensatz für die zweite Tabelle zurückzugeben, selbst wenn die Join-Bedingung übereinstimmt?

+0

versuchen – yurib

Antwort

10

Sie kein dich hier überhaupt brauchen:

SELECT customer_id, NULL AS location_id, address 
FROM customers 
UNION ALL 
SELECT customer_id, location_id, address 
FROM locations 
+0

Doh Diese wil. Ich hatte das Gefühl, dass mir etwas Einfaches fehlte. Vielen Dank. – Mike

+0

@Mike: Gern geschehen. Wenn es hilfreich war, vergesse bitte nicht, diesen Beitrag zu aktualisieren und ihn als akzeptiert zu markieren. – Quassnoi

0

Sie können sich einer vollständigen äußeren versuchen. Zum Beispiel:

SELECT  
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS    
FROM CUSTOMERS 
    FULL OUTER JOIN LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID) 
+0

Dies ergibt die gleichen Ergebnisse wie meine erste Abfrage (es gibt keine Datensätze in LOCATIONS ohne einen passenden Kunden in KUNDEN). – Mike

1

Wenn Sie die beiden Tabellen auch beitreten wollen, wenn es nicht Spiel ist, müssen Sie IS NULL auf Ihren verknüpften Spalten verwenden.

Zum Beispiel.

Table 1: 
CustomerID 
CustomerName 

.

Table 2: 
CustomerID 
CustomerEmail 

.

Select, 
CustomerID, 
CustomerName, 
ISNULL (CustomerEmail, NULL) AS CustomerEmail 


FROM table1 

LEFT JOIN table2 
ON table1.CustomerID = table2.CustomerID 

eine vollständige äußere Verknüpfung sowohl customerID und Adresse zurückbringen Ergebnisse mit NULL