Sql 通过另一个表过滤一个表';s值
我有两张桌子: 价值观 滤器Sql 通过另一个表过滤一个表';s值,sql,db2,Sql,Db2,我有两张桌子: 价值观 滤器 +----+---------+------+ | id | valueid | type | +----+---------+------+ | 1 | 1 | A | | 2 | 1 | B | | 3 | 1 | C | | 4 | 1 | D | | 5 | 2 | A | | 6 | 2 | C | | 7 | 2 | E
+----+---------+------+
| id | valueid | type |
+----+---------+------+
| 1 | 1 | A |
| 2 | 1 | B |
| 3 | 1 | C |
| 4 | 1 | D |
| 5 | 2 | A |
| 6 | 2 | C |
| 7 | 2 | E |
| 8 | 3 | A |
| 9 | 3 | D |
+----+---------+------+
我需要从值表中检索值,其中相关筛选器表不包含类型“B”或“C”
所以在这个快速的例子中,这将是唯一的乔
请注意,这是一个DB2 DB,我只有有限的权限运行selects。您可以使用
EXISTS
,如下所示:
select *
from value v
where not exists (
select null from filter f
where f.valueid = v.id and f.type in ('B', 'C')
);
结果:
ID NAME
--- -----
3 Joe
参见运行示例。您可以使用
EXISTS
,如下所示:
select *
from value v
where not exists (
select null from filter f
where f.valueid = v.id and f.type in ('B', 'C')
);
结果:
ID NAME
--- -----
3 Joe
请参阅运行示例。或a
不在(或a不在)(OP说“Jane”,你说“Peter”,我说“Joe”。LOLI使用(id)错误地加入了
而不是val.id
filter.valueid
。它毕竟是'Joe',同时修复了我的…好+1。警告一句:我通常避免不在
中,因为它在空值存在时不起作用。是的,这是我的错,我实际上在这里寻找Joe…还有第三种方法,刚刚添加到我的响应中,使用failing left join。我对DB2的了解不如以前,但是,根据DBMS的不同,这三种方法中的一种比另外两种更好。值得探索……OP说“Jane”,你说“Peter”,我说“Joe”。LOLI使用(id)错误地加入了
而不是val.id
filter.valueid
。它毕竟是'Joe',同时修复了我的…好+1。警告一句:我通常避免不在
中,因为它在空值存在时不起作用。是的,这是我的错,我实际上在这里寻找Joe…还有第三种方法,刚刚添加到我的响应中,使用failing left join。我对DB2的了解不如以前,但是,根据DBMS的不同,三种方法中的一种比另外两种更好。值得探索。。。
SELECT
val.*
FROM val
LEFT JOIN (
SELECT valueid FROM filtr WHERE typ IN ('B','C')
) filtr
ON filtr.valueid = val.id
WHERE valueid IS NULL