任何人都不存在

时间:2014-07-10 21:32:30

标签: sql

我想进行一个查询,我在其中选择表A的所有ID,这些ID将连接到表B中的end_date的现有值。 我需要获取表A的ID,这些ID只能连接到B表上的已完成ID(即现有的end_date)。 表a和b的关系是一对多。 A可以与许多B相关联。 B将始终与一个A表相关联。

我做了这样的事情:

select id 
from A 
where not exists 
(select 1 
from B 
where end_date is null 
and A.id=B.id)

这是对的吗?或者同样的事情是否有更快的查询?

EDIT: end_date位于表B

示例: 在数据集中:

A.id=1
B.id=1
B.bid=333 
B.end_date=null 

A.id=1
B.id=1
B.bid=334 
B.end_date=05/05/2014 

A.id=2
B.id=2
B.bid=335 
B.end_date=null 

A.id=2
B.id=2
B.bid=336 
B.end_date=null 


A.id=3
B.id=3
B.bid=337
B.end_date=04/04/2014 

A.id=3
B.id=3
B.bid=338 
B.end_date=04/04/2014` 

我的查询应该只得到id = 3.

3 个答案:

答案 0 :(得分:0)

假设您的表结构是

A(id)

B(id, end_date)

然后选择所有没有b.end_date(或者为null)的A.id,你可以使用这个查询

Select id
From   A
Where  id Not In (Select id From B Where end_date is Not Null)

答案 1 :(得分:0)

您可以使用LEFT JOIN之类的

select A.id 
from A a
left join B b
on a.id = b.id
and b.end_date is not null 
where b.id is null

答案 2 :(得分:0)

您没有指定DBMS,但在更高版本的SQL Server中,这可能会更快。您必须根据您的数据进行测试:

SELECT DISTINCT A.ID
FROM A
    INNER JOIN B ON A.ID = b.ID
WHERE b.End_date IS NOT NULL
EXCEPT
SELECT B.ID
WHERE b.End_date IS NULL

EXCEPT是一个集合运算符,它返回第一个集合中第二个集合中不存在的所有条目。以这种方式执行查询会为您提供两个SARGable WHERE子句而不是一个nonSARGable子查询,因此根据您的数据拓扑和物理索引,它可能会更快。