Актуализирайте реда с избор на същата таблица

Опитвам се да актуализирам ред със същата заявка за таблица. Контекст:

ID        |  LANG       |  TEXT
----------------------------------
1         |  EN         |  Hello
1         |  FR         |
1         |  ES         |
2         |  EN         |  Boat
2         |  FR         |  Bateau
2         |  ES         |

Искам да : За всеки ред; ако ТЕКСТЪТ Е NULL; актуализирайте го с TEXT стойност на ред със същия ID и LANG = 'EN'.

Каква е SQL заявката за извършване на нещо подобно?


person bux    schedule 12.08.2014    source източник
comment
dev.mysql.com/doc/refman/5.0/en/update. html   -  person Marc B    schedule 12.08.2014


Отговори (2)


Не посочвате базата данни. Следното е стандартен SQL:

UPDATE t
    SET TEXT = (SELECT text
                FROM t t2
                WHERE t.id = t2.id AND LANG ='EN' AND
                      TEXT IS NOT NULL
               ) 
    WHERE TEXT IS NULL;

В случай на дубликати, следното трябва да работи:

UPDATE t
    SET TEXT = (SELECT max(text)
                FROM t t2
                WHERE t.id = t2.id AND LANG ='EN' AND
                      TEXT IS NOT NULL
               ) 
    WHERE TEXT IS NULL;

РЕДАКТИРАНЕ:

Разбира се, не всички бази данни поддържат всички стандартни функции на ANSI. В MySQL бихте използвали join вместо това:

UPDATE t JOIN
       (SELECT id, max(text) as text_en
        FROM t t2
        WHERE LANG ='EN' AND TEXT IS NOT NULL
       ) ten 
       ON t.id = ten.id
    SET t.TEXT = ten.text_en
    WHERE t.TEXT IS NULL;
person Gordon Linoff    schedule 12.08.2014
comment
Здравейте, с MySQL получавам тази грешка, когато опитвам вашата заявка: #1093 - Не можете да посочите целева таблица 't' за актуализация в клаузата FROM - person bux; 12.08.2014
comment
Благодаря за специфичното за MySQL запитване! - person bux; 13.08.2014
comment
Използвах последния кодов фрагмент, за да конвертирам varchar в datetime с STR_TO_DATE('20180308163241639', '%Y%m%d%H%i%s%f') - person jgburet; 14.03.2018

За MS SQL можете да използвате съединение, за да направите това, но може да не работи с други бази данни:

UPDATE t1
SET t1.text = t2.text
FROM table1 t1
INNER JOIN table1 t2 ON t1.id = t2.id 
WHERE t1.TEXT IS NULL AND t2.LANG = 'EN'

Примерен SQL Fiddle

person jpw    schedule 12.08.2014
comment
Работи много добре за това, което търсех. - person ransems; 28.06.2018