我有合同和地区表。他们分享一对多的关系 。 我正在尝试创建查询以仅在中国获得所有合同。基本上,这将返回我所有在地域表中只有一个对应记录且名称为“ china”的合同记录
如果可能的话,我希望不带分组依据。因为简化了这个问题,所以我没有包括其他复杂的东西,这些东西最终将成为其中的一部分。
给出了以下示例数据。我只想获取contract4作为结果:
**contracts**
contract_id name
1 contract1
2 contract2
3 contract3
4 contract4
**territories**
id contract_id name
1 1 japan
2 1 china
3 1 india
4 2 japan
5 2 china
6 3 india
7 4 china
答案 0 :(得分:0)
以下是使用join
和partition
的解决方案:
select contract_id from
(select c.*, t.name countryname ,
ROW_NUMBER() OVER(PARTITION BY t.contract_id ORDER BY t.contract_id
DESC) rn
from contracts c join territories t
on c.contract_id = t.contract_id
) a
where rn = 1 and countryname = 'china'
答案 1 :(得分:0)
尝试使用相关子查询,如下所示
select c.*,t.* from contracts c join territories t
on c.Id = t.contract_id
where exists ( select 1 from territories t1
where t1.contract_id=t.contract_id
having count(distinct name)=1
) and t.name='china'
答案 2 :(得分:0)
您可以使用以下
function! lib#CamelCase(word)
return substitute(a:word, '_\(.\)', '\U\1', 'g')
endfunction
答案 3 :(得分:0)
如果所有合同都具有领土,则只需执行以下操作即可:
select c.*
from contracts c
where not exists (select 1
from territories t
where t.contract_id = c.contract_id and
t.country <> 'china'
);
如果您可以签订没有领土的合同,则需要检查其中是否确实存在:
select c.*
from contracts c
where not exists (select 1
from territories t
where t.contract_id = c.contract_id and
t.country <> 'china'
) and
exists (select 1
from territories t
where t.contract_id = c.contract_id and
t.country = 'china'
);
如果territories
表中的国家/地区重复,则此方法不需要任何额外的工作即可消除结果集中的重复项。