2009-05-27 45 views
0

使用SQL Server,有一個名稱值對錶。每一行基本上都是用戶標識,內容標識,部分標識,參數,值。所以我想在表格中顯示數據,例如用戶信息。每一點信息都在它自己的行中,播種如何將它放入DataSet中以便在Repeater中使用?我可以以某種方式將行合併爲一個?所以我可以在一行上獲取多個參數/值對?從名稱值對錶中獲取數據到DataSet的高效SQL過程?

那麼像......

兩行用戶32:

(param/value) 
fname/Bob 
lname/Smith 

在這樣的轉發器上顯示的一行:

Bob Smith 

任何想法?哦,是的,它的名稱/值對格式的原因是堅持所需的標準。

+0

這種設計的更常見的名稱是實體屬性值或EAV。 – 2009-05-27 04:11:48

回答

1

也許像...

SELECT fff.firstname, lll.lastname 
FROM (
    SELECT ff.value AS firstname 
    FROM PairTable AS ff 
    WHERE ff.param = 'fname' 
    AND ff.userId = 32 
) fff, (
    SELECT ll.value AS lastname 
    FROM PairTable AS ll 
    WHERE ll.param = 'lname' 
    AND ll.userId = 32 
) lll 
+0

雖然這比PIVOT更簡單,+1 – 2009-05-27 03:06:47

0

蘇茨基標準.... :)

無論如何,你最好的賭注是你的存儲過程中發揮一些魔術(光標)和你想要的格式存儲過程返回的數據。然後綁定到一個DataSet或一個字符串列表,是微不足道的。

0

另一種選擇是PIVOT

是這樣的(未經測試,因爲我沒有SQL服務器現在周圍)

SELECT UserID, [fname] AS firstname, [lname] AS lastname 
FROM 
(SELECT UserID, value, name from PairTable WHERE UserID=32) p 
PIVOT 
(
value 
FOR name IN 
([fname], [lname]) 
) AS pvt 
0

該表是可怕的。沒有冒犯;-)

關係數據庫只是不做EAV表格。

您還可以分組,並做條件CASE語句 - 就像這樣:

SELECT UserID, 
     MAX(CASE WHEN param = 'fname' THEN value ELSE '' END) AS fname, 
     MAX(CASE WHEN param = 'lname' THEN value ELSE '' END) AS lname 
FROM  MyEAVTable 
GROUP BY UserID 

樞軸語法是偉大的 - 該解決方案唯一的好處是,它會與SQL 2000正常工作。

相關問題