2011-03-28 104 views
1

结果更新集专栏中,我有一个集合列的表。我想做一个子查询,它返回几个整数,并将结果放入该列集合中,但是我找不到通过SQL来完成的语法。我通过编写一个SQL过程来做同样的事情(把SET的结果放在SET变量和返回变量中),但是我试图在没有函数的情况下做同样的事情。可以做到吗?Informix的 - 从子查询

首先,我创建一个临时表:

CREATE TEMP TABLE table1 (
    id INTEGER 
, col2 SET(INT NOT NULL) 
) 

然后我写些测试数据:

INSERT INTO table1 (id) VALUES (1); 
INSERT INTO table1 (id) VALUES (2); 

现在这个工程:

UPDATE table1 SET col2 = SET{1,2}; 

...但我试图做到这一点,这是行不通的:

UPDATE table1 SET col2 = (SELECT id FROM table1) WHERE id = 1; 

它返回此错误:

[Error Code: -9632, SQL State: IX000] Value does not match the type of column (col2). 

回答

1

操纵在纯SQL SET类型是一种痛苦。

您的更新正在试图为一个整数分配给INTEGER的组,和错误说:“你不能这样做。”

你应该能够做到:

UPDATE table1 
    SET col2 = SET { (SELECT id FROM table1 WHERE id = 1) } 
WHERE id = 1; 

但是,我不知道正确的修改是让多个值到设定什么;内部的WHERE不是空着的。

+0

是的,它适用于一个值;它也可以工作,如果我写这样的每个值的子选择:UPDATE table1 SET col2 = SET {(SELECT id FROM table1 WHERE id = 1),(SELECT id FROM table1 WHERE id = 2)} WHERE id = 1; ......但这显然不是我需要的解决方案。 :) – Domchi 2011-03-29 13:58:29

+0

@Domchi:好的 - 好吧,我还没有做足够的工作来知道答案是什么,我不确定你真正想做什么,因为把整数ID转换成单例集合并不是很有趣以我的想法。 – 2011-03-29 14:08:20

+0

我试图在一组中插入几个整数ID;整数是不相关子查询的输出。在这个简化的例子中,我试图将这个子选择的结果转换为一个集合:“SELECT id FROM table1”(它返回两个值,1和2)。问题是我不知道子选择会返回多少个整数,但绝对不只是一个。 – Domchi 2011-03-29 15:19:09

1

您可以通过使用MULTISET项目关键字
实现这一目标,下面的例子将工作:

CREATE TEMP TABLE table1 (
    id INTEGER 
    ,col2 MULTISET(INT NOT NULL) 
); 

INSERT INTO table1 (id) VALUES (1); 
INSERT INTO table1 (id) VALUES (2); 

UPDATE table1 SET col2 = MULTISET{1,2}; 

UPDATE table1 
    SET col2 = MULTISET(SELECT ITEM id FROM table1) 
WHERE id = 1; 

注意的SET和MULTISET

select set{1,2,1,3,1} from systables where tabid=1; 

收益之间的差异SET {1,2,3}

select multiset{1,2,1,3,1} from systables where tabid=1; 

返回MULTISET {1,2,1,3,1}