【问题标题】:Efficient way to check if row exists for multiple records in postgres检查postgres中多条记录是否存在行的有效方法
【发布时间】:2014-05-06 01:56:54
【问题描述】:

我看到了相关question 的答案,但无法真正将他们正在做的事情应用到我的具体案例中。

我有一个大表(300k 行),我需要有效地与另一个更大(1-2M 行)表连接。出于我的目的,我只需要知道第二个表中是否存在匹配的行。我想出了一个这样的嵌套查询:

SELECT 
  id, 
  CASE cnt WHEN 0 then 'NO_MATCH' else 'YES_MATCH' end as match_exists
FROM 
  (
   SELECT 
     A.id as id, count(*) as cnt
   FROM
     A, B
   WHERE 
     A.id = B.foreing_id
   GROUP BY A.id
  ) AS id_and_matches_count

有更好和/或更有效的方法吗?

谢谢!

【问题讨论】:

    标签: sql postgresql select query-optimization postgresql-9.3


    【解决方案1】:

    你只想要一个左外连接:

    SELECT 
       A.id as id, count(B.foreing_id) as cnt
    FROM A
    LEFT OUTER JOIN B ON
        A.id = B.foreing_id
    GROUP BY A.id
    

    【讨论】:

    • 实际上,我的尝试是错误的。感谢您提供正确的查询,但考虑到我只需要知道 count(B.foreign_id) 是 = 0 还是 > 0,有没有更有效的方法?
    • @Tomato,如果有一种方法可以为每个 A 从 B 中选择一行,则可以避免使用 GROUP BY。例如,如果存在的 B 的第一行在另一列中始终标记为 1,则可以为此添加条件并避免分组。否则,就差不多了。
    • 非常感谢您的指点!我们当前的模式中没有额外的列,因此我现在将坚持当前的方法。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多