Mysql T-sql查询问题
我有一个这样的疑问Mysql T-sql查询问题,mysql,sql,join,Mysql,Sql,Join,我有一个这样的疑问 SELECT a.ID, b.ID, a.Wallet, b.Total FROM a INNER JOIN b ON b.IID= a.ID WHERE b.ID= 19 AND b.IsActive = 1 我得到这个结果 a.ID b.ID Wallet Total 1 19 1000 250 1 19 1000
SELECT
a.ID,
b.ID,
a.Wallet,
b.Total
FROM
a
INNER JOIN b ON b.IID= a.ID
WHERE
b.ID= 19
AND b.IsActive = 1
我得到这个结果
a.ID b.ID Wallet Total
1 19 1000 250
1 19 1000 500
当我运行此查询时
UPDATE a
INNER JOIN b ON b.IID= a.ID
SET a.Wallet= a.Wallet+ b.Total
WHERE
b.ID= 19
AND b.IsActive = 1
我的b表钱包值从1000更新到1250,但真正的结果是b表钱包值从1000到1750,我的失败在哪里
******艾德·艾特******
表架构
CREATE TABLE IF NOT EXISTS `wallets` (
`wallet_id` int(6) unsigned NOT NULL,
`wallet` int(3) unsigned NOT NULL,
PRIMARY KEY (`wallet_id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `wallets` (`wallet_id`, `wallet`) VALUES
('1', '100'),
('2', '100');
CREATE TABLE IF NOT EXISTS `totals` (
`id` int(6) unsigned NOT NULL,
`TotalID` int(6) unsigned NOT NULL,
`wallet_id` int(6) unsigned NOT NULL,
`total` int(3) unsigned NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `totals` (`id`, `TotalID`,`wallet_id`,`total`) VALUES
('1', '19','1', '250'),
('2', '19','1', '750');
更新查询
UPDATE wallets inner join totals on totals.wallet_id=wallets.wallet_id
SET
wallets.wallet=wallets.wallet+totals.total
Where totals.TotalID=19
选择查询
SELECT * from wallets inner join totals on totals.wallet_id=wallets.wallet_id
您必须使用SUM(b.Total)和一个GROUP BY b.ID来获得匹配的值。现在,您的更新查询正在匹配它找到的第一个ID。希望它工作正常。
UPDATE a
SET wallet = wallet + b_sum
FROM a
CROSS APPLY
(
SELECT SUM(total) AS b_sum
FROM b
WHERE b.iid = a.id
AND b.id = 19
AND b.isActive = 1
) b
UPDATE a
SET a.Wallet = a.Wallet+f.valsum
FROM
(
SELECT b.IID,SUM(b.Total) valsum
FROM b
WHERE b.IsActive = 1 AND b.ID= 19
GROUP BY b.IID
) f
WHERE ON a.ID = f.IID;
令人惊讶的是,这甚至会返回记录。你有
a.ID=b.ID
而且你的ID是不同的..你如何取回不同的ID?@barrick我编辑了这个查询请为你的表添加DDL
,并提供示例数据和预期结果,因为还不清楚你到底想要什么。实际上,你可能不需要它。只需确保你不会试图在当前的形式下一次使用多个b.ID就可以了。不,它会更新所有的表钱包值。这不安全。考虑到OP的更新查询,这实际上是错误的。它们不使用a
的列作为WHERE,并且a.id
等同于b.iid
而不是b.id
。WHERE子句意味着它将只更新带有a.id=19
@Vasan的行:WHERE说b.id必须是19,而内部连接条件意味着a.id必须是19too@Andomar不,再次说明:如果您更仔细地观察,内部连接条件并不反对b.id。这是针对b.iid的(即b.id不同于b.iid)。与b.id进行比较并获取此数据是不符合逻辑的。对,交叉连接将充当筛选器+1
UPDATE a
SET a.Wallet = a.Wallet+f.valsum
FROM
(
SELECT b.IID,SUM(b.Total) valsum
FROM b
WHERE b.IsActive = 1 AND b.ID= 19
GROUP BY b.IID
) f
WHERE ON a.ID = f.IID;