3

何が違うの?

右:

select distinct maker, price from product
inner join printer
on product.model = printer.model
where color = 'y' and price <= (select min(price) from printer where color = 'y')

違う:

select distinct maker, price from product
inner join printer
on product.model = printer.model
where color = 'y' and price <= all (select distinct price from printer where color = 'y')

「min」を使用するとパフォーマンスが向上することはわかっています。しかし、結果の何が間違っていて何が違うのか、誰か説明できますか?

テーブル構造:

Product(maker, model, type)
Printer(code, model, color, type, price)

ナイケル

4

3 に答える 3

1

NULL がある場合、2 つ目は失敗しますprinters.price。これを考慮してください(ここではPostgreSQLを使用しています):

=> select 0 <= (select min(x) from (values (null), (1), (2)) as t(x));
 ?column? 
----------
 t
(1 row)

この:

=> select 0 <= all (select x from (values (null), (1), (2)) as t(x));
 ?column? 
----------

(1 row)

これは、最初のケースでは true の結果であり、2 番目のケースでは NULL (false) です。

于 2012-10-09T03:57:54.803 に答える
1

ALLは、すべての行に対して比較演算子を展開し、条件を AND で結合するための短い形式です。
ANYは、すべての行に対して比較演算子を展開し、条件を OR で結合するための短い形式です。

具体的には、

price <= all (select distinct price from printer where color = 'y')

サブクエリが 4 行を返すと仮定すると、

price <= <price1> AND
price <= <price2> AND
price <= <price3> AND
price <= <price4>

それらのいずれかが NULL に解決される場合、NULL は を使用して比較できないため、結果はfalse<=になります。MIN にはこの問題はありません (MIN は NULL をスキップするため) <= (select MIN..)

null 許容列に対してテストを実行するために ALL を使用する場合、ほとんどの場合、フィルターで修飾する必要があります。

select distinct maker, price from product
inner join printer
on product.model = printer.model
where color = 'y' and price <=
      all (select distinct price from printer where color = 'y'
           where price is not null)
于 2012-10-09T04:05:09.437 に答える
0
  1. ALL は Transact-SQL 拡張機能です。すべてのデータベース エンジンでサポートされているわけではありません。おっとっと。
  2. データベースについて話すとき、パフォーマンスは無視できません。ソリューションはおそらくインデックスを使用して非常に高速に実行できますが( minRDBMS が B ツリーまたは同様のソートされたインデックスを構築すると仮定)、all ソリューションは完全なテーブル スキャンを強制します。
  3. pricenull を許可すると、異なる回答が得られます。minはすべての null 値を無視するため、priceが null の場合、min の結果は数値になります。ただし、個別のクエリの結果は、その null をすべての価格と比較しようとします。これはすべての価格に対して返されます。つまり、句UNKNOWNで一致する価格はありません。where
于 2012-10-09T03:51:07.083 に答える