使用Not in,Like和select SQL

时间:2014-07-21 02:55:52

标签: sql sql-server sql-server-2008

表1:

OwnerID    CompanyFormula
a               a+b
b               b+c
c               c+d

表2:

CompanyID
a
b
c
d
e
f

我正在尝试编写一个SQL语句来检索表1的CompanyID或表1的OwnerID中没有的任何CompanyFormula,这意味着它只应返回CompanyID } f

我的SQL:

Select Distinct CompanyID from 
(
   Select CompanyID
   from table2
   where CompanyID not in (Select OwnerID from table1)  

   union

   --Error and I need to select the CompanyID not companyFormula
   Select CompanyFormula not like '%'+(Select CompanyID from table1)  +'%'
)

错误:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我需要加入吗?如何使用第二行来获取CompanyID而不是CompanyFormula

1 个答案:

答案 0 :(得分:3)

我会使用not existsfind_in_set()执行此操作:

select *
from table2 t2
where not exists (
   select 1
   from table1 t1
   where t1.OwnerId = t2.CompanyId
   or find_in_set(t2.CompanyId, replace(t1.CompanyFormula, '+', ','))
);

请注意,在表1中,您似乎在字符串字段中存储了某些内容的列表。这通常是个坏主意。您应该考虑规范化您的数据结构,以便表1为每个所有者提供多行,每行包含一个公司。

编辑:

在SQL Server(或任何其他数据库)中,您将使用like

使用类似的逻辑
select *
from table2 t2
where not exists (
   select 1
   from table1 t1
   where t1.OwnerId = t2.CompanyId
   or '+' + t1.CompanyFormula + '+' like '%+' + t2.CompanyId + '+%'
);

其他分隔符('+' s)是为了防止部分匹配(比如匹配“then”表示“hen”)。