比 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 的行三个值 - or
或 in
.
聚合然后计算为每个客户找到的这些值的数量(请参阅 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
还有其他搜索方式吗?
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 的行三个值 - or
或 in
.
聚合然后计算为每个客户找到的这些值的数量(请参阅 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