我遇到了这个相当复杂的查询的关系代数和转换为SQL的问题:
我需要选择表A中连接到表B的所有值,其中表B中没有匹配的记录,或者存在匹配的记录,但匹配的记录集没有包含4个可能的字段之一的字段共8个值。
数据库是MySQL 5.0 ...使用InnoDB引擎进行表格。
答案 0 :(得分:3)
Select
a.*
from
a
left join
b
on
a.id=b.id
where
b.id is null
or
b.field1 not in ("value1","value2","value3","value4");
答案 1 :(得分:1)
我不确定是否有任何真正的性能改进,但另一种方式是:
SELECT
*
FROM
tableA
WHERE
id NOT IN ( SELECT id FROM tableB WHERE field1 NOT IN ("value1", "value2"));
答案 2 :(得分:0)
您的要求有点不清楚。我的第一个解释是你只需要A列,并且永远不会超过给定A行的1个实例。
select * from A where not exists (
select B.id
from B
where B.id=A.id
and B.field in ('badVal1','badVal2','badVal3','badVal4')
)
我的第二个解释是你想要所有列(A外部连接到B),如果有多个B行,可能有多个A行的实例,只要不存在具有禁止值的B行。
select * from A
left outer join B on A.id=B.id
where not exists (
select C.id
from B as C
where A.id=C.id
and C.field in ('badVal1','badVal2','badVal3','badVal4')
)
两个查询都可以使用NOT IN表示,而不是相关的NOT EXISTS。很难知道在不知道数据的情况下哪个会更快。