2013-11-29 6 views
1

Во-первых, я не привык к синтаксису SQL вообще. У меня возникла следующая проблема. T1 и C2 - мои две таблицы. Я хотел бы посмотреть, чтобы сделать это:SQL oracle update с использованием нескольких таблиц

UPDATE T1 t 
SET t.adr = C2.adr 
WHERE t.cli != C2.cli; 

У меня есть следующие ошибки: C2.adr and C2.cli : invalid identifier

я должен сделать это:

UPDATE T1 t, C2 c 
SET t.adr = c.adr 
WHERE t.cli != c.cli; 

Это просто немного странно, потому что я не» t обновить C2, но, возможно, это просто синтаксис, на который ссылаются таблицы после действия (здесь обновление).

+0

это может помочь http://stackoverflow.com/questions/2446764/oracle-update-statement-with-inner-join – Wombelite

+0

@FaizanKhan: второй запрос не работает «отлично». Это неверный SQL для Oracle. –

+0

Что именно вы хотите достичь? Поскольку на данный момент вы хотите установить 't.adr' значение' c2.adr', где 't.cli не равно c2.cli', что может привести к более чем одному значению – Armunin

ответ

0

Это сделает

UPDATE T1 t, C2 c 
SET t.adr = c.adr 
WHERE t.cli != c.cli; 
+1

Вы не можете указать более одной таблицы в 'UPDATE' в Oracle. –

0

Было бы полезно, если бы вы расширили на то, что вы пытаетесь достичь, как запрос вы опубликовали довольно абстрактно и там выглядит как там должно быть еще один столбец, который может используется для подключения строк в T1 и C1.

Однако, от того, что вы просили, вы можете попробовать что-то вроде этого:

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE T1 (cli, adr) AS 
      SELECT 1, 1 FROM DUAL 
UNION ALL SELECT 2, 2 FROM DUAL 
UNION ALL SELECT 3, 3 FROM DUAL 
UNION ALL SELECT 4, 4 FROM DUAL; 

CREATE TABLE C1 (cli, adr) AS 
      SELECT 1, 5 FROM DUAL 
UNION ALL SELECT 2, 6 FROM DUAL 
UNION ALL SELECT 3, 7 FROM DUAL 
UNION ALL SELECT 4, 8 FROM DUAL; 

Query 1:

UPDATE T1 t 
SET adr = (SELECT MIN(c.adr) 
       FROM C1 c 
       WHERE c.cli <> t.cli) 

Запрос 2:

SELECT * FROM T1 

Results:

| CLI | ADR | 
|-----|-----| 
| 1 | 6 | 
| 2 | 5 | 
| 3 | 5 | 
| 4 | 5 | 

Ее не совсем, как вы просили, как я должен был поставить MIN(c.adr), чтобы обеспечить подзапрос возвращает один , но он дает вам пример того, как ссылаться на вторую таблицу в запросе обновления.

Если вы не агрегировать с помощью MIN() затем (для тестовых данных я создал) не равно условие будет соответствовать несколько строк, и вы получите сообщение об ошибке:

Query 3:

UPDATE T1 t 
SET adr = (SELECT c.adr 
       FROM C1 c 
       WHERE c.cli <> t.cli) 

Результаты:

ORA-01427: single-row subquery returns more than one row : UPDATE T1 t SET adr = (SELECT c.adr FROM C1 c WHERE c.cli <> t.cli) 
Смежные вопросы