Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie możesz określić tabeli docelowej do aktualizacji w klauzuli FROM

Problem polega na tym, że MySQL, z jakiegoś głupiego powodu, nie pozwala na pisanie takich zapytań:

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM myTable
    INNER JOIN ...
)

To znaczy, jeśli robisz UPDATE /INSERT /DELETE w tabeli, nie możesz odwoływać się do tej tabeli w zapytaniu wewnętrznym (możesz można jednak odwołaj się do pola z tej tabeli zewnętrznej...)

Rozwiązaniem jest zastąpienie instancji myTable w podzapytaniu z (SELECT * FROM myTable) , tak jak to

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM (SELECT * FROM myTable) AS something
    INNER JOIN ...
)

To najwyraźniej powoduje, że niezbędne pola są niejawnie kopiowane do tabeli tymczasowej, więc jest to dozwolone.

Znalazłem to rozwiązanie tutaj . Notatka z tego artykułu:

Nie chcesz po prostu SELECT * FROM table w podzapytaniu w prawdziwym życiu; Chciałem tylko, żeby przykłady były proste. W rzeczywistości powinieneś wybierać tylko te kolumny, których potrzebujesz w tym najbardziej wewnętrznym zapytaniu i dodawać dobre WHERE klauzula ograniczająca również wyniki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odwrócić bazę danych w środowisku MySQL Workbench

  2. Najlepsze praktyki dotyczące replikacji MySQL

  3. PHP PDOException:SQLSTATE[HY093]:Nieprawidłowy numer parametru

  4. Jak zarządzać MySQL — dla administratorów baz danych Oracle

  5. Jak utworzyć użytkownika w MySQL