2

私はSQLに少し慣れていないので、ご容赦ください。

それぞれ ID 列を持つ 2 つのテーブルがあります。テーブル A には役割というタイトルの列があり、テーブル B には結果というタイトルの列があります。これらのテーブルにクエリを実行して、ID に基づいてロール = 'PS' と結果 = 'DE' を持つ行を見つけたいと考えています。これが私のコードです:

SELECT count(*)
FROM A JOIN B
ON (A.id = B.id
AND A.role = 'PS'
AND B.outcome = 'DE')

A.roleまたはB.outcomeのいずれかにnull値を持つ行が含まれないように、これを行う方法をインターネットで検索してきました。

上記のコードは、B.outcome = 'DE' である B のエントリの総数が 40,000 しかないにもかかわらず、たとえば 40,100 を返します。したがって、明らかに私の条件に合わないエントリが含まれています。クエリをより適切に絞り込む方法はありますか?

4

1 に答える 1

1

クエリは、 のnull値を持つ行を既に除外していますA.role。結局のところ、null = 'PS'そうではなく、内部結合を使用しています。

B よりも多くの行を結合から取得する方法についての簡単な説明があります。A に次の行があるとします。

 A.id   A.role
 1      'A'
 1      'A'

B のこれらの行:

 B.id   B.outcome
 1      'A'
 1      'A'

次に、このクエリ:

select  *
from    A
join    B
on      A.id = B.id and A.role = 'A' and B.role = 'A'

4行を返します。これは、表 A または B よりも多い数です。

したがって、idが一意かどうかを調査します。

select count(*) from A group by id having count(*) > 1
select count(*) from B group by id having count(*) > 1

これらのクエリが 0 より大きい数を返す場合、id一意ではありません。結合は一致ごとに行を繰り返すため、返されるレコードの量が大幅に増加することを説明できます。

于 2012-07-02T19:33:00.910 に答える