我有一个名为Product的表,以及一个名为ProductProperty的子表:
Product(Product_id, productName,...)
ProductProperty(id, propertyKey, propertyValue, Product_id)
因此,产品可以有多个相应的ProductProperty行。
现在我想查询以下内容:'选择属性width = 12和height = 35'的所有产品行。对于这个特定的例子,我提出了以下查询,它有效,但我觉得我可能错过了一个很好的解决方案。
SELECT Product.Product_id from Product
WHERE
EXISTS (SELECT * FROM ProductProperty WHERE propertyKey='width' AND propertyValue='12' AND ProductProperty.Product_id = Product.Product_id)
AND
EXISTS (SELECT * FROM ProductProperty WHERE propertyKey='height' AND propertyValue='35' AND ProductProperty.Product_id = Product.Product_id);
我在这里缺少哪些明显更好的实现?
答案 0 :(得分:2)
这个怎么样:
SELECT p.Product_id
FROM Product p
JOIN ProductProperty pp ON p.Product_id = pp.Product_id
WHERE (pp.propertyKey = 'width' AND pp.propertyValue = '12')
OR (pp.propertyKey = 'height' AND pp.propertyValue = '35')
GROUP BY p.Product_id
HAVING COUNT(*) = 2;
这当然假设产品不能有重复的密钥。如果有可能,您可以尝试这样做:
SELECT p.Product_id
FROM Product p
JOIN ProductProperty pp ON p.Product_id = pp.Product_id
GROUP BY p.Product_id
HAVING SUM(pp.propertyKey = 'width' AND pp.propertyValue = '12') > 0
AND SUM(pp.propertyKey = 'height' AND pp.propertyValue = '35') > 0;