2013-04-17 20 views
0

我需要在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日更新:

感謝這裏的建議。最後我從別處去了一個,那就是使用一個函數,並在每個需要插入值的地方調用它。它只是爲給定的人/類型/屬性組合返回適當的值。奇蹟般有效。

+0

還是你的問題很混亂。爲什麼'5:跟蹤'不在預期的結果集中。它匹配againg = st類型id(49)。 – Maximus

+0

@Sivakumar - 這是因爲它是一個特定類型的默認值,但是有一個特定於人員的值覆蓋它(valueid 432 5:pay)。 –

+0

我個人會重新設計你的數據庫。 EAV表非常難以正確安靜地運行並且運行緩慢。如果你知道你應該提前使用EAV表格是一個不好的選擇。如果你不知道然後使用一個,但在一個nosql數據庫中做,而不是這種查詢類型更優化。 – HLGEM

回答

0

sql server is null它看起來像null是你需要的,下面是一個演示使用你的演示架構。

SELECT isnull(p.atributeid,t.typeid) AS foo 
FROM table1 as T 
LEFT JOIN table4 AS p ON p.personid = t.personid 
+0

謝謝,我會在早上好好看看這個。第一個反應:這是否允許我們訪問該值(t4.value,由於清晰度編輯爲t4.attributevalue)?它看起來第一眼就是告訴我們是否使用personid或typeid,這不是我想到的。 (我可能還沒有完全理解......) –

+0

左連接是發生魔法的地方。如果table4中沒有行匹配table1中的一行,那麼它將返回null。既然如此,那麼isnull就會像這樣運行。如果Table4.atributeid爲null,則返回table1.typeid – gh9

0

我想這就是你要找的。看一下這個。

SELECT isnull(p.attributevalue ,p1.attributevalue) AS foo 
    FROM table1 as T 
    LEFT JOIN table4 AS p ON p.personid = t.personid 
    LEFT JOIN table4 p1 ON p1.typeid = t.typeID 
+0

非常感謝您的輸入;我現在已經能夠嘗試這個,但它還沒有返回我正在尋找的東西。我已經編輯了我的原始查詢,包含詳細信息和示例數據/結果。如果您有進一步的建議,他們將非常感謝! –

相關問題