2015-04-15 26 views
0

這個查詢給了我想要的結果,但我無法每次都運行這個查詢。這2個循環耗費了我所有的費用。所以我需要實現類似view.But的東西,但是邏輯中包含臨時表那麼,還有沒有其他的方式來存儲這個結果或者改變查詢,這樣會使我花費更少。如何調整以下查詢?

DECLARE @Temp TABLE (
    [SiteID] VARCHAR(100) 
    ,[StructureID] INT 
    ,[row] DECIMAL(4, 2) 
    ,[col] DECIMAL(4, 2) 
    ) 
DECLARE @siteID VARCHAR(100) 
    ,@structureID INT 
    ,@struct_row INT 
    ,@struct_col INT 
    ,@rows_count INT 
    ,@cols_count INT 
    ,@row INT 
    ,@col INT 

DECLARE structure_cursor CURSOR 
FOR 
SELECT StructureID 
    ,SiteID 
    ,Cols/8.5 AS Cols 
    ,Rows/11 AS Rows 
FROM Structure 
WHERE SellerID = 658 --AND StructureID = 55 

OPEN structure_cursor 

FETCH NEXT 
FROM structure_cursor 
INTO @structureID 
    ,@siteID 
    ,@struct_col 
    ,@struct_row 

SELECT @rows_count = 1 
    ,@cols_count = 1 
    ,@row = 1 
    ,@col = 1 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    WHILE @row <= @struct_row 
    BEGIN 
     WHILE @col <= @struct_col 
     BEGIN 
      --PRINT 'MEssage'; 
      INSERT INTO @Temp (
       SiteID 
       ,StructureID 
       ,row 
       ,col 
       ) 
      VALUES (
       @siteID 
       ,@structureID 
       ,@rows_count 
       ,@cols_count 
       ) 

      SET @cols_count = @cols_count + 1; 
      SET @col = @col + 1; 
     END 

     SET @cols_count = 1; 
     SET @col = 1; 
     SET @rows_count = @rows_count + 1; 
     SET @row = @row + 1; 
    END 

    SET @row = 1; 
    SET @col = 1; 
    SET @rows_count = 1; 

    FETCH NEXT 
    FROM structure_cursor 
    INTO @structureID 
     ,@siteID 
     ,@struct_col 
     ,@struct_row 
END 

CLOSE structure_cursor; 

DEALLOCATE structure_cursor; 

SELECT * FROM @Temp 

Image 1 Image 2

+0

請張貼樣本數據和預期的輸出。 –

+0

我實際上將表1轉換爲上表中的圖2.因此,我可以在我的查詢中進一步使用第二個表來加入並獲得輸出 –

回答

1

您可以生成行數和列數,然後使用CROSS APPLY,如下所示。我遺漏了您的SellerID條件。

;WITH Cols 
AS 
(
    SELECT StructureID, SiteID, CAST(Cols/8.5 AS INT) AS Col 
    FROM Structure 
    UNION ALL 
    SELECT s.StructureID, s.SiteID, Col - 1 
    FROM Structure s 
     INNER JOIN Cols c ON s.StructureID = c.StructureID AND s.SiteID = c.SiteID 
    WHERE Col > 1 
) 
, Rows 
AS 
(
    SELECT StructureID, SiteID, CAST(Rows/11 AS INT) AS Row 
    FROM Structure 
    UNION ALL 
    SELECT s.StructureID, s.SiteID, Row - 1 
    FROM Structure s 
     INNER JOIN Rows r ON s.StructureID = r.StructureID AND s.SiteID = r.SiteID 
    WHERE Row > 1 
) 
--INSERT INTO @Temp (SiteID, StructureID, row, col) 
SELECT s.SiteID, s.StructureID, r.Row, c.Col 
FROM Structure s 
    CROSS APPLY Cols c 
    CROSS APPLY Rows r 
WHERE s.StructureID = c.StructureID AND s.SiteID = c.SiteID 
    AND s.StructureID = r.StructureID AND s.SiteID = r.SiteID 
+0

謝謝!這也幫助我創建了視圖。可以詳細說明如何在CTE上面執行Col-1 .. –

+1

這是一個遞歸CTE。你在錨點設置了最高數字(col/row)(行/ 11和Cols/8.5),然後在遞歸成員中繼續減去,直到你達到1. –

+0

太棒了!非常感謝。 –

2

與基於集合的操作執行此操作。我覺得你只是想insert . . . select

INSERT INTO @Temp (SiteID, StructureID, row, col) 
    SELECT StructureID, SiteID, Cols/8.5 AS Cols, Rows/11 AS Rows 
    FROM Structure 
    WHERE SellerID = 658; 

你應該避免的遊標,除非你真的需要他們出於某種原因(如調用存儲過程或使用各行的動態SQL)。

編輯:

讀邏輯,它看起來像你想基於每行的限制插入行。你仍然不想使用遊標。爲此,您需要一個數字生成器,並且如果它有足夠的行,則是一個方便的數字生成器。因此:

with n as (
     select row_number() over (order by (select null)) as n 
     from master..spt_values 
    ) 
INSERT INTO @Temp (SiteID, StructureID, row, col) 
    SELECT StructureID, SiteID, ncol.n/8.5 AS Cols, nrow.n/11 AS Rows 
    FROM Structure s JOIN 
     n ncol 
     ON ncol.n <= s.struct_col CROSS JOIN 
     n nrow 
     ON nrow <= s.struct_row 
    WHERE SellerID = 658; 
+0

好吧,我會嘗試它,並儘快讓你回來..謝謝! ! –

0

我們可以通過使用CROSS APPLYCTE做到這一點。

CREATE TABLE Structure(SiteID varchar(20), StructureID int, 
Cols decimal(18,2), [Rows] decimal(18,2)) 

INSERT INTO Structure (SiteID, StructureID, Cols, [Rows]) 

VALUES 

('MN353970', 51,17,22), 
('MN272252', 52,17,11) 


;WITH RowCTE([Rows]) AS 
(
    SELECT 1 
    UNION ALL 
    SELECT 2 
), 
ColCTE(Cols) AS 
(
    SELECT 1 
    UNION ALL 
    SELECT 2 
) 

SELECT SiteID, StructureID, R.Rows, C.Cols 
FROM Structure s 
CROSS APPLY 
    (
     SELECT Cols FROM ColCTE 
    ) C 
CROSS APPLY 
    (
     SELECT [Rows] FROM RowCTE 
    ) R 

Sql Fiddle Demo

+0

嗨selva ..我看着你的代碼..邏輯似乎沒問題,但看着siteID MN272252 ..它應該只創建2行而不是4行,因爲它,Cols/8.5 AS Cols和行/ 11 AS行。這意味着2x1應該作爲輸出。輸出應該是動態的。 –