Oracle
 sql >> база данни >  >> RDS >> Oracle

Може ли някой да обясни какво наистина прави изявлението MERGE в Oracle?

какъв вид присъединяване се извършва? Мисля, че е пълно външно присъединяване, нали?

Не, това е обикновено външно съединение. Заявката трябва да знае кога има редове в целевата таблица, които също са в таблицата източник и кога има записи в таблицата източник, които не са в целевата таблица. Тъй като заявката не трябва да отговаря на редове, които са в целевата таблица, но не са в таблицата източник, не се нуждае от външното свързване, за да върви и в двете посоки.

Въпреки това, външното присъединяване няма да бъде извършено, ако няма not matched клауза (която е напълно валидна). Оптимизаторът е достатъчно умен, за да знае, че в този случай вътрешното присъединяване е достатъчно.

по отношение на частта КОГАТО СЪВПАДА:какво се случва, когато ред от t съвпада с няколко реда от s?

Когато има няколко съвпадения, актуализирането се извършва за всяко съвпадение. Това означава, че която и актуализация да дойде последна, ще бъде тази, написана в комита. Няма начин да се диктува поръчка, така че в този случай източникът на актуализацията е на практика случаен (от набора от съвпадения).

Както @ Vincent Malgrat посочи, това беше неправилно. Изглежда, че Oracle ще произведе грешка „ORA-40926:не може да се получи стабилен набор от редове в таблицата източник“, ако има няколко съвпадения.

по отношение на частта КОГАТО НЕ СЪВПАДА, Вярвам, че това означава „когато ред в s няма съответствие в t“. Прав ли съм?

Това е правилно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ефективен начин за тестване дали съществува ред в таблица

  2. Самоприсъединете се към Oracle с примери

  3. изчисляване на часовете въз основа на работното време в Oracle SQL

  4. Zip с помощта на Oracle Stored Procedure

  5. Защо Oracle.ManagedDataAccess не работи, когато Oracle.DataAccess го прави?