为mssql

时间:2016-02-05 17:44:08

标签: sql-server join

所以如果某些属性可用于项目,我想从表格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'这样的属性。我不确定它应该是一个正确的连接还是内部连接,但我不希望属性中有任何额外的项目。对于单个产品,可能有许多不同的属性。

感谢您的任何帮助。

1 个答案:

答案 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)