所以如果某些属性可用于项目,我想从表格A获取一些数据。我正在使用以下条件来过滤掉记录
select * from product p
inner join AttributeCodesByProduct atp
on atp.product_id = p.product_id
AND LTRIM(RTRIM(atp.attrVal)) LIKE 'Sil - ghi'
OR LTRIM(RTRIM(atp.attrVal)) LIKE 'Sil - def'
OR LTRIM(RTRIM(atp.attrVal)) LIKE 'Sil - abc'
OR LTRIM(RTRIM(atp.attrVal)) not like 'xyz'
where p.class = 2
基本上我想要检索所有具有Class 2的产品并检查属性表以确保它们具有诸如('Sil-ghi','Sil-def','Sil-abc')之类的属性并且没有像'xyz'这样的属性。我不确定它应该是一个正确的连接还是内部连接,但我不希望属性中有任何额外的项目。对于单个产品,可能有许多不同的属性。
感谢您的任何帮助。
答案 0 :(得分:0)
更好的方式来编写查询
SELECT *
FROM product p
INNER JOIN attributecodesbyproduct atp
ON atp.product_id = p.product_id
AND Ltrim(Rtrim(atp.attrval)) IN ( 'Sil - ghi','Sil - def', 'Sil - abc' )
WHERE p.class = 2
或者,如果您想要在至少有一个product
作为属性的情况下添加'xyz'
,请尝试使用
SELECT *
FROM product p
INNER JOIN attributecodesbyproduct atp
ON atp.product_id = p.product_id
WHERE p.class = 2
AND Ltrim(Rtrim(atp.attrval)) IN ('Sil - ghi', 'Sil - def', 'Sil - abc')
AND EXISTS (SELECT 1
FROM product p1
INNER JOIN attributecodesbyproduct atp1
ON atp1.product_id = p1.product_id
WHERE p.product_id = p1.product_id
GROUP BY p1.product_id
HAVING Count(CASE WHEN Ltrim(Rtrim(atp.attrval)) = 'xyz' THEN 1 END) = 0)