我有两个不相关的查询。我需要从列值不包含从另一个查询返回的任何值的第一个查询中选择记录。请提出一种方法。
假设,第一个查询返回以下记录:
abc_123_xyz
def_456_hij
lmn_opq
rst_uvw
假设,第二个查询返回以下记录:
123
456
预期结果是:
lmn_opq
rst_uvw
我写了一个与结果匹配的查询,它工作正常。但是当我添加NOT LIKE
条件时,它会失败。请帮忙!
select o.name
from (select pattern from PATTERN) p,
objects o
where o.name like '%'||p.pattern||'%';
假设 PATTERN 表返回 123,456
,它abc_123_xyz, def_456_hij
正确匹配值。但是,如果我在NOT LIKE
条件下执行上述查询,它无法仅返回其他两条记录。相反,它返回所有四个值。这是怎么回事?
带有 NOT LIKE 的查询将返回所有行,并且它将返回两次不匹配的行。
您正在联接这两个表,这意味着您将为第一个表中的一行和第二个表中的一行的每个组合获得一个输出行。共 8 行 (4 * 2(。
然后只有其中两行被 WHERE 过滤器拒绝 - 一行,包含 123 的那一行,被条件拒绝不像......123...(但它仍然包括其他时间,因为它确实满足条件不像...456...
你想要的是一个半连接:你想要一个表中的所有行(只计算一次!(与第二个表中的任何内容都不匹配。在像您编写的联接中,如果第一个表中的行与一种模式不匹配,则该行将包含在输出中,即使它确实与另一种模式匹配。
你需要的是这样的东西:
select name
from objects o
where not exists ( select pattern from p where o.name like '%' || pattern || '%')
;
您可以使用左连接和
select o.name
from objects o
left join PATTERN p on o.name like '%'||p.pattern||'%'
where p.pattern is null ;