Было бы полезно, если бы вы расширили на то, что вы пытаетесь достичь, как запрос вы опубликовали довольно абстрактно и там выглядит как там должно быть еще один столбец, который может используется для подключения строк в 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)
это может помочь http://stackoverflow.com/questions/2446764/oracle-update-statement-with-inner-join – Wombelite
@FaizanKhan: второй запрос не работает «отлично». Это неверный SQL для Oracle. –
Что именно вы хотите достичь? Поскольку на данный момент вы хотите установить 't.adr' значение' c2.adr', где 't.cli не равно c2.cli', что может привести к более чем одному значению – Armunin