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