1

嗨,我不明白这个简单的 SQL 查询JOIN。我想选择具有两个属性的产品。以下是表格(产品和属性):

产品表

属性表

这里有两个查询

第一个查询只使用 4 个 AND 运算符进行一次连接,并且不返回任何数据(但它应该)。

第二个查询使用表 product <-> attrv_1 和 product <-> attrv_2 进行两次连接,效果很好。:

这是第一个查询

SELECT * 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv ON p.productid = attrv.productid
                    AND attrv.atrid = 1
                    AND attrv.atrvalue like '%JANICKA IWONA%' 
                    AND attrv.atrid = 2
                    AND attrv.atrvalue like '%N.ERA%' 

和返回正确数据的第二个查询:

SELECT p.* 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv_1 ON p.productid = attrv_1.productid
                    AND attrv_1.atrid = 1
                    AND attrv_1.atrvalue LIKE '%JANICKA IWONA%'
INNER JOIN tblAttributesValues attrv_2 ON p.ProductID = attrv_2.ProductId
                    AND attrv_2.atrid = 2
                    AND attrv_2.atrvalue LIKE '%N.ERA%'   

在第二个 SQL 查询中,我做了两次 join 以查找具有两个属性的产品。

为什么第一个查询不适用于一次连接的 AND 运算符?

这是输出:

第二次查询输出

4

2 回答 2

2

“为什么第一个查询不适用于一次连接的 AND 运算符?”

因为属性表中没有任何行可以同时具有 atrid = 1 和 atrid = 2。

我可以想到一个解决方案,它可以使用 group by、have 和 count 子句来实现所需的结果,但是您的第二个查询很可能会更快、更容易理解。

于 2011-09-08T10:39:48.590 回答
1

您的第一个查询永远不会返回任何结果。您要求它做的是获取属性表具有条目的每个产品,其中 atrvalue 字段等于 1 并且 atrvalue 字段也等于 2。由于它必须是另一个,这意味着连接的右侧永远不会有任何条目,并且由于这是一个内部连接,左侧永远不会匹配,因此没有行。您真正想要的是两组条件之间的 OR:

SELECT * from tblProducts p join tblAttributesValues attrv ON p.productid = attrv.productid AND (attrv.atrid = 1 AND attrv.atrvalue like '%JANICKA IWONA%') OR (attrv.atrid = 2 AND attrv.atrvalue like '%N.ERA%')

于 2011-09-08T10:16:08.937 回答