Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql T-sql查询问题_Mysql_Sql_Join - Fatal编程技术网

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;