通过另一个 table 的值过滤 table

Filtering a table via another table's values

我有 2 个 table:

价值

+----+-------+
| id | name  |
+----+-------+
|  1 | Peter |
|  2 | Jane  |
|  3 | Joe   |
+----+-------+

过滤器

+----+---------+------+
| 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    |
+----+---------+------+

我需要从值 table 中检索值,其中相关过滤器 table 不包含类型 'B' 或 'C' 所以在这个简单的例子中,这只是乔。

请注意这是一个 DB2 数据库,我对 运行 的选择权限有限。

您可以使用 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  

参见 db<>fiddle 中的 运行 示例。

或者 NOT IN (<*fullselect*) 谓词: 只是我的结果是 'Joe',而不是 'Jane' - 数据星座会指向那个 ...

WITH
-- your input, sans reserved words
val(id,nam) AS (
          SELECT 1,'Peter' FROM sysibm.sysdummy1
UNION ALL SELECT 2,'Jane'  FROM sysibm.sysdummy1
UNION ALL SELECT 3,'Joe'   FROM sysibm.sysdummy1
)
,
filtr(id,valueid,typ) AS (
          SELECT 1,1,'A' FROM sysibm.sysdummy1
UNION ALL SELECT 2,1,'B' FROM sysibm.sysdummy1
UNION ALL SELECT 3,1,'C' FROM sysibm.sysdummy1
UNION ALL SELECT 4,1,'D' FROM sysibm.sysdummy1
UNION ALL SELECT 5,2,'A' FROM sysibm.sysdummy1
UNION ALL SELECT 6,2,'C' FROM sysibm.sysdummy1
UNION ALL SELECT 7,2,'E' FROM sysibm.sysdummy1
UNION ALL SELECT 8,3,'A' FROM sysibm.sysdummy1
UNION ALL SELECT 9,3,'D' FROM sysibm.sysdummy1
)
-- real query starts here
SELECT
  *
FROM val
WHERE id NOT IN (
  SELECT valueid FROM filtr WHERE typ IN ('B','C')
)
;
-- out  id |  nam  
-- out ----+-------
-- out   3 | Joe

或者,左连接失败:

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