2012-09-17 93 views
1

有一個這樣的格式爲SQL或ms-access的表格。加入sql或ms-access?

樣品

ID ID2 name class example 
1 10 John main  
2 10   
3 10   
4 10     ~ is look at me. 
5 20 Candice main  
6 20   
7 20     ~ is in Japan. 
8 20     ~ is reading a book. 
9 20   

我需要在示例性字段(A)與具有相同的ID2爲A的名稱字段的值和class =「主」來取代「〜」。我如何製作聯合語法?

結果

ID ID2 name class example 
1 10 John main  
2 10   
3 10   
4 10     John is look at me. 
5 20 Candice main  
6 20   
7 20     Candice is in Japan. 
8 20     Candice is reading a book. 
9 20   
+1

...然後去閱讀關於規範化 – podiluska

回答

0

我覺得你的表配置不正確。

事實上,您正在使用ID字段,其在表中重複的勇氣指向一個有點不好的數據庫設計。

我想你可能會得到更好的結果,在兩張表之間分割數據,其中一個帶有示例,另一個帶有「主要」類。然後,您可以通過使用ID2字段的簡單聯接來加入兩個表。

+0

altough有效,這並不回答這個問題....的OP將有問:這張桌子是3NF還是更高? – rene

0
select m.[name] & replace(b.example, "~", "") as combined 
from sample as m 
inner join sample as b on m.id2 = b.id2 
where m.[class] = "main" 
and b.example not null 
0

雖然數據是極其結構(無論何種原因),回答你的問題,你可以做這樣的:

SELECT 
    T1.[ID], 
    T1.[ID2], 
    T1.[name], 
    T1.[class], 
    iif(not isnull(T1.[Example]) and not isnull(T2.[Name]), Replace(T1.[Example], "~", T2.[Name]), null) As [Example] 
FROM 
    Data T1 
LEFT JOIN Data T2 ON (T1.[ID2] = T2.[ID2] AND T2.[Class]="main") 

這依賴於假設只有一個紀錄對於ID2的每個唯一值,class = main(否則您將重複行)。

,不使用JOIN的需求,另一種方法是這樣的:

SELECT 
    [ID], 
    [ID2], 
    [name], 
    [class], 
    (iif(not isnull([example]), Replace([example], "~", nz((select top 1 [name] from Data T2 where T2.ID2 = T1.ID2 and T2.[class]="main" order by T2.[ID2]),"")),null)) as [ExampleNew] 
FROM Data T1