【问题标题】:Filtering distinct rows in SQL在 SQL 中过滤不同的行
【发布时间】:2012-05-29 09:32:23
【问题描述】:

我有一个表格,其中包含 'buyer''seller''buyer_spend' 列。每次购买都显示为单独的一行,其中包含买家姓名、卖家姓名和已购买的金额。

是否可以使用单个查询来显示所有未从卖家处购买的不同买家?

例如,如果我有 “卖家 A”,我想查找所有未从卖家 A 购买的不同买家。我遇到了问题,因为以下查询返回了不适用于卖方 A,其中包括许多确实在另一行从卖方 A 购买的买家。

SELECT DISTINCT buyer WHERE seller!='Seller A';

这可能很简单,但我很难理解它。

非常感谢。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT DISTINCT buyer FROM table WHERE buyer NOT IN 
        (SELECT DISTINCT buyer FROM table WHERE seller='Seller A')
    

    【讨论】:

      【解决方案2】:
      SELECT a.buyer FROM table a WHERE Left Join table as b
      on a.id = b.id and a.seller='Seller A'
      WHERE b.id is null
      group by a.buyer
      

      【讨论】:

      • 你能更详细地解释一下你的答案吗? tnx
      • 我在 id 和 a.seller='Seller A' 上使用同一张表进行左连接。如果买家购买了 smth,b.id 会有一些含义,否则它将为空,最后我们需要
      【解决方案3】:

      我猜你想要这样的东西

      select distinct buyer from purchasetable where buyer not in (select buyer from buyertable)
      

      虽然,我是一名 SQL Server 开发人员,但我认为这仍然适用。

      【讨论】:

        【解决方案4】:

        这是一种不使用连接的替代方法:

        select buyer
        from (select buyer, max(case when seller = 'Seller A' then 1 else 0 end) as hasSellerA
              from t
              group by buyer
             ) t
        where hasSellerA = 0
        

        根据我的经验,聚合查询的性能通常比反连接好(非加入连接就是反连接)。

        【讨论】:

          【解决方案5】:
          SELECT buyer
          FROM atable
          GROUP BY buyer
          HAVING COUNT(seller = 'Seller A' OR NULL) = 0
            /* or: SUM(seller = 'Seller'A') = 0 */
          

          【讨论】:

            猜你喜欢
            • 2021-08-10
            • 1970-01-01
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 1970-01-01
            • 2021-01-11
            • 2011-11-06
            • 1970-01-01
            相关资源
            最近更新 更多