sql总结

1. 今天在做left join关联查询时候,有如下sql, 我想拉出app列表,并且要显示出当前用户在每个app里面声望值,后来发现查询为空,很疑惑即使右表没有符合条件的数据,left join是会把左表的数据全部返回的啊,为什么为空呢,找了半天原因就在kmta.account_address = #{accountAddress}这里,这个sql在kaa.effective=1之上部分执行是会有结果的,where里面的条件是对整个left join结果之后做了条件限制,#{accountAddress}在kmta里面不存在,那么在left join之后的结果也是不存在,加上条件必然为空了。

SELECT
	kaa.app_icon appIcon,
	kaa.app_name appName,
	cast(score / 10 AS DECIMAL(2, 1)) myScore,
	kaa.app_describe appDescribe,
	kaa.download,
	kaa.appPackageName,
	kaa.iosPackageName,
	kaa.app_intro appIntro,
	kaa.app_img appImg
FROM
	kyc_app_auth kaa
LEFT JOIN kyc_mock_transaction_app kmta ON kaa.id = kmta.app_id
WHERE
	kaa.effective = 1
AND kmta.account_address = #{accountAddress}

做了如下修改,把accountAddress的限制放在内部:

SELECT
  kaa.app_icon appIcon,
  kaa.app_name appName,
  cast(score / 10 AS DECIMAL(2, 1)) myScore,
  kaa.app_describe appDescribe,
  kaa.download,
  kaa.appPackageName,
  kaa.iosPackageName,
  kaa.app_intro appIntro,
  kaa.app_img appImg
FROM
  kyc_app_auth kaa
LEFT JOIN (
  SELECT
    *
  FROM
    kyc_mock_transaction_app kmta
  WHERE
    kmta.account_address = #{accountAddress})
    km ON kaa.id = km.app_id
  WHERE
    kaa.effective = 1

2. 将同一个表中一个字段值更新至另个一字段, 比如用户账户表,vip用户余额是amount字段(balance字段是null),普通用户是balance字段(amount字段是null),现在要都统一成balance字段。

update account set balance = amount where balance is null

乍一看好像没问题,但是where后面并没有条件,限制是同一条数据的amount赋给balance,意味着要同一id的数据才能update。

所以在这里要引入内连接

update account a inner join b

on a.id = b.id

set a.balance = b.amount

where a.balance is null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值