2016-03-22 61 views
0

我對SQL查詢不是很熟悉,但我想將我在代碼級別上執行的多個查詢移動併合併到服務器,以加速並簡化它。目前這隻需要幾秒鐘,即使只有5-10個項目。SQL查詢簡化 - 如何在SQL Server中執行代碼中的任務?

我有一個視圖和一個表,我們稱它們爲View1,Table1。

我的第一個查詢:

SELECT UnitSerialNumber 
FROM Table1 
WHERE OrderID = 1234 
    AND IsActive = 1 
ORDER BY SerialNumberDate, IsPrinted 

這將返回一個列表(每個項目是一個獨特的UnitSerialNumber),這我循環通過......

BEGINNING OF LOOP

SELECT ResultId 
FROM View1 
WHERE Data = UnitSerialNumber 
    AND ItemId = 338 
    AND StatusId = 2 

這返回一個值(ResultId),我在查詢中使用...

SELECT Data 
FROM View1 
WHERE ID = ResultId 
    AND (ItemId = 311 OR ItemId = 313) 
    AND StatusId = 2 
ORDER BY ItemId 

(我知道這個表結構是廢話,但我不能用它做任何事情,這是數據存儲的方式。)所以這返回一個帶有2個值的對象。

END OF LOOP

+1

這是如何返回兩個值?我只看到一個。此外,如果您有樣本數據和期望的結果,您的邏輯將更容易遵循。 –

+0

5-10個項目?好的,但哪個部分實際上是項目的參數? –

+0

你可以做這樣的:從表1 T1選擇t1.UnitSerialNumber,v1.ResultId,v2.Data 內連接視圖1 V1 上t1.UnitSerialNumber = v1.Data 內連接視圖1在V2 v2.ID = v1.ResultId 其中t1.OrderID = 1234 AND t1.IsActive = 1 AND v1.ItemId = 338 AND v1.StatusId = 2 AND v2.ItemIdin(311313) AND v2.StatusId = 2 爲了通過v2.itemid –

回答

0

我給子查詢與嘗試,這是爲我工作。感謝大家試圖幫助!

SELECT View1.Data, View1.ItemId, z.SerialNumberDate, z.IsPrinted 
    FROM View1 
    JOIN 
    (
      SELECT View1.Id, x.SerialNumberDate, x.IsPrinted 
      FROM View1 
      JOIN 
      (
        SELECT UnitSerialNumber, SerialNumberDate, IsPrinted 
        FROM Table1 
        WHERE OrderID = 613 AND IsActive = 1 
      ) 
      AS x ON View1.Data = x.UnitSerialNumber 
    ) 
    AS z ON View1.DataCardId = z.Id 
    WHERE View1.ItemId = 313 AND z.IsPrinted IS NULL 
    ORDER BY z.IsPrinted,z.SerialNumberDate 
0

熱膨脹係數是這樣的查詢相結合的簡單方法:

with q1 as (
     SELECT UnitSerialNumber, SerialNumberDate, IsPrinted 
     FROM Table1 
     WHERE OrderID = 1234 AND IsActive = 1 
    ), 
    q2 as (
     SELECT ResultId, SerialNumberDate, IsPrinted 
     FROM View1 
     WHERE ItemId = 338 AND StatusId = 2 AND 
      Data in (SELECT UnitSerialNumber FROM q1) 
    ) 
SELECT q2.ResultId, v.Data 
FROM q2 JOIN 
    View1 v 
    ON v.ID = q2.ResultId 
WHERE v.itemId IN (311, 313) AND v.StatusId = 2 
ORDER BY a2.SerialNumberDate, q2.IsPrinted, v.ItemId; 
+0

感謝您的幫助,不幸的是這返回沒有結果。 – Steven

+0

@Steven。 。 。這似乎很奇怪。你能確定兩個CTE是否返回行。 –

+0

Q1本身就很好。 Q2沒有Seri​​alNumberDate和IsPrinted,如果我替換爲Data ='xxxx',它也可以正常工作。我禁用了部分命令,然後運行整個命令,並返回沒有結果:/ – Steven

0
SELECT 
    v1.Data 
FROM 
    View1 v1 
JOIN 
    View1 v2 
     ON v1.ID = v2.ResultId 
JOIN 
    Table1 t 
     ON v2.Data = t.UnitSerialNumber 
WHERE 
    (v1.ItemId = 311 OR v1.ItemId = 313) 
    AND v1.StatusId = 2 
    AND v2.ItemId = 338 
    AND v2.StatusId = 2 
    AND t.OrderID = 1234 
    AND t.IsActive = 1 
ORDER BY 
    v1.ItemId; 
+0

感謝您的幫助,不幸的是,這返回沒有結果。 – Steven