连接表并选择给定 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(*) = 1
与min
或max
一起使用。
【讨论】:
【参考方案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 仅存在一个值的行的主要内容,如果未能解决你的问题,请参考以下文章