SQL JOIN - 在一对多关系中仅选择满足所有条件的记录
SQL JOIN - Selecting only records that meet ALL criteria in a 1-to-many relationship
这是一个 sybase 数据库,它遵循 t-sql 语法(same/similar 到 MSSQL)。
我有2张桌子,箱子和保险。
CASES insurance
----- ---------
casenum ins_id
date_resolved
case_num
每个案例编号都有多个关联的保险条目,并且每个保险条目都有一个日期解决字段。
我想做的是 return 只有所有相关保险条目的案例编号 date_resolved = null。
我得到的是空的案例编号和相关的保险条目。
例如,如果一个案件编号有 3 个保险条目,其中 2 个条目为空 date_resolved,但 1 个 的值在 date_resolved,我的查询将 return 个案编号,因为这 2 个条目为空。
这是我尝试过的方法:
select casenum
from cases
left join (select date_resolved from insurance where date_resolved is null) ins
on ins.case_num = cases.casenum
select casenum
from cases
inner join insurance on cases.casenum = insurance.case_num
where insurance.date_resolved is null
如果这是初学者的错误,我很抱歉,我搜索了论坛并发现了许多类似的问题,但是 none 似乎解决了我的问题。
编辑 -
使用下面提供的答案之一,我将其合并到我的查询中并最终得到类似这样的结果(我相信它有效):
select casenum, *other stuff*
from cases
inner join (select i.case_num from insurance i group by i.case_num having max(date_resolved) is null) ins
on ins.case_num = cases.casenum
where *other stuff from cases table*
and *more stuff from cases table*
非常感谢!
一种方法是聚合:
select i.case_num
from insurance i
group by i.case_num
having max(date_resolved) is null;
或者,您可以使用 not exists
:
select c.*
from cases c
where not exists (select 1
from insurance i
where i.case_num = c.case_num and i.date_resolved is not null
);
请注意,这些不等同。在 insurance
.
中没有行的第二个 returns cases
这是一个 sybase 数据库,它遵循 t-sql 语法(same/similar 到 MSSQL)。
我有2张桌子,箱子和保险。
CASES insurance
----- ---------
casenum ins_id
date_resolved
case_num
每个案例编号都有多个关联的保险条目,并且每个保险条目都有一个日期解决字段。
我想做的是 return 只有所有相关保险条目的案例编号 date_resolved = null。
我得到的是空的案例编号和相关的保险条目。
例如,如果一个案件编号有 3 个保险条目,其中 2 个条目为空 date_resolved,但 1 个 的值在 date_resolved,我的查询将 return 个案编号,因为这 2 个条目为空。
这是我尝试过的方法:
select casenum
from cases
left join (select date_resolved from insurance where date_resolved is null) ins
on ins.case_num = cases.casenum
select casenum
from cases
inner join insurance on cases.casenum = insurance.case_num
where insurance.date_resolved is null
如果这是初学者的错误,我很抱歉,我搜索了论坛并发现了许多类似的问题,但是 none 似乎解决了我的问题。
编辑 - 使用下面提供的答案之一,我将其合并到我的查询中并最终得到类似这样的结果(我相信它有效):
select casenum, *other stuff*
from cases
inner join (select i.case_num from insurance i group by i.case_num having max(date_resolved) is null) ins
on ins.case_num = cases.casenum
where *other stuff from cases table*
and *more stuff from cases table*
非常感谢!
一种方法是聚合:
select i.case_num
from insurance i
group by i.case_num
having max(date_resolved) is null;
或者,您可以使用 not exists
:
select c.*
from cases c
where not exists (select 1
from insurance i
where i.case_num = c.case_num and i.date_resolved is not null
);
请注意,这些不等同。在 insurance
.
cases