将复杂需求转换为SQL查询

时间:2012-07-11 00:11:00

标签: mysql sql

我遇到了这个相当复杂的查询的关系代数和转换为SQL的问题:

我需要选择表A中连接到表B的所有值,其中表B中没有匹配的记录,或者存在匹配的记录,但匹配的记录集没有包含4个可能的字段之一的字段共8个值。

数据库是MySQL 5.0 ...使用InnoDB引擎进行表格。

3 个答案:

答案 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。很难知道在不知道数据的情况下哪个会更快。