我正在尝试在where子句中添加日期。我想更新日期列在特定日期之前或之后的所有行。如何指定我只想更新这些列。这是我到目前为止的编码(不包括特定的列名):
update table1
set column1 = value
where (select date from table2) < date;
我是在正确的轨道上吗?
另外,有人可以解释一下SQL和PL / SQL之间的区别。我现在正在参加PL / SQL课程。每当我在这个论坛上发帖提问时,我说我在PL / SQL中有一个问题,但回答我问题的人说某个功能 - 更新/ if / case / etc. - 是一个SQL语句而不是PL / SQL语句。有什么区别?
-Neil
答案 0 :(得分:2)
您的更新声明
update table1
set column1 = value
where (select date from table2) < date;
是正确的,只有在内部查询(select date from table2)
返回单行时才会起作用。如果您尝试与特定日期进行比较,则不需要内部查询,例如:
update table1
set column1 = value
where to_date('01/02/2012', 'DD/MM/YY') < date;
您可以将日期格式掩码调整为您喜欢的任何数据格式。 <{1}}将从char转换为日期类型,to_date
将执行相反的操作。
SQL是一种标准化查询语言,所有兼容的关系数据库都支持该语言(有时会使用某些专有扩展)。 SQL不是一种编程语言。 PL / SQL是一种过程编程语言,仅在Oracle上受支持(Postgres具有类似的语法)。 PL / SQL是SQL +常规编程语言功能,如条件语句(if / else),循环(for),函数和过程等。只要使用SQL过于困难或无法获取某些数据,就会使用PL / SQL。
答案 1 :(得分:0)
正如Aleksey所提到的,你的查询是正确的,但是你需要[1]在子SQL周围设置条件才能返回一条记录,或者[2]确保tabl2中的数据在运行时只有一条记录。 / p>
即
如果必须在WHERE子句中引用另一个表中的数据,请考虑显式连接(SQL Server中的示例)......
update t1
set t1.column1 = value -- <-- some arbitary value here I assume?
from table1 t1
inner join table2 t2
on (t2.key = t1.key) -- you need to specify the primary keys of the tables here
where t2.date < t1.date
这样你就不会假设table2只有一条记录。它可以有很多记录,只要它们通过键/索引与table1相关,而WHERE子句只是确保你只根据table2中的数据更新,该数据的日期比table1中的日期少。