0
select model from (
    select price, model from pc where price = (select max(price) from pc)
    union
    select price, model from laptop where price = (select max(price) from laptop)
    union
    select price, model from printer where price = (select max(price) from printer)
) t1 where price = (select max(price) from (
    select price, model from pc where price = (select max(price) from pc)
    union
    select price, model from laptop where price = (select max(price) from laptop)
    union
    select price, model from printer where price = (select max(price) from printer)
) t2 )

私はSQLに非常に慣れていないので、私の質問は非常に単純ですが、1つのポイントを整理したいと思います. このクエリをこのようなものに単純化できないというのは正しいですか?

select model from (
    select price, model from pc where price = (select max(price) from pc)
    union
    select price, model from laptop where price = (select max(price) from laptop)
    union
    select price, model from printer where price = (select max(price) from printer)
) t1 where price = (select max(price) from t1)

それができない場合、2 つの同じサブクエリを実行するのは悪いことですか?

4

3 に答える 3

1

私は今でも 1 つのテーブルを使用するように言っていますが、これはベスト プラクティスの設計です。 (同一のテーブルを不必要に複製しないでください。)

CREATE TABLE unified_table (
  product_type,
  price,
  model
)

そうすることで、このクエリが有効になります...

SELECT
  *
FROM
  unified_table
WHERE
  price = (SELECT MAX(price) FROM unified_table)

しかし、UNION の結果に対処するオプティマイザーを信頼できない場合、または信頼しない場合は...

SELECT
  *
FROM
(
  SELECT * FROM pc
  UNION ALL
  SELECT * FROM laptop
  UNION ALL
  SELECT * FROM printer
) t1
WHERE
  price = (SELECT MAX(price) FROM (SELECT price FROM pc
                                   UNION ALL
                                   SELECT price FROM laptop
                                   UNION ALL
                                   SELECT price FROM printer
                                  ) t2
          )

オプティマイザは、冗長な検索を削除するためにこれを最適化する方法を理解します。


編集:

妥協案として、統一されたビューを作成し、それを照会することができます...

CREATE VIEW unified_table AS
  SELECT 'pc'      AS type, * FROM pc
  UNION ALL
  SELECT 'laptop'  AS type, * FROM laptop
  UNION ALL
  SELECT 'printer' AS type, * FROM printer
于 2012-07-06T13:59:44.807 に答える
0

次のようなことを試してください:

select model, price
from (
    select price, model from pc order by price desc limit 1
    union
    select price, model from laptop order by price desc limit 1
    union
    select price, model from printer order by price desc limit 1
) t1 
order by price desc
limit 1

ただし、データベース構造を確認することをお勧めします。これは、タイプに基づいて同じもの (アイテム) に対して複数のテーブルを作成したようです。これらすべてを 1 つのテーブルに保持し、タイプ列の内容のみで区別することができます。

制限なし:

select t1.model, t1.price
from 
(select max(price) p
 from
    select max(price) p from pc
    union
    select max(price) p from laptop
    union
    select max(price) p from printer
) max_price
JOIN (
    select price, model from pc
    union
    select price, model from laptop
    union
    select price, model from printer
) t1 ON price >= max_price.p
于 2012-07-06T13:46:33.133 に答える
0
select * from (
    select price, model from pc where price = (select max(price) from pc)
    union
    select price, model from laptop where price = (select max(price) from laptop)
    union
    select price, model from printer where price = (select max(price) from printer)
) order by Price desc limit 1

比較する 3 つの値を異なるテーブルからリレーションなしで取得したため、Union を実行してからそれらを比較する必要があります。

これは方法であり、価格を再計算する必要はありません。

于 2012-07-06T13:48:04.863 に答える