Получить записи, у которых есть только одна запись во внешней таблице с заданным условием - PullRequest
0 голосов
/ 08 марта 2019

У меня есть таблица контрактов и территорий.Они разделяют отношения один ко многим.Я пытаюсь создать запрос, чтобы получить все контракты только в Китае.Это в основном вернуло бы мне все записи контрактов, для которых в таблице территорий есть только одна соответствующая запись с именем "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 голосов
/ 08 марта 2019

Если у всех контрактов есть территория, вы можете просто сделать:

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, то этот метод не требует дополнительной работы по устранению дубликатов в наборе результатов.

0 голосов
/ 08 марта 2019

попробуйте, как показано ниже, используя подзапрос

   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'
0 голосов
/ 08 марта 2019

Вы можете использовать ниже

select c.* from contracts c join territories t 
    on c.Id = t.contract_id 
    where not exists ( select 1 from territories t1 
                      where t1.contract_id=t.contract_id
                      and t1.name <> 'china'

                     ) and t.name='china'
0 голосов
/ 08 марта 2019

Вот возможное решение с использованием 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...