【问题标题】:SQL: Count two different columns from two different tablesSQL:从两个不同的表中计算两个不同的列
【发布时间】:2014-01-10 16:20:33
【问题描述】:

我正在尝试获取两个不同表的资源列的不同计数,然后显示每个项目 ID 的比较。现在,这个查询为我提供了两个表的相同计数值。

select 
    t1.PRJCT_ID,
    count(t1.RSRC_ID) as TBL1_RSRC_CNT,
    t2.PRJCT_ID,
    count(t2.RSRC_ID) as TBL2_RSRC_CNT
from
    DATA_TABLE_1 t1
LEFT OUTER JOIN 
    DATA_TABLE_2 t2 on t1.PRJCT_ID = t2.PRJCT_ID
GROUP BY
    t1.PRJCT_ID, t2.PRJCT_ID
order by 1

【问题讨论】:

  • 您是否同时按t1.PRJCT_IDt2.PRJCT_ID 进行分组,因为您想查看第一个表中不存在于第二个表中的项目?否则,连接条件t1.PRJCT_ID = t2.PRJCT_ID 确保两者始终相同。
  • 您是否尝试在 COUNT 中添加 DISTINCT?

标签: sql sql-server tsql


【解决方案1】:

当然,你会得到同样的计数,你正在计算同一个表的列(这是通过连接创建的,被授予,但它仍然是一个矩形表)。

您想要做的是使用子查询。首先获取每个项目 id 的列表(来自一个表,或者解析两个有问题的表的联合,但这是数据库规范化不良的标志),然后独立查询这些表的数量:

select p.ID,
  (select count(*) from DATA_TABLE_1 t1 where t1.ID=p.ID) Count1,
  (select count(*) from DATA_TABLE_2 t2 where t2.ID=p.ID) Count2
from projects p

【讨论】:

  • 使用count(1) - 性能优于count(*)
  • 不,它没有,请不要在此处吐出您在 Internet 上看到的内容,并在查询中运行 explain 以亲自查看。
【解决方案2】:

注意:我想你在某个地方有一个 PROJECT 表。 我认为最好的方法是使用两个子查询。这样,您将拥有所有项目,即使是那些没有任何资源的项目。就像是:

SELECT 
    p.PRJCT_ID,
    ( SELECT COUNT(*) FROM DATA_TABLE_1 t1 WHERE t1.PRJCT_ID = p.PRJCT_ID ) AS TBL1_RSRC_CNT,
    ( SELECT COUNT(*) FROM DATA_TABLE_2 t2 WHERE t2.PRJCT_ID = p.PRJCT_ID ) AS TBL2_RSRC_CNT
FROM PROJECT p
ORDER BY p.PRJCT_ID

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多