查询类似EVA的模型

时间:2015-03-08 16:53:58

标签: sql sql-server tsql

我们有这个表和一些数据

Table schema

Table data

在某些情况下,我们需要让实体获得具有特殊的属性,并且该属性本身并不重要。

问题是我们想要获得具有属性的实体,其中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))

寻找更好的解决方案^ _ ^"

提前感谢。

3 个答案:

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