带聚合的硬SQL更新查询

时间:2015-01-07 20:04:55

标签: sql oracle

表格结构:

Auto(model int (key),year int (key),country varchar)
Store(name varchar(key),country varchar,model int (key),price int)

更新仅销售商店所在国家/地区的模型的商店,这样:如果商店中模型的价格相对于同一国家/地区的所有商店中的所有商品的价格最高,然后将价格改变为同一国家所有商店中同一型号的所有价格的平均值。 (Auto.country是它制造的地方)。

多数民众赞成在哪里。不确定它是否正确。

UPDATE ... 
SET ... 
FROM ... 
WHERE model in 
    (
    SELECT DISTINCT model 
    FROM Auto,Store 
    WHERE Auto.model=Store.model 
        AND Auto.country!=Store.country
    )

无法弄清楚这一点。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

分解。

销售国内汽车的商店

SELECT store_id FROM Store s JOIN Auto a USING (model) 
WHERE a.country = s.country

出售外国汽车的商店

SELECT store_id from Store where store_id NOT IN (
    SELECT store_id FROM Store s JOIN Auto a USING (model) 
    WHERE a.country = s.country
)

更新

UPDATE Stores
SET ...
WHERE store_id IN (
    SELECT store_id from Store where store_id NOT IN (
        SELECT store_id FROM Store s JOIN Auto a USING (model) 
        WHERE a.country = s.country
    )
)
  • 我刚注意到你使用的是name而不是store_id

此外,您的表架构不是正常的正常形式。 Store.name和Store.country重复。你应该考虑......

Store (id, name, country)
Auto (id, model, year, country)
Store_Auto (store_id, auto_id, price)

答案 1 :(得分:0)

您想要更新Store行,所以......

UPDATE Store s

您想在(仅)price列中设置值,因此......

SET price = 

...而且您希望价格是商店所在国家/地区的汽车型号的平均值,所以......

  ( SELECT AVG(price)
    FROM Store s2
    WHERE s2.model = s.model AND s2.country = s.country )

您希望仅针对其所在国家/地区的最高价格的行执行此操作,因此...

WHERE s.price = (
  SELECT MAX(price)
  FROM Store s3
  WHERE s3.country = s.country AND s3.model = s.model
)

......仅适用于不销售任何国产车型的商店,所以......

AND s.name NOT IN (
    SELECT name
    FROM
      Store s4
      JOIN Auto
        ON s4.model = Auto.model
    WHERE
      s4.country = Auto.country
)