Помогите, не дайте умереть в неведении!
Как на ANSI SQL (или на Informix-диалекте) пишется _эффективный_ запрос на апдейт многих полей в одной таблице данными из другой таблицы?
Так работает, но по-моему, это сильно неэффективный метод:
UPDATE t1 SET
c1 = (SELECT c1 FROM t2 WHERE t2.id=t1.id),
c2 = (SELECT c2 FROM t2 WHERE t2.id=t1.id),
c3 = (SELECT c3 FROM t2 WHERE t2.id=t1.id),
...
WHERE id IN (SELECT id FROM t2);
Когда поле одно, это ещё ничего, а когда их десяток, это как-то некрасиво выглядит.
Upd: на информиксовском диалекте это пишется так:
UPDATE t1 SET (c1,c2,c3)=
((SELECT c1,c2,c3 FROM t2 WHERE t2.id=t1.id))
Двойные скобки у вложенного селекта существены.
Оригинал этой записи в личном блоге.
Tags:
no subject
Ethernet II, Src: Giga-Byt_21:b1:1a (00:14:85:21:b1:1a), Dst: Cisco_9f:2c:40 (00:11:5c:9f:2c:40)
Destination: Cisco_9f:2c:40 (00:11:5c:9f:2c:40)
Address: Cisco_9f:2c:40 (00:11:5c:9f:2c:40)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Source: Giga-Byt_21:b1:1a (00:14:85:21:b1:1a)
Address: Giga-Byt_21:b1:1a (00:14:85:21:b1:1a)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Type: IP (0x0800)
Internet Protocol, Src: 89.108.74.58 (89.108.74.58), Dst: 89.108.83.67 (89.108.83.67)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..0. = ECN-Capable Transport (ECT): 0
.... ...0 = ECN-CE: 0
Total Length: 84
Identification: 0x9b25 (39717)
Flags: 0x00
0... = Reserved bit: Not set
.0.. = Don't fragment: Not set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: ICMP (0x01)
Header checksum: 0x8f2e [correct]
[Good: True]
[Bad : False]
Source: 89.108.74.58 (89.108.74.58)
Destination: 89.108.83.67 (89.108.83.67)
Internet Control Message Protocol
Type: 0 (Echo (ping) reply)
Code: 0 ()
Checksum: 0x5f1b [correct]
Identifier: 0x9b71
Sequence number: 28 (0x001c)
Data (56 bytes)
0000 e2 a6 9b 4a 9a 62 02 00 08 09 0a 0b 0c 0d 0e 0f ...J.b..........
0010 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
0020 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !"#$%&'()*+,-./
0030 30 31 32 33 34 35 36 37 01234567
Data: E2A69B4A9A62020008090A0B0C0D0E0F1011121314151617...
Да и вообще, не припомню, где они бы в реальной жизни применялись.
no subject