使用来自同一对象的多个 <> 条件编写 WHERE 子句的更好方法

Better way to write a WHERE clause with multiple <> conditions from same object

我已经为 return 附加到订单的组件的尺寸创建了一个声明。我遇到的问题是查询 returns 订单上的所有组件,例如与我无关的交货和包装。总共有超过 45 个我不想看到的组件。为了排除这些,我在 WHERE 子句中加入了所有我不想看到的内容。我的问题是我觉得这不是我处理多个 AND 列表的最佳方式。

为了省去麻烦,我将主要查询放在下面,并且只放了 where 子句的一部分

SELECT

Job_0.JobJobNumber AS 'Job Number'
,Job_0.JobEstimateNumber AS 'Estimate Number'
,Component_0.CooComponentDescription AS 'Component'
,Component_0.CooMfsDescription AS 'Finished Size'
,Component_0.CooDownSize AS 'Down Size'
,Component_0.CooAcrossSize AS 'Across Size'
,Component_0.CooDownFactor AS 'Down Gap'
,Component_0.CooAcrossFactor AS 'Across Gap'
,MasterWorkingSize_0.MwsDescription AS 'Working Size'
,MasterWorkingSize_0.MwsMinimumWidth AS 'Width'
,MasterWorkingSize_0.MwsMinimumLength AS 'Length'

FROM
SBS.PUB.Job Job_0
JOIN SBS.PUB.Component Component_0 ON Job_0.JobID = Component_0.JobID
JOIN SBS.PUB.WorkingSize Workingsize_0 ON Job_0.JobID = WorkingSize_0.JobID
JOIN SBS.PUB.MasterWorkingSize MasterWorkingSize_0 ON WorkingSize_0.MasterworkingsizeID = MasterWorkingSize_0.MasterworkingsizeID

WHERE

Job_0.JobID > 254677392
AND Component_0.CooComponentDescription <> 'Packing'
AND Component_0.CooComponentDescription <> 'Delivery'
AND Component_0.CooComponentDescription <> Packing in 1,000s
AND Component_0.CooComponentDescription <> Finish Pad of Sets
AND Component_0.CooComponentDescription <> Part Outsourced
AND Component_0.CooComponentDescription <> Finishing Booklets
AND Component_0.CooComponentDescription <> Packing - band in 50s
AND Component_0.CooComponentDescription <> Small Job Uplift £10
AND Component_0.CooComponentDescription <> Packing band in 50s

我想知道除了我上面所做的之外还有更好的方法来嵌套这些吗?就像您在 CASE WHEN 语句中所做的一样。我希望看到的是 AND Component_0.CooComponentDescription <>('Packing', 'Delivery', Packing in 1,000s,etc,etc)

你似乎想要not in:

Component_0.CooComponentDescription not in ('Packing', 'Delivery', 'Packing in 1,000s', etc, etc)

我将使用的方法是创建一个新的 table,其中有一列列出您的排除项,然后使用:


    SELECT columns
       FROM SBS.PUB.Job Job_0
       JOIN SBS.PUB.Component Component_0 ON Job_0.JobID = Component_0.JobID
       LEFT JOIN ExcludeComponent exc ON exc.CooComponentDescription = Component_0.CooComponentDescription
       WHERE exc.CooComponentDescription IS NULL

然后用您的 45 项列表填充 ExcludeComponent.CooComponentDescription1。这里的优点是,这比将所有术语都放在查询中更具动态性。