【问题标题】:inner join to find number of items in the same revision number内部联接以查找相同修订号中的项目数
【发布时间】:2016-03-28 16:43:15
【问题描述】:

我有以下表格

tblMainequipment
asset_id   rev    equipment_name
123        0      box
123        1      box 
124        0      box 
125        0      bottle  

tblmainswablocation
asset_id   rev   swab_location
123        0     cover
123        0     base
123        1     cover
123        1     base
123        1     lock
124        0     cover
124        0     base
125        0     tube
125        0     cover

我确实想获取特定资产 ID 的最大转速的拭子位置总数。例如,asset_id 123 rev 0 的拭子位置总数为 2,但 rev 1 为 3。过去几个小时我一直在试图弄清楚,但似乎找不到解决方案。我对连接很不好。以下显示了我想要得到的,

query
asset_id   maxrev    #swablocation  equipment_name
123        1         3              box
124        0         2              cover
125        0         2              bottle

我使用下面的sql

SELECT MEQ.*
FROM tblMainEquipment AS MEQ 
INNER JOIN (Select asset_id, max(rev) as maxrev     
            From tblmainequipment  GROUP By asset_id)  AS groupmeq ON 
            (MEQ.asset_id = groupmeq.asset_id) AND (MEQ.rev = groupmeq.maxrev)

我不确定如何将#swablocation 添加到我的查询中。

【问题讨论】:

  • 您如何定义#swablocation?这是一个计数,一个身份证号码吗?
  • 那将是一个计数,我将编辑我的帖子以使其更清晰

标签: sql ms-access ms-access-2007


【解决方案1】:

这是一种使用相关子查询的方法:

select me.*,
       (select count(*)
        from tblmainswablocation as sl
        where sl.asset_id = me.asset_id
       ) as numSwabs
from tblMainEquipment as me
where me.rev = (select max(me2.rev) from tblMainEquipment as me2 where me2.asset_id = me.asset_id);

优点是外层查询不需要聚合。

【讨论】:

  • 我已经尝试过了,但它会返回所有 rev# 中拭子位置的总数,我只需要 maxrev 中的拭子位置我得到了资产 ID 123 的 5 个拭子位置
  • 我设法通过再添加一行代码'select me.*, (select count(*) from tblmainswablocation as sl where sl.asset_id = me.asset_id AND sl.rev = me.rev ) as numSwabs from tblMainEquipment as me where me.rev = (select max(me2.rev) from tblMainEquipment as me2 where me2.asset_id = me.asset_id)'
【解决方案2】:

你需要一个计数和一个分组

SELECT MEQ.asset_id maxrev, MEQ.maxrev, 
    count(blmainswablocations.swab_location), MEQ.equipment_name
FROM tblMainEquipment AS MEQ 
INNER JOIN (Select asset_id, max(rev) as maxrev     
        From tblmainequipment  GROUP By asset_id)  AS groupmeq ON 
        (MEQ.asset_id = groupmeq.asset_id) AND (MEQ.rev = groupmeq.maxrev)
Inner join blmainswablocations on MEQ.asset_id =  blmainswablocations.asset_id
Group by MEQ.asset_id maxrev

【讨论】:

  • 此查询不包括 tblmainswablocations
  • 有一部分我不明白为什么你有 count(tblmainswablocation.swab_location) 而没有参考第一个 FROM 中的表格
  • 在一个连接中,所有的列都可以被引用,而不仅仅是“from”表中的列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2020-12-08
  • 1970-01-01
相关资源
最近更新 更多