0

ColdFusion 8 を使用して会社の Web サイトを開発しており、別のテーブル ( ) に一致するものがないテーブル ( )からレコードのリスト (clientnameフィールドのみ) を返し、エンド ユーザーに追加を促す目的で使用したいと考えています。それらの会社の料金表。例:dbo.clientsdbo.fees

dbo クライアント

CLIENT_ID CLIENT_NAME
1         Joe's Diner
2         Save-a-Lot
3         Family Meds
4         DiFazio's

dbo.fees

CID        CLIENT_NAME  FEE
1          Joe's Diner  25.000
2          Save-a-Lot   35.000
4          DiFazio's    30.000

私が望むのは、上記のテーブル/データの場合、テーブルに料金がリスト/レコードされていないため、clientid/clientname 3/Family Meds のみを返す結果セットですdbo.fees。私のDBはMSSQL 2005です。私のクエリは次のとおりです。

SELECT clientid 
FROM clients 
INNER JOIN fees 
  ON clients.clientid <> fees.cid;

これは、50,000 以上の結果のデカルト積を返します。LEFT/RIGHT OUTER JOINstill を使用すると、デカルト積が得られ、エントリがあるかどうかに関係なく、DISTINCTすべてのレコードが返されます。私は何を間違っていますか? dbo.clientsdbo.fees

ps また、注意してください: 私の前の管理者は明らかにクライアント/料金テーブル間の PK/FK 関係を設定しなかったため、それに依存する可能性のあるクエリ構文はこの状況では機能しない可能性があります。おそらく、関連するフィールドの値のみに基づいて機能する必要があります。

4

2 に答える 2

1

NOT IN最も単純なのは、 ;を使用することです。

SELECT clientid FROM clients WHERE clientid NOT IN
  (SELECT clientid FROM fees)

...または、LEFT JOINを使用して、同じことをもう少し詳細に行うことができます。クライアントに料金が存在しない場合、f.clientidはNULLになります。

SELECT c.clientid
FROM clients c
LEFT JOIN fees f
ON c.clientid = f.clientid
WHERE f.clientid IS NULL
于 2013-03-05T15:07:21.913 に答える
1

テーブルに表示されないレコードのみを返す句で をLEFT JOIN使用できます。WHEREfees

select c.CLIENT_ID, c.CLIENT_NAME
from clients c
left join fees f
    on c.CLIENT_ID = f.CLIENT_ID
where f.CLIENT_ID is null

JOIN構文の学習にヘルプが必要な場合は、次の優れたリファレンスを参照してください。

これは を使って書くこともできますNOT EXISTS:

select *
from clients c
where not exists (select CLIENT_ID
                    from fees f
                    where c.CLIENT_ID = f.CLIENT_ID)

両方のクエリでSQL Fiddle Demoを参照してください

于 2013-03-05T15:06:38.280 に答える