2011-04-01 66 views
1

请帮助改善以下查询:提高SQL查询

UPDATE queries q 
    SET query = (SELECT q1.query 
        FROM queries q1 
       WHERE q1.table_name = q.table_name 
        AND q1.name = 'View1') 
WHERE q.NAME = 'View2' 
    AND q.table_name IN ('companies', 'persons'); 

我的查询表的结构:

table_name query name 
------------------------- 
companies 1  View1 
persons  2  View1 
companies 3  View2 
persons  4  View2 

PS:我希望它可以通过标准的SQL语法来进行的,没有特定的数据库服务器功能。

pps:任务的目的:table_name的“query”字段对于“name”View1和View2都应该是相同的。

例如,在目前的企业视图1 = 1的“查询”,视图2 = 3的查询,对人这些值是2和4。

我想唯一的SQL查询来更新记录因此对于View1和View2的公司,“查询”值应为1,对于View1和View2的人员,“查询”值应为2.

+3

改进方法?它不会按照您期望的方式改变数据吗?它表现不好吗? – Thomas 2011-04-01 04:44:32

+2

对于什么数据库? – 2011-04-01 04:45:49

+0

您编写查询的方式似乎完全合理。如果性能问题,您可能需要添加适当的索引。在这种情况下,首先确保table_name上有一个索引,因为这是您加入的字段。 – 2011-04-01 04:53:15

回答

1

从它的声音中,您无法引用更新从子查询中删除别名,尤其是在删除Update子句中的别名时。要做到这一点,只需使用更新表的全名即可。注意我使用了queries.table_name,并且我从Update子句中删除了别名(因此Update queries而不是Update queries q)。

Update queries 
Set query = (
      Select q1.query 
      From queries q1 
      Where q1.table_name = queries.table_name 
       And q1.name = 'View1' 
      ) 
Where q.NAME = 'View2' 
    And q.table_name IN ('companies', 'persons'); 
+0

它的工作原理,谢谢你,我从上一个“where”子句中删除别名的唯一更改:Where queries.NAME ='View2' 和queries.table_name IN('companies','persons'); – Alexandr 2011-04-04 05:44:09