在下面的查询中,在我的第一次连接中,我将标识符的前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**
答案 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 ) )