在SQL Server中编写两个类似的查询作为一个查询

时间:2016-05-12 15:35:55

标签: sql sql-server union

在下面的查询中,在我的第一次连接中,我将标识符的前3个字符与前缀表进行比较,在第二次连接中,将剩余的字符放在数据代码表中,然后在另一个表中验证数据代码。 / p>

然后我按特定的交易类型和流程以及日期范围进行过滤。

在我的第二个查询中,我通过以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**

2 个答案:

答案 0 :(得分: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')

为每个过滤器值创建变量并替换两个查询。然后,您可以在一个地方更改过滤器。

答案 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 ) )