Sql 对实体属性值数据的搜索

Sql 对实体属性值数据的搜索,sql,tsql,entity-attribute-value,Sql,Tsql,Entity Attribute Value,搜索EAV数据的最佳方法是什么?给定此表中存储的十几个字段,我需要能够搜索它们的任意组合:“琼斯”的姓氏和“斯普林菲尔德”的城市以及“1”的状态。有一个可以填写任何字段的搜索表单 显然,最终版本会更具动态性,但以下是我到目前为止得到的: SELECT DISTINCT Utility.ClientSearch.ClientId AS ClientId, cs1.FieldValue AS FirstName, cs2.FieldValue AS City FROM Utilit

搜索EAV数据的最佳方法是什么?给定此表中存储的十几个字段,我需要能够搜索它们的任意组合:“琼斯”的姓氏和“斯普林菲尔德”的城市以及“1”的状态。有一个可以填写任何字段的搜索表单

显然,最终版本会更具动态性,但以下是我到目前为止得到的:

SELECT DISTINCT Utility.ClientSearch.ClientId AS ClientId,
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City
FROM Utility.ClientSearch
LEFT OUTER JOIN Utility.ClientSearch AS cs1 
    ON cs1.ClientId = Utility.ClientSearch.ClientId 
    AND cs1.FieldName = 'LastName' 
LEFT OUTER JOIN Utility.ClientSearch AS cs2 
    ON cs2.ClientId = Utility.ClientSearch.ClientId 
    AND cs2.FieldName = 'City'
WHERE (cs1.FieldValue = 'Jones') 
    AND (cs2.FieldValue = 'Springfield')
这似乎比一百万条记录快,但我想知道这是最有效的方法,还是有更好的方法


我意识到EAV不是一个好主意,但它不是我的应用程序。我只是在为其他人的应用程序编写一个查询包装器。我无法控制应用程序或其数据结构。

我不确定为什么您必须三次自加入。。。第一张桌子不起作用

SELECT DISTINCT cs1.ClientId AS ClientId,
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City
FROM Utility.ClientSearch AS cs1 
INNER JOIN Utility.ClientSearch AS cs2 
    ON cs1.ClientId = cs2.ClientId 
WHERE cs1.FieldName = 'LastName' 
    AND cs1.FieldValue = 'Jones'
    AND cs2.FieldName = 'City'
    AND cs2.FieldValue = 'Springfield'
如果您的表变得如此之大,以至于您开始看到性能问题,请查看ClientID上的表分区