我想这应该是SQL中常见的用例,但我找不到任何东西。
我有两个表格ITEM
和PARAMETER
由ITEM_ID
链接,看起来像这样
====ITEM=========== ====PARAMETER===============
ID | OTHER_COLUMNS ID | ITEM_ID | NAME | VALUE
=================== ============================
0 100 0 param1 xxx
1 101 1 param1 yyy
2 102 1 param2 zzz
现在我想根据参数过滤项目,但也要获取PARAMETER中没有定义值的项目。
例如,我想选择param2=zzz
的所有项目。
所以选择看起来像这样:
Select * from ITEM left join PARAMETER on ITEM.id=PARAMETER.item_id
where NAME='param2' and VALUE='zzz';
这将选择ID为1的ITEM,但不选择ID为0的ITEM,因为ITEM 0根本没有设置参数。
我唯一想到的是选择所有ID并过滤出参数存在但不匹配的ID。
select ID from ITEM where ID not in (
select ID from ITEM left join PARAMETER on ITEM.id=PARAMETER.item_id
where NAME='param2' and VALUE <> 'zzz');
这种方法很好,但是当我想要通过多个参数进行过滤时,会很快变得混乱。有没有更好的方法呢?
Oracle Dialect
答案 0 :(得分:1)
试试这个
select *
from item
left join parameter
on item.id = parameter.item_id
where name is null
or name not in ('param2') -- ('param2'[, 'paramN'])
or name = 'param2' and (value = 'zzz' or value is null)
--[or name = 'paramN' and (value = 'valueN' or value is null)]
版本2:
您的查询稍有改进(排除了一个连接):
select id
from item
where id not in (select item_id
from parameter
where name = 'param2' and value <> 'zzz'
-- or name = 'paramN' and value <> 'valueN'
);