2013-12-11 37 views
1

對EAV數據進行搜索的最佳方法是什麼?鑑於存儲在此表中的十幾個字段,我需要能夠搜索它們的任意組合:「Jones」的姓氏和「Springfield」的城市以及「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不是一個好主意,但它不是我的應用程序。我只是圍繞別人的應用程序寫一個查詢包裝器。我無法控制應用程序或數據結構。

回答

0

我不確定爲什麼你必須自己加入3次...第一張桌子不能達到目的。

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' 

如果你的表變得這麼大,你開始看到性能問題,看看錶分區上的客戶端ID

相關問題