2012-12-07 94 views
0

我有兩個表,分別是firstname,lastnameamount「no no column」from select

我可以做一個左連接:

select * from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname); 

這給了良好的效果:

|# |firstname  |lastname |amount|dp.firstname |dp.lastname |dp.amount 
|----+--------------+------------+------+-------------+-------------+--------- 
|1 |saumeh synah |s*****  |50.0 |    |    | 
|2 |Neda   |M*****  |1000.0|    |    | 
|3 |Mansoor  |B********** |100.0 |    |    | 
|4 |Hanna   |W****  |50.0 |Hanna  |W****  |50.0 
|5 |Kristen  |A****  |40.0 |Kristen  |A****  |40.0 
|6 |David   |B******  |10.0 |David  |B******  |10.0 

現在我想選擇只是從dp缺少的行。

所以我寫:

select * from ( 
select * from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname)) 
where dp.amount = null; 

,但我得到的錯誤

no such column: dp.amount 

爲什麼不呢?

回答

3

錯誤歸因於派生表。剛剛嘗試一個簡單的查詢:

select spi.* 
from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname) 
where dp.amount IS null ; 
2

dp.amount不存在如您已在select * from (select * from...)

內心的組括號中創建了派生表中創建一個派生表,以便大家參考與DP沒有按」在那些父母的外面存在。把你的where dp.amount = null放在最後一個圓括號內,並將你的分號推到外面。

select * from ( 
select * from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname) 
-- this will never find results as NULL will never equal anything 
-- where dp.amount = null 
where dp.amount IS NULL) AS D; 
+0

'其中dp.amount = null'將導致0行。總是。 –

+0

@ypercube優秀的捕獲,我專注於語法snafu,並沒有事件思考破碎的邏輯;)現在更新響應 – billinkc

1

實際上,您不需要使用sub query,其中dp不存在。

select * from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname) 
WHERE dp.amount IS NULL 

編輯:這裏有一些nice examples about JOIN

0

不知道如果我是100%的理解,但將這項工作?

select dp.firstname,dp.lastname,dp.amount 
from dp,spi 
where dp.firstname=spi.firstname 
and dp.lastname=spi.lastname 
and dp.amount is null; 
+2

這有效地使它成爲一個內部連接,所以它不會工作。 – TaZ

0
select * from (
    select * from .... 
    where dp.amount is null; 
) 
0

可能是更好的名字嵌套查詢:

select * from ( 
select spi.firstname, spi.lastname, spi.amount, dp.firstname f, dp.lastname l, dp.amount a from spi left join dp 
on spi.amount = dp.amount 
and lower(spi.firstname) = lower(dp.firstname) 
and lower(spi.lastname) = lower(dp.lastname)) as x 
where x.a = null; 
相關問題