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

しかし、私はこれら 2 つのクエリを 1 つのクエリに結合できるかどうかを知りたいと思っています。

私は Oracle を使用して物事を把握していますが、SQL Server クエリも見たいと思っています。MERGE ステートメントが機能すると考えましたが、明らかな理由により、次の句を使用できません。

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

AND 結合で言及されている場合、列を更新することはできません (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 に答える