我需要在SQL Server數據庫上創建一個視圖,其中一列可以從兩個來源中的任何一個繪製,具體取決於存在的內容。具體地,我們有一系列這樣的表(簡化):如何選擇值如果存在或其他如果不存在SQL Server視圖
表1:
personid
typeid (one of the values from Table2)
surname
forename
etc...
表2:
typeid
typename
etc...
表3:
attributeid
attributename
etc...
表4:
valueid
attributeid (one of the values from table3)
typeid (one of the values from table2)
personid (one of the values from table1)
attributevalue
etc...
現在,我需要選擇(特別)「attibutevalue」從表4適用於一個人的價值。這看起來很簡單(加入personid,你就完成了),但並不那麼簡單。表4中的personid可能沒有任何行,在這種情況下,我們需要默認與該類型關聯的屬性值。換句話說,在邏輯上,它是
if (there exists an attributevalue in t4 associated with personid)
use it
else
use attributevalue in t4 associated with typeid
我希望這是明確的。我一直試圖弄清楚它是否可以通過一些微妙的聯接來完成,或者合併,但一直未能弄清楚。
不幸的是,我沒有太多與SQL實行這樣一些指針,將不勝感激!
最後,我想T爲能寫使用T3與attributeName(因此包括在這裏),但對於現在的癥結是剛開每個屬性的權值的查詢。 (!太長了評論):提前
編輯
由於更新響應以下建議:
感謝您的輸入。我試過這個,但它沒有返回我們所期望的。下面是數據的一個樣本:
表1:
PersonID 184
TypeID 49
...etc...
表4:
valueid 423 424 425 426 431 432
attributeid 4 5 6 7 6 5
typeid 49 49 49 49 49 49
personid NULL NULL NULL NULL 184 184
attributevalue yes track no no yes pay
etc...
那麼我們預計,作爲人的ID屬性值184
4: yes
5: pay
6: yes
7: no
(默認爲與沒有與非空personid相關聯的值相關的相關typeid的值)
修改查詢非常輕微爲了清楚起見到:
SELECT distinct t.id, p.AttributeID, isnull(p.attributevalue, p1.attributevalue) AS attributevalue
FROM table1 as T
LEFT JOIN table4 AS p ON p.personID = t.personID
left JOIN table4 p1 ON p1.typeID = t.typeID
where t.ID=184
我們回去
id AttributeID attributevalue
184 5 pay
184 6 yes
因此,正確地拉了回來,那裏是一個特定的PERSONID重寫的值,但不是默認值。
更多的想法將不勝感激!
再次感謝
月2日更新:
感謝這裏的建議。最後我從別處去了一個,那就是使用一個函數,並在每個需要插入值的地方調用它。它只是爲給定的人/類型/屬性組合返回適當的值。奇蹟般有效。
還是你的問題很混亂。爲什麼'5:跟蹤'不在預期的結果集中。它匹配againg = st類型id(49)。 – Maximus
@Sivakumar - 這是因爲它是一個特定類型的默認值,但是有一個特定於人員的值覆蓋它(valueid 432 5:pay)。 –
我個人會重新設計你的數據庫。 EAV表非常難以正確安靜地運行並且運行緩慢。如果你知道你應該提前使用EAV表格是一個不好的選擇。如果你不知道然後使用一個,但在一個nosql數據庫中做,而不是這種查詢類型更優化。 – HLGEM