在 SQlite 中使用 EXISTS 查询的 CASE returns 错误结果

CASE with EXISTS query in SQlite returns wrong result

我有 2 个模型:

表结构:

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