0

我已经尝试了几个小时(可能比我需要的更多)来找出编写更新 sql 查询的最佳方法,该查询将禁止我正在更新的列上的重复项。

意思是,如果 TableA.ColA 已经有一个名称“TEST1”,那么当我更改另一条记录时,我根本无法为 ColA 选择一个值为“TEST1”。

只需将查询分成一个选择,并使用允许条件逻辑的服务器层代码,这很容易:

SELECT ID, NAME FROM TABLEA WHERE NAME = 'TEST1'

IF TableA.recordcount > 0 then
    UPDATE SET NAME = 'TEST1' WHERE ID = 1234
END IF

但我更感兴趣的是这两个查询是否可以组合成一个查询。

我正在使用 Oracle 来解决问题,但我也希望看到 SQL Server 查询。我认为 MERGE 语句可以工作,但由于显而易见的原因,您不能拥有该子句:

..etc.. WHEN NOT MATCHED UPDATE SET ..etc.. WHERE ID = 1234

并且如果在联接中提到了列,则不能更新它(oracle 限制但不限于 SQL Server)

另外,我知道您可以对防止重复值的列施加约束,但我很想看看是否有这样的查询可以在不使用约束的情况下执行此操作。

这是我的一个示例启动尝试,只是为了看看我能想出什么(没有必要对其失败进行解释):

错误:ORA-01732:此视图上的数据操作操作不合法

UPDATE (
    SELECT d.NAME, ch.NAME FROM (
        SELECT 'test1' AS NAME, '2722' AS ID
        FROM DUAL
    ) d
    LEFT JOIN TABLEA a
    ON UPPER(a.name) = UPPER(d.name)
)
SET a.name = 'test2'
WHERE a.name is null and a.id = d.id

我尝试过合并,但只是放弃了认为这是不可能的。我也认为不存在(但我必须小心,因为我可能会不小心更新不符合条件的所有其他记录)

4

2 回答 2

2

它应该很简单:

update personnel
set personnel_number = 'xyz'
where person_id = 1001
and not exists (select * from personnel where personnel_number = 'xyz');
于 2012-08-16T14:24:36.820 回答
1

如果我理解正确,您想有条件地更新一个字段,假设找不到该值。以下查询执行此操作。它应该适用于 SQL Server 和 Oracle:

update table1
    set name = 'Test1'
    where (select count(*) from table1 where name = 'Test1') > 0 and
          id = 1234
于 2012-08-16T14:23:10.707 回答