0

嗨,我有查询选择了我所有具有主键 (id) = 1 或具有外键 = 1 的行。这是加入他自己。

选择 :

SELECT f2.wz AS wz FROM d7x6r_magazyn_faktura_zakupowa f

                        LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa   )AS f2
                        ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
                        AND f2.id_glowna <> 0)
                        OR ( f2.id = f.id  OR f2.id = f.id_glowna))
                        WHERE f.id = 1 OR f2.id_glowna  = 1;

现在我需要将所有行中的单元格 wz 更新为 0。我尝试使用:

UPDATE  d7x6r_magazyn_faktura_zakupowa f

  LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa   )AS f2
                ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
                AND f2.id_glowna <> 0)
                OR ( f2.id = f.id  OR f2.id = f.id_glowna))

SET f2.wz = 0
WHERE f.id = 1 OR f2.id_glowna  = 1;

但它不起作用,因为 f2.wz 无法更新。

4

3 回答 3

1

您似乎不需要子选择,只需使用 JOIN:-

UPDATE  d7x6r_magazyn_faktura_zakupowa f
LEFT JOIN d7x6r_magazyn_faktura_zakupowa f2
ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
AND f2.id_glowna <> 0)
OR ( f2.id = f.id  OR f2.id = f.id_glowna))
SET f2.wz = 0
WHERE f.id = 1 OR f2.id_glowna  = 1;

但是,您有一个 LEFT JOIN 但正在更新 F2 这是可能不存在的行,因此 INNER JOIN 可能会更好

于 2013-07-17T09:07:38.287 回答
1

您可以在更新/插入/删除时进行连接,但不能更新这些连接表中的记录。

您可以使用触发器来执行此操作

DELIMITER $$

CREATE TRIGGER au_table1_each AFTER UPDATE ON table1 FOR EACH ROW
BEGIN
  UPDATE table2 SET fieldY = new.fieldX WHERE ...;
END $$

DELIMITER ;

触发器将使用 table1 中的一些新数据在每次更新和更新 table2 时触发。在动作之前和之后有触发器,可以是 UPDATE、INSERT 或 DELETE

请参阅:http ://dev.mysql.com/doc/refman/5.1/en/create-trigger.html 和:http ://www.databasedesign-resource.com/mysql-triggers.html

感谢:mysql 更新、插入、删除与连接

于 2013-07-17T09:08:16.110 回答
0

你必须创建TMP表,也不LEFT JOIN应该在那里

于 2013-07-17T09:07:19.510 回答