2014-01-17 88 views
0

這裏是SQL,'aal_county_zip'有2個郵編的條目,而'us_zip'有15個郵編。要求得到15行,只有2行有來自'aal_county_zip'的數據。它像普通的連接一樣工作。如何更改SQL/Table結構以使其工作。我也想添加下面評論的條件。sql左外連接約束列

SELECT DISTINCT a.zcta5ce10 AS zipcode, 
       c.report_year, 
       c.aal 
FROM aal_county_zip c 
     RIGHT OUTER JOIN us_zip a 
        ON (c.zip = a.zcta5ce10) 
WHERE Lower(c.name) = Lower('alachua') 
--and c.report_year=2009 
ORDER BY c.report_year DESC 
+0

請解釋一下什麼叫「不工作」的意思(沒有足夠的結果,太多的結果,一些行是不正確的,等等) – dasblinkenlight

回答

1

查詢中的WHERE Lower(c.name) = Lower('alachua')將外部聯接變爲內部聯接,因爲它阻止c.nameNULL

請考慮使用左連接,因爲它們通常更自然。而且無論如何,將這個條件應用到join子句中而不是where子句中,以避免將其變爲內部連接。

借款和修正@ dasblinkenlight的查詢:

SELECT DISTINCT 
    a.zcta5ce10 AS zipcode 
, c.report_year 
, c.aal 
FROM us_zip a 
LEFT OUTER JOIN aal_county_zip c 
     ON c.zip = a.zcta5ce10 
    AND c.report_year=2009 
    AND LOWER(c.name) = LOWER('alachua') 
ORDER BY c.report_year DESC 

這應該解決您的 「只有兩排退回」 的問題。也就是說,該查詢可能會在us_zip上缺少一些附加標準(和訂購標準)。

+0

謝謝,它的工作原理 – patb23

+0

@ patb23從某種意義上說,這很奇怪,因爲你聲稱它和那條線一樣工作;你在抱怨評論欄目。請將來測試並更好地描述您的問題。 – SQB

0
SELECT DISTINCT a.zcta5ce10 AS zipcode, 
       c.report_year, 
       c.aal 
FROM aal_county_zip c 
     RIGHT OUTER JOIN us_zip a 
        ON (c.zip = a.zcta5ce10) 
WHERE Lower(c.name) = Lower('alachua') 
    AND COALESCE(c.report_year, 2009)=2009 
ORDER BY c.report_year DESC 

SELECT DISTINCT a.zcta5ce10 AS zipcode, 
       c.report_year, 
       c.aal 
FROM aal_county_zip c 
     RIGHT OUTER JOIN us_zip a 
        ON (c.zip = a.zcta5ce10 AND c.report_year=2009) 
WHERE Lower(c.name) = Lower('alachua') 
ORDER BY c.report_year DESC 

你正在做一個RIGHT OUTER JOIN,所以你的第一個表,aal_county_zip,可能包含空值。因此,要麼通過使用COALESCE來解決這些空值,要麼使其成爲連接條件的一部分。

+0

兩個給了我像一個正常的加入(返回2行)相同的結果。 'aal_county_zip'只有2個拉鍊的數據,而'us_zip'有15個拉鍊,只是注意到我的外部連接(帶有註釋行)是不正確的。 – patb23