1

私はSQLクエリの演習を行っていましたが、同じ名前の3つの列があり、そのうちのいくつかにnullが含まれているところまで到達しました。これは、3つではなく1つの列の呼び出し価格に組み合わせることができるオプションです。

Short database description "Computer firm":

The database scheme consists of four tables:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

表「製品」には、メーカー、モデル番号、およびタイプ(「PC」、「ラップトップ」、または「プリンター」)に関する情報が含まれています。Productテーブルのモデル番号は、すべてのメーカーと製品タイプで一意であると想定されています。テーブル「PC」のコードで一意に指定する各PCは、モデル(Productテーブルを参照する外部キー)、速度(MHz単位のプロセッサの)、RAMの合計量(Mb単位)、ハードディスクドライブ容量によって特徴付けられます。 --hd(Gb単位)、CD ROM速度-cd(たとえば、「4x」)、および価格。テーブル「ラップトップ」は、画面サイズ(画面(インチ))に置き換えられたCD ROM速度を除いて、PCの1つと似ています。テーブル「Printer」の各プリンタについて、プリンタがカラーであるかどうかが通知されます(カラープリンタの場合、color属性は「y」です。

演習:7メーカーBが製造したすべての製品(任意のタイプ)のモデルと価格を調べます。

私の質問:

SELECT distinct Product.model, PC.price, Laptop.price,Printer.price as price 
from   Product 
left   join PC 
on     Product.model=PC.model 
left JOIN Laptop 
ON Product.model=Laptop.model 
left join Printer 
on Product.model= Printer.model 
where Product.maker='B';

出力:

あなたの質問:

model   price   price   price
1121    850     NULL    NULL
1750    NULL    1200    NULL

正しいクエリ:

model   price
1121    850
1750    1200
4

3 に答える 3

2

使ってみてくださいCOALESCE

SELECT distinct Product.model, 
       COALESCE(PC.price, Laptop.price,Printer.price) as price 
from Product left join PC 
            on Product.model = PC.model 
     left JOIN Laptop 
            ON Product.model = Laptop.model 
     left join Printer 
           on Product.model = Printer.model 
where Product.maker='B'

定義から、

COALESCE Returns the first nonnull expression among its arguments.

更新1

SELECT  a.model, a.price
FROM    PC a INNER JOIN Product b
            ON a.model = b.model
WHERE   b.maker = 'makerB'
UNION
SELECT  a.model, a.price
FROM    Laptop a INNER JOIN Product b
            ON a.model = b.model
WHERE   b.maker = 'makerB'
UNION
SELECT  a.model, a.price
FROM    Printer a INNER JOIN Product b
            ON a.model = b.model
WHERE   b.maker = 'makerB'
于 2012-12-13T06:28:46.487 に答える
0

UNIONが使えます

SELECT Product.model, newTbl.price FROM Product
  INNER JOIN
(
SELECT model, price FROM PC
  UNION
SELECT model, price FROM Laptop
  UNION
SELECT model, price FROM Printer
)newTbl ON Product.model = newTbl.model

または、モデルであるテーブルProductから1列のみが必要な場合は、次のようにProductテーブルを破棄できます。

SELECT model, price FROM PC
      UNION
SELECT model, price FROM Laptop
      UNION
SELECT model, price FROM Printer
于 2012-12-13T06:41:43.737 に答える
-1
SELECT AVG( price) FROM (
    SELECT price, model
    FROM pc
    WHERE model IN (
        SELECT model
        FROM product
        WHERE maker='A' AND type='PC'
    )
    UNION ALL
    SELECT price, model
    FROM laptop
    WHERE model IN (
        SELECT model
        FROM product
        WHERE maker='A' AND type='Laptop'
    )
) as prod
于 2014-04-30T11:05:36.007 に答える