Присоединиться к таблице и выбрать строки, где для данного идентификатора существует только одно значение - PullRequest
3 голосов
/ 25 марта 2019

Не знаю, сделал ли я хороший заголовок, но, пожалуйста, позвольте мне визуализировать это.

enter image description here

Итак, у меня есть две таблицы, и для данного случая мне нужно выбрать строку, в которой валюта платежа была ТОЛЬКО в евро.

Идентификаторы документов будут правильными: 2, 3, 4, 5

В целом это большие таблицы с 900k + записями.

Подскажите, пожалуйста, как должен выглядеть запрос?

Ответы [ 5 ]

4 голосов
/ 25 марта 2019

использовать коррелированный подзапрос с not exists

select distinct a.document_id from tablename a inner join tablename b b on a.document_id=b.payment_docid
where not exists 
   (select 1 from tablename b1 where b1.payment_docid=b.payment_docid and currency<>'EUR')
3 голосов
/ 25 марта 2019

Попробуйте этот запрос:

select payment_docId from MyTable
group by payment_docId
having max(currency) = 'EUR'
   and min(currency) = 'EUR'

или вы можете использовать having count(*) = 1 с min или max.

1 голос
/ 25 марта 2019

Агрегация - единственная эффективная потребность:

select doc_id
from table t
group by doc_id
having min(currency) = max(currency) and min(currency) = 'EUR';
1 голос
/ 25 марта 2019

Можно использовать INNER JOIN со следующими условиями для получения всех строк:

SELECT
  pd.payment_doc_id
, pd.currency
FROM DocTable dt 
INNER JOIN PaymentDocs pd 
    ON dt.document_id = pd.payment_doc_id AND pd.currency IN ('EUR')

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

SELECT
  pd.payment_doc_id
, pd.currency
FROM DocTable dt 
INNER JOIN PaymentDocs pd 
    ON dt.document_id = pd.payment_doc_id AND pd.currency IN ('EUR')
GROUP BY   pd.payment_doc_id
         , pd.currency
1 голос
/ 25 марта 2019

использовать связанный подзапрос

select t1.* from table2 as t1
 where exists( select 1 from table2 t2 where t1.payment_docid=t2.payment_docid
                       having count(distinct currency)=1)
and currency='EUR' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...