2013-01-22 117 views
1

我正在使用informix数据库,并且想要将显示值从'N'更改为'Y'... 我正在运行以下sql,但似乎得到语法错误:Informix更改/更新表信息

UPDATE tablename 
SET displayed ='Y' 
WHERE flag= 'S' OR flag ='DEP' OR flag = 'WTD'; 

我用的还是,因为在所有3种情况下,我希望显示的是Y. 任何关于正确的语法以及如何更新或改变Informix中的表将是有益的帮助。 感谢

+3

你有什么错误?语法看起来正确。 –

+0

对于有'flag ='S'或flag ='DEP'或flag ='WTD''的记录,您是否有任何主键或共同的值? –

+1

SQL看起来没问题。你可以用WHERE flag IN('S','DEP','WTD')来简化它,但它实际上是一样的。有没有一种索引或约束被这种变化所侵犯?你能用你得到的确切错误更新你的问题吗? – RET

回答

1

如果我的理解是否正确,要更新列,如果它包含所有三个值:
'S', 'DEP', 'WTD'

您可以创建一个子查询来获取具有所有三个值的行,例如。

UPDATE tableName 
SET  displayed = 'Y' 
FROM tableName, 
     (
      SELECT primary 
      FROM tableName 
      WHERE flag IN ('S', 'DEP', 'WTD') 
      GROUP BY primary 
      HAVING COUNT(flag) = 3 
     ) b 
WHERE tableName.primary = b.primary 

只是将列Primary更改为组内的公共行值。

+0

大家好,谢谢你的回答....它现在可以工作了...感谢帮助 – user1971376

+0

'带连接的更新'符号的交叉引用是XPS(扩展并行服务器)中的一个特性,而不是常规的Informix (IDS - Informix Dynamic Server)。 XPS不是正式报废,而是不积极开发或广泛使用。无论如何,使用UPDATE-with-join应该是矫枉过正的;原来的查询应该没问题。 –

0

理解你的问题后,我试过的东西,如下所示,它的工作对我来说,我没有找到任何Informix的语法错误。

下面是我的尝试

UPDATE <TABLE_NAME> 
SET action='A' 
WHERE action = 'I' OR action = 'U';" 

Database selected. 


57 row(s) updated. 


Database closed. 

所以语法我没有发现任何错误。

你能分享你得到的语法错误吗?

确保所有列存在于同一个表中,或者如果它们在其他表中,则使用别名。

使用关键字相比EXISTS

以下可供选择的方法是低效的:

UPDATE <TABLE_NAME> 
SET action='A' 
WHERE EXISTS 
( SELECT action 
    FROM <SAME_TABLE_NAME> 
    WHERE action = 'I' OR action = 'U' 
); 

这也尝试和测试以及为我工作。

干杯。