SQL Group By和Update表别名 查找数据冲突

做了一个系统,开始的时候设计的有问题。

司机表中有ID ,工号等字段,但是工号原则上不能重复,ID是主键。

有一次发现有问题,可能是工号重复了,这可能是当初手动插入数据的时候弄得。


现在要找到重复的那个数据。

下面的语句即可

 
select *  from   (SELECT count(*) as c,gh FROM tb_driver group by gh ) as b    where c>1

红色的子查询,是把重复的列的个数也显示出来 字段为c。

注意子查询要重命名表,表明为b


这样哪一行有重复就看到了,手动删掉,再也没问题了。


-----------------------------下面是另外的问题

从一个表中,用某种条件查找到该表的上一条数据,然后把上一条数据的某个字段,复制给当前这一条数据的某个字段。

这需要用表别名。

updateT
setT.Key1 = 'xxxx'
fromTableA T
这是Update 的另外写法。


UPDATE  tar_tb set [previousClass] = 
   (
   select  top 1 toClass from tb_driverReportInput s where s.train=tar_tb.train and  s.toDateTime<tar_tb.fromDateTime
   order by  fromDateTime desc
   )
   from [tb_driverReportInput] tar_tb




UPDATE  tar_tb set Downlong = 
   (
    case when  tar_tb.fromClass='乘务员' then 
          datediff(MINUTE, (select  top 1 toDateTime from tb_driverReportInput s where s.train=tar_tb.train and  s.toDateTime<=tar_tb.fromDateTime order by  fromDateTime desc),tar_tb.fromDateTime)
  else 0
end
   )
   from [tb_driverReportInput] tar_tb

下面语句的功能是把某条交接班的实际耗油量复制给他的 明细表中最后一条的记录------------------------------------------------------------------------------------- 

update T
set T.actualOil = 
(select case  when ((SELECT max(startTime) FROM [hnoil].[dbo].[tb_driverReportDetails] where reportid=Zh)=T.startTime)
 then (select actualOil from tb_driverReportInput  where id=Zh)
 else 0 
 end 
 )
 from 
 (select startTime,[tb_driverReportDetails].actualOil,reportid as Zh  from [tb_driverReportDetails] left join  tb_driverReportInput on [tb_driverReportDetails].reportid=tb_driverReportInput.id) T
 注意:上面的Zh是必须的。

-----------------下面的语句是 查询和 case 语句连用------------------------------

select *,
 case when emptyWeight=0 and heavyWeight=0 
 then 0 
 else  0.5*(dcCount+dxCount+dzCount)+mileageValue  
 end as statisticsValue
  from 
 (
 select [tb_driverReportDetails].*,
 str(shuntingdz)+','+str(dzCount) as dzMinutesCount,
 str(shuntingdx)+','+str(dxCount) as dxMinutesCount,
 str(shuntingdc)+','+str(dcCount) as dcMinutesCount, 
 
 (select mineStationName from tb_mineStation where id=tb_stationMileage.startStationId) +'-->' +
 (select mineStationName from tb_mineStation where id=tb_stationMileage.endStationId) as mileageStation,
 (select benwuMileage from tb_stationMileage where  [mileageStationId]=tb_stationMileage.id) as distance,
 (select score from tb_stationMileage where  [mileageStationId]=tb_stationMileage.id) as mileageValue,
 tb_driverReportInput.train as trainNum , 
 tb_driverReportInput.submitDate,
(tb_driverReportDetails.actualOil-tb_driverReportDetails.comprehensiveOil) as saveOil,
  (select gh+','+drivername from tb_driver where tb_driver.gh=tb_driverReportInput.driverGh) as drivername,
  (select gh+','+drivername from tb_driver where tb_driver.gh=tb_driverReportInput.assistantDriverGh) as assistantDrivername
  FROM 
 [hnoil].[dbo].[tb_driverReportDetails] left join tb_stationMileage on mileageStationId= tb_stationMileage.id
 left join tb_driverReportInput on tb_driverReportInput.id=[tb_driverReportDetails].reportid
 ) as bb




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MySQL中,UPDATE语句与GROUP BY子句结合使用是一种常见的操作。然而,MySQL不直接支持在UPDATE语句中使用GROUP BY子句。如果你想对GROUP BY的结果进行更新,你可以使用子查询或临时的方式来实现。 一种方法是使用子查询。你可以首先编写一个包含GROUP BY子句的SELECT语句,将结果保存在一个临时中,然后使用UPDATE语句来更新这个临时。例如: ``` UPDATE table_name SET column_name = 'new_value' WHERE primary_key IN ( SELECT primary_key FROM table_name GROUP BY group_column HAVING condition ) ``` 另一种方法是使用临时。你可以先创建一个临时,将GROUP BY的结果插入到这个临时中,然后使用UPDATE语句来更新这个临时。例如: ``` CREATE TEMPORARY TABLE temp_table SELECT group_column, MAX(column_name) AS max_value FROM table_name GROUP BY group_column; UPDATE table_name JOIN temp_table ON table_name.group_column = temp_table.group_column SET table_name.column_name = temp_table.max_value; DROP TEMPORARY TABLE temp_table; ``` 需要注意的是,根据MySQL的行为,GROUP BY子句先于ORDER BY子句执行。因此,在UPDATE语句中使用GROUP BY时,不需要指定ORDER BY子句。同时,如果GROUP BY的结果只有一条记录,那么ORDER BY子句将无效。 请根据你的具体需求选择适合的方法来实现GROUP BY和UPDATE的组合操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [一个MySQL中两联合update的例子(并带有group by分组)](https://blog.csdn.net/albjxn4742/article/details/102066339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SQL Group By和Update别名 查找数据冲突](https://blog.csdn.net/qqqgg/article/details/78061173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [深入解析mysql中order by与group by的顺序问题](https://download.csdn.net/download/weixin_38562329/13692932)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值