在 SQlite 中使用 EXISTS 查询的 CASE returns 错误结果
CASE with EXISTS query in SQlite returns wrong result
我有 2 个模型:
- 产品 - 产品列表及其价格
- 优惠 - 产品可以有 0...n 个不同的优惠
表结构:
Table [shop_product]
Fields: 10
[id]: integer NOT NULL
[name]: varchar(300) NOT NULL
[slug]: varchar(150) NOT NULL
[description]: text NOT NULL
[photo]: varchar(100) NOT NULL
[price]: decimal NOT NULL
[category_id]: integer NOT NULL
[upload_date]: datetime NOT NULL
[is_enabled]: bool NOT NULL
[info_template_id]: integer
Table [shop_productoffer]
Fields: 6
[id]: integer NOT NULL
[price]: decimal NOT NULL
[description]: text NOT NULL
[offer_attribute_id]: integer NOT NULL
[product_id]: integer NOT NULL
[default_offer]: bool NOT NULL
Foreign Keys:
[] ([product_id]) REFERENCES [shop_product]([id])
我想构建一个查询,其中包含 return 的产品列表并按以下逻辑呈现 'default_price' 字段:
如果产品有报价 --> 显示最低的相关报价
否则显示产品的价格字段
这是我得到的(SQlite3 查询):
SELECT
product.price,
CASE offer.price
WHEN EXISTS(SELECT * FROM shop_productoffer
WHERE shop_productoffer.product_id = product.id)
THEN (SELECT MIN(price) FROM shop_productoffer
WHERE shop_productoffer.product_id = product.id AND
shop_productoffer.default_offer = 1)
ELSE product.price
END AS 'default_price'
FROM shop_product as product
LEFT JOIN shop_productoffer AS offer ON product.id = offer.product_id
看起来,Exists
条件永远不会满足 - 总是查询 return default_price' 的值为 product.price
。有些产品链接到报价,有些则没有,但结果总是一样的。
我做错了什么吗?
这是一个非常简单的查询,但我无法让它工作
一种更简单的方法可能是使用聚合查询来生成最低报价,然后 left join
将其提供给 product
table:
SELECT p.name, COALESCE(o.default_price, p.price) AS default_price
FROM shop_product p
LEFT JOIN (SELECT product_id, MIN(price) AS default_price
FROM shop_prodcutoffer
WHERE default_offer = 1
GROUP BY product_id) o ON p.id = o.product_id
我有 2 个模型:
- 产品 - 产品列表及其价格
- 优惠 - 产品可以有 0...n 个不同的优惠
表结构:
Table [shop_product]
Fields: 10
[id]: integer NOT NULL
[name]: varchar(300) NOT NULL
[slug]: varchar(150) NOT NULL
[description]: text NOT NULL
[photo]: varchar(100) NOT NULL
[price]: decimal NOT NULL
[category_id]: integer NOT NULL
[upload_date]: datetime NOT NULL
[is_enabled]: bool NOT NULL
[info_template_id]: integer
Table [shop_productoffer]
Fields: 6
[id]: integer NOT NULL
[price]: decimal NOT NULL
[description]: text NOT NULL
[offer_attribute_id]: integer NOT NULL
[product_id]: integer NOT NULL
[default_offer]: bool NOT NULL
Foreign Keys:
[] ([product_id]) REFERENCES [shop_product]([id])
我想构建一个查询,其中包含 return 的产品列表并按以下逻辑呈现 'default_price' 字段: 如果产品有报价 --> 显示最低的相关报价 否则显示产品的价格字段
这是我得到的(SQlite3 查询):
SELECT
product.price,
CASE offer.price
WHEN EXISTS(SELECT * FROM shop_productoffer
WHERE shop_productoffer.product_id = product.id)
THEN (SELECT MIN(price) FROM shop_productoffer
WHERE shop_productoffer.product_id = product.id AND
shop_productoffer.default_offer = 1)
ELSE product.price
END AS 'default_price'
FROM shop_product as product
LEFT JOIN shop_productoffer AS offer ON product.id = offer.product_id
看起来,Exists
条件永远不会满足 - 总是查询 return default_price' 的值为 product.price
。有些产品链接到报价,有些则没有,但结果总是一样的。
我做错了什么吗? 这是一个非常简单的查询,但我无法让它工作
一种更简单的方法可能是使用聚合查询来生成最低报价,然后 left join
将其提供给 product
table:
SELECT p.name, COALESCE(o.default_price, p.price) AS default_price
FROM shop_product p
LEFT JOIN (SELECT product_id, MIN(price) AS default_price
FROM shop_prodcutoffer
WHERE default_offer = 1
GROUP BY product_id) o ON p.id = o.product_id