1

私は3つのテーブルを持っています。

所有者 (owner_id、名前)
住宅 (コード、所有者 ID、価格)
購入者 (購入者 ID、名前) 購入 (購入者ID、コード、購入価格、購入
日)

次のクエリがあります。
ある所有者からすべての家を購入した購入者の名前を挙げてください。

誰かが特定の所有者 (id = 1 の所有者など) からすべての家を購入したかどうかを確認する方法を知っています。

SELECT name 
FROM   buyer 
WHERE  NOT EXISTS (SELECT code 
               FROM   house 
               WHERE  owner_id = 1 
                      AND code NOT IN (SELECT code 
                                       FROM   bought 
                                       WHERE  bought.buyer_id= buyer.buyer_id)) 

すべての所有者に対してこれを機能させるにはどうすればよいですか?

4

1 に答える 1

2

文: 「ある所有者からすべての家を購入した購入者の名前を挙げてください?」. これは、2 つの方法で解釈できます。(1) 購入者が購入した住宅はすべて 1 人の所有者のものです。または (2) 1 人の所有者が同じ購入者に売却したすべての住宅。

以下の回答 (1):

select b.buyer_id
from bought b join
     house h
     on b.code = h.code
group by b.buyer_id
having min(h.owner_id) = max(h.owner_id);

2 番目の質問に対する答えも同様です。ただし、焦点は購入者ではなく所有者です。

select min(b.buyer_id)
from bought b join
     house h
     on b.code = h.code
group by h.owner_id
having min(b.buyer_id) = max(b.buyer_id);

編集:

どちらの場合も、ロジックは非常に似ていますが、2 番目のクエリを見てみましょう。結合は、購入者 ID と所有者 ID を組み合わせているだけです (あまり興味深いものではありません)。

group by、 ごとに 1 つの行を作成していますowner_id。次に、最小購入者と最大購入者が同じ場合、つまり値が 1 つしかない場合にhavingのみクエリが ID を返すという条件を追加します。ownerこの状態を と表現することもできますcount(distinct buyer_id) = 1min()max()通常は よりも少し優れたパフォーマンスを発揮しますcount(distinct)

次に、select句はそれらの購入者を返します。ownerを含めて、誰の家を購入したかを確認することもできます。

于 2013-08-31T15:44:17.993 に答える