0

、、の2つのテーブルがfirstnameありlastnameますamount

左結合を行うことができます:

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

なぜだめですか?

4

6 に答える 6

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 ; 
于 2012-12-07T18:56:59.740 に答える
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;
于 2012-12-07T18:57:34.617 に答える
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

編集:ここに参加についてのいくつかの良い例があります

于 2012-12-07T18:58:17.310 に答える
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;
于 2012-12-07T18:59:53.597 に答える
0
select * from (
   select * from ....
   where dp.amount is null;
)
于 2012-12-07T19:02:27.187 に答える
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;
于 2012-12-07T19:05:18.467 に答える