我们有这个表和一些数据
在某些情况下,我们需要让实体获得具有特殊值的属性,并且该属性本身并不重要。
问题是我们想要获得具有属性的实体,其中value等于1并且还具有值为2的属性
以简单的方式我们需要这样的东西:
SELECT Entity_Id FROM table WHERE Value = 1 AND Value = 2
此查询不返回任何内容,因为值列只有1个值^ _ ^
实际上我们需要这样的东西
SELECT Entity_Id FROM table
GROUP BY Entity_Id
HAVING Value = 1 AND Value = 2
MsSql不支持此查询,您必须使用聚合函数。 OTL
因为在这种情况下,所有过滤器都设置在值列上 你可以将第一个查询解析成这样的东西:
SELECT
DISTINCT Entity_Id,
(SELECT COUNT(*) FROM table WHERE Value = 1 and Order_Id = outerTable.Order_Id)
*
(SELECT COUNT(*) FROM table WHERE Value = 2 and Order_Id = outerTable.Order_Id) as xxx
FROM table AS outerTable
目前我所做的是获取第一个查询谓词并将其解析为第三种形式查询。
编辑: 在第一个查询上设置的过滤器是可选的,由用户在不知道背景结构的情况下发送,他认为所有属性都保存为此实体的列 这就是为什么我解析AND到
(subQry(filter1)* subQry(filter2)* .... * subQry(filter N))
或到
(subQry(filter1)+ subQry(filter2)+ ..... + subQry(filter N))
寻找更好的解决方案^ _ ^"
提前感谢。
答案 0 :(得分:2)
除了其他答案已经提到的内容之外,还有其他两种方式:
select entity_id from table where value = 1
intersect
select entity_id from table where value = 2
select t1.entity_id from table t1
join table t2 on t1.entity_id = t2.entity_id
where t1.value = 1 and t2.value = 2
答案 1 :(得分:0)
这是一种方法:
SELECT Entity_Id
FROM table
WHERE Value in (1, 2)
GROUP BY Entity_Id
HAVING COUNT(DISTINCT value) = 2;
答案 2 :(得分:0)
您可以使用exists子句进行检查,如下所示:
SELECT Entity_Id
FROM table t1
WHERE Value = 1 AND
exists (
select 1
from table t2
where t1.entity_id = t2.entity_id and
t2.Value = 2)