连接表并选择给定 id 仅存在一个值的行

Posted

技术标签:

【中文标题】连接表并选择给定 id 仅存在一个值的行【英文标题】:Join table and pick rows where for given id exists only one value 【发布时间】:2019-03-25 07:00:23 【问题描述】:

我不知道,如果我的标题好,但请让我想象一下。

所以我有两个表,对于给定的情况,我需要选择付款货币仅为欧元的行。

正确的文档 ID 将是:2、3、4、5

这些是具有 90 万多条记录的整体更大的表。

您能建议我查询的外观吗?

【问题讨论】:

【参考方案1】:

将相关子查询与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')

【讨论】:

【参考方案2】:

试试这个查询:

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

或者您也可以将having count(*) = 1minmax 一起使用。

【讨论】:

【参考方案3】:

使用相关子查询

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' 

【讨论】:

【参考方案4】:

可以使用具有以下条件的 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')

如果你想要 distinct 行,那么你可以申请 operator 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

【讨论】:

【参考方案5】:

聚合是唯一有效的需求:

select doc_id
from table t
group by doc_id
having min(currency) = max(currency) and min(currency) = 'EUR';

【讨论】:

以上是关于连接表并选择给定 id 仅存在一个值的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL:仅选择以给定间隔与其他结果分隔的值的行

SQL 仅选择存在确切多个关系的行

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行

如何将选择限制为仅具有共同值的行?

只需要从列表中选择至少存在一个值的行

如何仅选择至少一个值与前一行发生更改的行