2011-06-14 67 views
2

我有三張表; tblProducts和tblOption和tblOptionValue。 (T-SQL)連接動態SQL列

我得到使用此查詢我的產品的所有可能的組合:

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT 
SET @ProductId = 69 
SET @Query = '' 

DECLARE CC CURSOR FOR 
SELECT DISTINCT OptionID 
FROM tblOption 
WHERE ProductId = @ProductId 

OPEN CC 
FETCH NEXT FROM CC INTO @ProductOptionGroupId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+ 
       +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN ' 
    FETCH NEXT FROM CC INTO @ProductOptionGroupId 
END 
CLOSE CC 
DEALLOCATE CC 
SET @Query = 'SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10) 
PRINT @Query 
EXEC sp_executesql @Query 

發現here感謝@Lamak 我就適應我的數據庫,但我需要:

A)找到一個方法來把所有數據傳回在一列中,而不是多列
B)命名tblOptionValue.Name列同相關tblOption.Name場

關於我如何實現上述目標的想法?

非常感謝

更新:我設法實現自己的目標,使用下面的查詢:

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT, @cName  VARCHAR(300) 
SET @ProductId = 70 
SET @Query = '' 

DECLARE CC CURSOR FOR 
SELECT DISTINCT OptionID 
FROM tblOption 
WHERE ProductId = @ProductId 

OPEN CC 
FETCH NEXT FROM CC INTO @ProductOptionGroupId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @cName = (SELECT Name FROM tblOption WHERE [email protected]) 
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name as '[email protected]+' FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID INNER JOIN tblProduct on tblOption.ProductID=tblProduct.ProductID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+ 
       +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '  
    FETCH NEXT FROM CC INTO @ProductOptionGroupId 
END 
CLOSE CC 
DEALLOCATE CC 
SET @Query = 'SELECT t2.*, t1.* FROM (SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10) 
SET @Query = @Query + ') as t1, 
(SELECT * FROM tblProduct WHERE ProductID=70) as t2' 

PRINT @Query 
EXEC sp_executesql @Query 
+3

我真的沒有看到光標的需要。 – ingo 2011-06-14 18:50:10

+0

@ingo感謝您的反饋,我並不完全確定我需要光標。然而,我沒有其他想法如何構建我的查詢來實現我所需要的。有什麼建議麼?謝謝 – Leigh 2011-06-15 11:00:28

+0

嘗試將其寫爲「正常」查詢。我很樂意從那裏幫助你 – ingo 2011-06-15 21:07:30

回答

2

把用戶的溶液進入一個答案。

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT, @cName  VARCHAR(300) 
SET @ProductId = 70 
SET @Query = '' 

DECLARE CC CURSOR FOR 
SELECT DISTINCT OptionID 
FROM tblOption 
WHERE ProductId = @ProductId 

OPEN CC 
FETCH NEXT FROM CC INTO @ProductOptionGroupId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @cName = (SELECT Name FROM tblOption WHERE [email protected]) 
    SET @Query = @Query + '(SELECT DISTINCT tblOptionValue.Name as '[email protected]+' FROM tblOptionValue INNER JOIN tblOption on tblOptionValue.OptionID = tblOption.OptionID INNER JOIN tblProduct on tblOption.ProductID=tblProduct.ProductID WHERE tblOptionValue.OptionId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND tblOption.ProductId='+CAST(@ProductId AS VARCHAR)+ 
       +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '  
    FETCH NEXT FROM CC INTO @ProductOptionGroupId 
END 
CLOSE CC 
DEALLOCATE CC 
SET @Query = 'SELECT t2.*, t1.* FROM (SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10) 
SET @Query = @Query + ') as t1, 
(SELECT * FROM tblProduct WHERE ProductID=70) as t2' 

PRINT @Query 
EXEC sp_executesql @Query 
+0

+1看起來像是一個很好的解決方案 – 2011-08-03 18:10:22