2012-12-07 41 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; 
相关问题