2016-05-12 63 views
0

在下面的查詢下面在我的第一次連接中,我將標識符的前3個字符與前綴表進行比較,在我的第二次連接中,其餘字符都放在datacode表中,那麼數據代碼在另一個表中進行驗證。在SQL Server中編寫2個類似的查詢作爲一個查詢

然後我按特定的交易類型和過程以及日期範圍進行過濾。

在我的第二個查詢中,我簡單地過濾了以Q開頭的標識符代碼,並檢查第二個字符是否是數字,然後我使用與上部查詢完全相同的過濾器進行過濾。

這個查詢抓住了我需要的東西,但是我試圖用一種方式重新編寫查詢,我不必從上面的查詢中重複這些過濾器。

SELECT DISTINCT(t1.TrackID), 
    t1.CreatedDTS, t1.ITEMode, t1.ProcessName, t1.PID, 
    t4.State, SUBSTRING(t1.ProviderNumber,1,10), 
    t1.ISA06, t1.ISA08 
FROM 
    PSVEngine.dbo.MessageZoe t1 WITH (NOLOCK) 
INNER JOIN 
    SKU.dbo.CommonPref t2 ON SUBSTRING(t1.PID,1,3) = t2.Prefix 
INNER JOIN 
    SKU.dbo.PIDS t3 ON SUBSTRING(t1.PID, 4, 9) = t3.PIDInfo 
INNER JOIN 
    SKU.dbo.PidInfo t4 ON t3.UID = t4.UID 
WHERE 
    t1.CreatedDTS BETWEEN '2016-04-01 00:00' AND '2016-05-01 00:01' 
    AND (t1.ProcessName IN ('Falcon','Zepplin') OR t1.ProcessName LIKE 'BKR%') 
    AND (SUBSTRING(t1.[InfoType], 1, 3) = '340' or SUBSTRING(t1.[InfoType], 1, 3) = '345') 

UNION 

SELECT DISTINCT(t1.TrackID), 
    t1.CreatedDTS, t1.ITEMode, t1.ProcessName, 
    t1.PID, null, SUBSTRING(t1.ProviderNumber, 1, 10), 
    t1.ISA06, t1.ISA08 
FROM 
    PSVEngine.dbo.MessageZoe t1 WITH (NOLOCK) 
WHERE 
    t1.CreatedDTS BETWEEN '2016-04-01 00:00' AND '2016-05-01 00:01' 
    AND (t1.ProcessName IN ('Falcon','Zepplin') OR t1.ProcessName LIKE 'BKR%') 
    AND (SUBSTRING(t1.[TransactionType], 1, 3) = '340' or SUBSTRING(t1.[TransactionType], 1, 3) = '345') 
    AND **t1.PID like 'Q%' and Isnumeric(SUBSTRING(t1.PID,2,1)) = 1** 

回答

-1

試試這個:

SELECT DISTINCT(t1.trackid), 
       t1.createddts, 
       t1.itemode, 
       t1.processname, 
       t1.pid, 
       CASE 
       WHEN t1.pid LIKE 'q%' 
         AND Isnumeric(Substring(t1.pid, 2, 1)) = 1 THEN NULL 
       ELSE t4.state 
       END [state], 
       Substring(t1.providernumber, 1, 10), 
       t1.isa06, 
       t1.isa08 
FROM psvengine.dbo.messagezoe t1 WITH (nolock) 
     INNER JOIN sku.dbo.commonpref t2 
       ON Substring(t1.pid, 1, 3) = t2.prefix 
     INNER JOIN sku.dbo.pids t3 
       ON Substring(t1.pid, 4, 9) = t3.pidinfo 
     LEFT JOIN sku.dbo.pidinfo t4 
       ON t3.uid = t4.uid 
WHERE t1.createddts BETWEEN '2016-04-01 00:00' AND '2016-05-01 00:01' 
     AND (t1.processname IN ('Falcon', 'Zepplin') 
       OR t1.processname LIKE 'BKR%') 
     AND (Substring(t1.[infotype], 1, 3) = '340' 
       OR Substring(t1.[infotype], 1, 3) = '345') 
     AND ((t1.pid LIKE 'Q%' 
       AND Isnumeric(Substring(t1.pid, 2, 1)) = 1) 
       OR NOT (t4.state IS NULL)) 
+0

不拾取以Q開頭並且第二個字符爲數字的記錄。 –

0

您可以在一個地方聲明變量,並將它們設置,如下所示:

declare @dateIni, @dateEnd datetime 

set @dateIni = '2016-04-01 00:00' 
set @dateEnd = '2016-05-01 00:01' 
WHERE 
    t1.CreatedDTS BETWEEN @dateIni AND @dateEnd 
    AND (t1.ProcessName IN ('Falcon','Zepplin') OR t1.ProcessName LIKE 'BKR%') 
    AND (SUBSTRING(t1.[InfoType], 1, 3) = '340' or SUBSTRING(t1.[InfoType], 1, 3) = '345') 

每個濾波器值創建變量,並在這兩個查詢替換。然後你可以在一個地方更換過濾器。

+0

功能並增加可維護性,但執行速度是時間的三倍。查詢長度超過20分鐘。 –

+0

您使用的是rig數據類型嗎? – Horaciux