获取在给定条件下外表中只有一条记录的记录

时间:2019-03-08 08:24:42

标签: sql oracle

我有合同和地区表。他们分享一对多的关系 。 我正在尝试创建查询以仅在中国获得所有合同。基本上,这将返回我所有在地域表中只有一个对应记录且名称为“ 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

4 个答案:

答案 0 :(得分:0)

以下是使用joinpartition的解决方案:

    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表中的国家/地区重复,则此方法不需要任何额外的工作即可消除结果集中的重复项。