我想进行一个查询,我在其中选择表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.
答案 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子查询,因此根据您的数据拓扑和物理索引,它可能会更快。