表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
?
答案 0 :(得分:3)
我会使用not exists
和find_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”)。