【问题标题】:Should an SQL Union or Join be used?应该使用 SQL 联合还是联接?
【发布时间】:2012-05-02 17:44:57
【问题描述】:

我正在尝试获取我拥有的 2 张桌子(患者和医生)的邮政编码和该邮政编码的呼叫次数。我通过计算邮政编码来获得#of 呼叫,例如,如果有 5 名患者的邮政编码为 79555,那么计数将为 5。如果患者表有 3 人使用该邮政编码,而医生表有 4 人,它应该返回邮政编码和 7。我尝试了下面的联合。乍一看,它看起来像我想要的,但我想总结重复的邮政编码,我可以在联合中使用 sum 函数吗?还是我必须创建一个联接?

SELECT zip_code, COUNT(zip_code) AS Num_Patient_Calls FROM patients GROUP BY zip_code
UNION ALL
SELECT zip_code, COUNT(zip_code) AS Num_Physician_Calls FROM physicians GROUP BY zip_code

编辑:解决方案 我使用 Gordon 和 dweiss 的响应来生成这个 SQL 代码。它做我想要的,即从不相关的表中获取两个可能具有或不具有相同值的字段,计算每个表中具有该值的记录数,然后将两个表的结果相加。示例:患者表中邮政编码 99709 的 6 个实例,医师表中的 1 个实例,显示值为 99709 - 7。

SELECT zip_code, SUM(Patient_Calls) FROM (
    SELECT zip_code, COUNT(zip_code) AS Patient_Calls FROM patients GROUP BY zip_code
    UNION ALL
    SELECT zip_code, COUNT(zip_code) AS Physician_Calls FROM physicians GROUP BY zip_code
) AS new_table
GROUP BY zip_code ORDER BY `new_table`.`zip_code` 

【问题讨论】:

  • 很高兴您找到了解决方案!我稍微改变了我的答案,它也应该可以工作。这与您的解决方案略有不同,但我仍然是一个很好的解决方案。

标签: mysql sql join union


【解决方案1】:

由于这些是不相关的表,您希望使用UNION。此外,COUNTSUM 是不同的函数,在这种情况下,您正在寻找 COUNT。 SUM 会将所有值相加,而COUNT 将为您提供在GROUP 中找到该行的次数。 这样的事情怎么样?

SELECT zip_code,COUNT(*) FROM (
SELECT zip_code AS Num_Patient_Calls FROM patients
UNION ALL
SELECT zip_code AS Num_Physician_Calls FROM physicians
) AS new_table
GROUP BY zip_code

【讨论】:

  • @dweiss,是否愿意通过联合子选择上的 SUM 示例来扩展答案?
  • @astander 你在我打字的时候找到了我:)。我还继续解释了为什么你想要 COUNT 而不是 SUM。
  • 这应该做我想要的。让我确定我理解它。它对工会的作用就好像它是自己的桌子一样?并且基本上做了我对个人选择所做的事情,但是由于联合,两个表中的数据?有没有关于像这样更高级的 SQL 东西的好教程?
  • 很好。如果您愿意,可以指定,您可以在子选择中使用 DISTINCT 而不是 group by,或者在子选择中使用 COUNT/GROUP BY,然后在外部选择中使用 SUM。还要尝试突出 UNION 和 UNION ALL 之间的区别
【解决方案2】:

为了回答您的问题,您需要UNION ALLFULL OUTER JOIN,因为您的邮政编码可能只有一种呼叫类型。

我会这样构建结果:

select zip_code, sum(Patient_Call) as Num_Patient_Calls,
       sum(Physician_Call) as Num_Physician_Calls,
       sum(Patient_Call + Physician_Call) as Num_Calls
from 
(
  (SELECT zip_code, 1 AS Patient_Call, 0 as Physician_Call
   FROM patients
  )
  UNION ALL
  (SELECT zip_code, 0 AS Patient_Call, 1 as Physician_Call
   FROM physicians
  )
) calls
GROUP BY zip_code

如果您多次运行此查询,您可以尝试在每个子查询中进行聚合,看看是否更快(例如,如果 zip_code 上有索引,那么它可能会更快)。

【讨论】:

  • 非常感谢您的意见!我没有使用您的确切回复,但您的回复确实让我找到了正确的答案来做我想做的事!
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2012-01-19
  • 2017-06-30
  • 2015-05-30
相关资源
最近更新 更多