2016-07-30 50 views
0

我與汽車的零部件T1,像這樣:SQL Server存儲過程連接表ON T1.ID = MID(T2.valutation)

ID Name 
------------- 
1 Tyres 
2 Gearbox 
3 Engine 
4 Body 
5 Brakes 
6 .. 

和T2與汽車與一列名單稱爲valutation包含一串數字[0-9]

ID Brand Model Color Year KKm  .... valutation 
--------------------------------------------------------------- 
1 Audi A3  Green 2014 185    86354 

valutation每個數字指的是汽車的一部分,根據其在字符串中的位置:即

8, since it is in position 1, refers to Tyres 
6, since it is in position 2, refers to GearBox 
... 
4, since it is in position 5, refers to Brakes 

我需要建立一個SQL Server存儲過程返回此

ID Brand Model Color Year KKm  Tyres GearBox Engine Body Brakes 
---------------------------------------------------------------------------------------- 
1 Audi A3  Green 2014 185  8   6  3  5  4 

我嘗試了一些解決方案,但你可以從(錯誤)見我實際上做的問題的主題並不知道需要哪種功能。

感謝

+1

這是一個非常糟糕的設計。你應該重新考慮它,而不是建立一個proc來解決它。 – dfundako

+1

您的數據庫設計存在嚴重缺陷。你必須這樣做的事實應該是你的一個非常明確的跡象。 –

回答

1

你可以使用動態SQL來做到這一點。我沒有訪問SQL服務器,因此不能檢查這一點,但我只想做:

declare @sql varchar(200) 
declare @i int 

set @sql = 'select *' 
set @i = 1 

While @i <= (select count(*) from T1) 
begin 
    set @sql = @sql + ', substring(valuation,' + cast(@i as varchar(10)) + ',1) as ' + (select name from T1 where id = @i) 
    set @i = @i + 1 
end 

set @sql = @sql + ' from T2' 

exec(@sql) 

(我複製你的「價值」,即明顯的拼寫錯誤,我認爲它的拼寫「valutation」在你的桌子上。)

+0

會很好,但我認爲你不能使用別名的選擇:-( – Joe

+0

道歉,我在我的代碼中犯了一個錯誤,現在糾正了移動引號外的select語句,並且將@i移動到外面。沒有清楚的想法,讓我知道它是否有效 –

+0

是的,現在有一些小的改變,它非常有用,非常感謝 – Joe

0

AS @dfundako指出,這是設計非常差,可能會困擾你的道路。

但是,與大多數編程一樣,「任何事情都是可能的」。

所以這裏有一個你想要的快速版本,使用CTE。

這不是一個動態版本,在這個意義上,我從查找表中硬編碼您的標籤。你可以把它從這裏:

DECLARE @t TABLE(id int, Valuation VARCHAR(50)) 

INSERT INTO @t 
    SELECT ID, Valuation FROM T2 
;WITH cte AS 
    (SELECT id, Valuation, SUBSTRING(Valuation, 1, 1) AS position_char, 1 AS ind FROM @t 
    UNION ALL 
    SELECT id, Valuation, SUBSTRING(Valuation, ind + 1, 1) AS position_char, ind + 1 FROM cte WHERE LEN(Valuation) > ind 
    ) 

SELECT T2.Model, T2.Brand, T2.Color, T2.valuation, 
    p.[1] AS 'Tyres', [2] AS 'Gearbox', [3] AS 'Engine', [4] AS 'Body', [5] AS 'Brakes' 
FROM cte 
PIVOT (MAX(position_char) 
    FOR ind IN([1],[2],[3],[4],[5])) p 
INNER JOIN T1 
    ON p.id = T1.ID 
INNER JOIN T2 
    ON T1.ID = T2.ID 

Output

你想,如果你可以改變它的正確關係結構,更像是以下幾點:

Proper Structure

+0

是的,我知道這可能是解決問題的最糟糕的方式,但是因爲它絕對不是db的核心表格。這樣做更容易處理,因爲T1不是靜態的:現在有12條記錄,但可能會上升到了40多個。我使用了這個字符串,但如果我用不同的方法重建所有的東西,可能會更好。 – Joe