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

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

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

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

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案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';
            

            【讨论】:

              猜你喜欢
              • 2021-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-15
              • 1970-01-01
              • 2019-06-06
              • 1970-01-01
              • 2013-09-05
              相关资源
              最近更新 更多