2016-03-31 16 views
0

私は、私の場合のテーブルのすべての行を更新しようとしています:更新既存の行

UPDATE CASE c 
SET c.number = 
(
select p.number 
from CASE c, Papers p, Dokument d 
where c.dokument = d.id 
and p.id = d.paperid 
and p.numer is not null 
and c.case = null; 
) 
where 
(this same as in set : when case.number is null but papers.numer is not null) 

私はwhere句の書き方を知らないので、私はこれを行うことはできません。 case.numerがヌルで、papers.numberがヌルでないすべてのローを更新する必要があります。

どうすればいいですか?ループを書くことができますか?私はPL/SQLを使用したことがないので、その方法もわかりません。

私も、このように更新しようとしましたが、エラーを持っている:

UPDATE s 
SET s.number = w.number 
FROM CASE s 
JOIN Dokument d on d.CASEID =s.ID 
JOIN Paper w on w.DOKUMENTID =d.ID and w.number is NOT NULL 
WHERE s.number IS NULL 
AND s.secondNumber IS NULL 
AND s.FIRSTNAME = w.FIRSTNAME 
AND s.SURNAME = w.SURNAME; 

SQL Error: ORA-00933: polecenie SQL niepoprawnie zakończone 
00933. 00000 - "SQL command not properly ended" 
+4

tsqlまたはOracle?一緒に使っているのを見ることはできません。 – jarlh

+0

最後の文のコメントに基づいて、Oracleタグを削除しました。 –

+0

使用しているDBMSを明確にしてください。 SQL Serverではなく、Oracleに適したPL/SQLタグが追加されました。これらのことが重要です。 –

答えて

3

これは私がT-SQLでそれを行うだろうかの方法です....

update c 
set c.number = p.number 
from [CASE] c 
join [Dokument] d on c.dokument = d.id 
join [Papers] p on p.id = d.paperid and p.number is not null 
where c.number is null 

しかし、私はあなたのテーブル構造が見えないので、私はあなたのテーブル名が何か理由で推測しました。私はそれが正しいと推測すれば悪い習慣です...

+0

ありがとうございます、この条件を満たすすべての行、または最初の行のみを更新するかどうか確認できますか? – jan345

+0

これは、where条件を満たすすべての行を更新します。このケースでは、[Case]テーブルで番号がnullのすべての行がテストされますが、テストします。 – Veljko89

+0

ありがとうございます。あなたはそれがすべて動作する場合 – jan345

0

更新で追加された2番目のステートメントは、更新(または削除)ステートメントに参加できないため、Oracleでは無効です。したがって、最初のステートメントで試行したように、サブクエリが必要です。

しかし、そのサブクエリの試行では、適切に相関していません。サブクエリ内のCASEテーブルへの参照は、update句のエイリアスを参照できるので、存在してはいけません。そして、あなたはその後、更新するかを決定するためにexists句で同じクエリを実行できます。

update case c 
set c.number = 
(
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
) 
where c.number is null 
and exists (
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
); 

これが唯一のケースではない可能性がある、1マッチングp.number(最大で)があることを前提としています。複数ある場合は、使用するものを選択する方法が必要です。最大値/最小値、順序付け基準などです。集合体を使用すると、p.number is not nullは少し冗長になります。

( 'number'は有効な列名ではなく、質問で 'number'と 'numer'を使用していますが、実際の列名を代用してください 'case'も表に適していませんそれは関数名です)。

関連する問題