SQL Query有两个IN语句

时间:2015-06-04 19:14:33

标签: sql sql-server

所以我们假设我有以下设置:

我有一个公司表,将3位代码与公司相关联。 (100,200,388等)。表名是companymaster,字段:companycode

公司可以有许多部门,由2个字母数字字符(1A,HM,A1等)表示。表名是divisionmaster,字段:companycode,divisioncode

我有一个产品,然后与特定的公司部门相关联,并有一个5位数的产品代码。表名是productmaster,字段:companycode,divisioncode,productcode

现在说我有以下几个部门:

100 1A, 100 1B, 100 HM, 388 1A, 388 HM

我想搜索特定产品的分部100 1A和388 HM,因此可以编写一个类似的查询......

select
    companycode, divisioncode, productcode
from
    productmaster
where
   companycode in ('100', '388') and
   divisioncode in ('1A', 'HM')  and
   productcode = '10010'

如果我运行此查询,当我只需要100 1A和388 HM时,我可能会从100 HM或388 1A获得产品。

如果没有像下面这样的where子句,有没有优雅地做到这一点?

 where
     (companycode = '100' and divisioncode = '1A') or
     (companycode = '388' and divisioncode = 'HM')

如果我想搜索更多的公司和部门,那么我的where子句会很棒。

2 个答案:

答案 0 :(得分:4)

对我来说似乎完全没问题。无论如何,您可以创建一个包含两列(companycodedivisioncode)的表格,并将其与您的表格连接。

DECLARE @T TABLE (companycode VARCHAR(3), divisioncode VARCHAR(2));
INSERT INTO @T (companycode, divisioncode)
VALUES ('100', '1A')
      ,('388', 'HM');

SELECT PM.companycode
      ,PM.divisioncode
      ,PM.productcode
FROM productmaster AS PM
INNER JOIN @T AS TT
    ON  PM.companycode = TT.companycode
    AND PM.divisioncode = TT.divisioncode
WHERE PM.productcode = '10010';

请注意,如果需要考虑性能,您可能需要创建一个临时表(#T)或一个真实的表(稍后再删除它),以便您可以利用索引。

答案 1 :(得分:1)

这有点天真,可能导致表扫描效率低下:CONCAT(companycode,';',divisioncode) IN ('100;1A', '388;HM')