比 AND 运算符更有效的查询

effective query than AND operator

我想知道是否有任何其他有效的方法或查询来使用 AND 运算符为下面的查询获取所需的输出,因为如果我 运行 下面的查询我得到0 计数。但是根据数据仓库的报告,下面的组合有很多记录。

还有其他搜索方式吗?

select Count(*)
FROM   Cst_Cust_Attributes
WHERE  ATTRIBUTE_VALUE = 'REG'
       AND ATTRIBUTE_VALUE = 'GUEST'
       AND ATTRIBUTE_VALUE = 'EVENT'  

假设您的 table 有一个 cust_id 列,您似乎想要这样的东西:

SELECT cust_id, count(*)
FROM Cst_Cust_Attributes
WHERE attribute_value IN ('REG', 'GUEST', 'EVENT')
GROUP BY cust_id
HAVING count(*) = 3

这将列出具有所有三个属性值的所有客户。如果不想看到,可以将计数从列列表中删除;它不需要在那里,重要的是将它放在 having 子句中。

db<>fiddle 具有非常基本的 made-up 数据。

如评论中所述,此 table 中的任何一行都不能有多个列值,因此您需要查找具有 any 的行三个值 - orin.

聚合然后计算为每个客户找到的这些值的数量(请参阅 db<>fiddle 中的第一个查询),这将包括具有 any[= 的所有客户这三个中的 42=]。

最后,having 子句过滤掉所有少于三个值的客户。如果客户的计数为 3,则他们在 table 中有三行与您要查找的值相匹配。

(这还假设他们只能拥有每个属性值一次 - 如果客户中可能存在重复项,则可以通过修改计数为 HAVING count(distinct attribute_value) = 3 - db<>fiddle 的重复项来处理.)

i need join another column mail_id from another table cst_mail

您可以在主查询中添加一个连接:

SELECT cca.cust_id, cm.mail_id
FROM Cst_Cust_Attributes cca
LEFT JOIN cst_mail cm ON cm.cust_id = cca.cust_id
WHERE cca.attribute_value IN ('REG', 'GUEST', 'EVENT')
GROUP BY cca.cust_id
HAVING count(distinct cca.attribute_value) = 3

或者将其转换为内联视图(或 CTE)并加入其中:

SELECT tmp.cust_id, cm.mail_id
FROM (
  SELECT cust_id
  FROM Cst_Cust_Attributes
  WHERE attribute_value IN ('REG', 'GUEST', 'EVENT')
  GROUP BY cust_id
  HAVING count(distinct attribute_value) = 3
) tmp
LEFT JOIN cst_mail cm ON cm.cust_id = tmp.cust_id