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

Актуализиране чрез Join(s) - Multi DB/Table

Предполагам, че когато сте задали повторно въпроса, искате синтаксис, който ще работи както на Oracle, така и на SQL Server, въпреки че неизбежно ще засегне само една таблица.

Стандартният код на SQL-92 за начално ниво се поддържа и от двете платформи, следователно следният SQL-92 код на „скаларни подзаявки“ трябва да работи:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

Имайте предвид, че докато използвате името на корелация t1 за Ttble1 е валиден синтаксис според стандарта SQL-92, това ще материализира таблица и UPDATE след това ще се насочи към материализираната таблица 't1' и ще остави вашата базова таблица 'table1' незасегната, което предполагам, че не е желания ефект. Въпреки че съм почти сигурен, че и Oracle, и SQL Server не са съвместими в това отношение и че на практика ще работят според очакванията, няма нищо лошо да бъдете изключително предпазливи и да се придържате към синтаксиса на SQL-92, като напълно квалифицирате целевата таблица.

Хората обикновено не харесват „повтарящия се“ код в горните подзаявки (въпреки че оптимизаторът трябва да е достатъчно умен, за да го оцени само веднъж).

По-новите версии на Oracle и SQL Server поддържат и двете поддържат Standard SQL:2003 MERGE синтаксис, може да е в състояние да използва нещо близко до това:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

Току-що забелязах, че вашият пример е дори по-прост, отколкото първоначално си помислих, и просто изисква проста подзаявка, която трябва да работи на повечето SQL продукти, напр.

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server и Oracle, кой е по-добър по отношение на скалируемост?

  2. Таблици с история на корекции в Oracle Apps (11i/R12.1/R12.2)

  3. NetSuite запази формула за търсене за умножаване на резултатите от две други колони

  4. ORA-24408:не можа да генерира уникално име на група сървъри

  5. Каква беше цената за най-скъпия филм(и) в колекцията?