管理テーブルというテーブルがあります。
フィールド構成は、会社コード(6)/支店コード(2)
SEQNO(2)/管理年月(6)/管理番号(8)となっていて、SeqNOがKeyとなっています。
会社コード|支店コード SeqNO 管理年月 管理番号
(1) 000001| 01 | 01 | 200503 |00000000
(2) 000001| 01 | 02 | 200503 |00000000
(3) 000001| 02 | 03 | 200503 |00000000
(4) 000001| 02 | 04 | 200503 |00000000
(5) 000001| 01 | 05 | 200502 |11111111
(6) 000001| 01 | 06 | 200502 |11111111
(7) 000001| 02 | 07 | 200502 |22222222
(8) 000001| 02 | 08 | 200502 |22222222
こんな感じでデータがあります。
会社コード/支店コード/管理年月が同じものの管理番号は、必ず同じデータが入ります。
これは、実際のデータはさらに複雑ですが、簡単にするため変なデータに思えると思います。まあそこは気にしないでください。
実は、(1)~(4)の管理番号がミスでデータが落ちてしまいました。
管理テーブルの管理年月が200502の会社コードと支店コードが同じ管理番号を同じデータの200503の管理番号に更新するSQLを教えてください。
一応作ってみましたが、 ”単一行副問合せにより2つ以上の行が返されます。”が出てしまって・・
分からないので教えてください。
UPDATE 管理テーブル T1
SET T1.管理番号 =
(SELECT T2.管理番号
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502)
WHERE
(T1.会社コード,T1.支店コード) IN
(SELECT T3.会社コード,T3.支店コード
FROM 管理テーブル T3
WHERE T3.管理年月 = 200503
GROUP BY T3.会社コード,T3.支店コード)
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
UPDATE 管理テーブル T1
SET T1.管理番号 = nvl((
SELECT DISTINCT T2.管理番号
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502
), 00000000)
WHERE T1.管理年月 = 200503
これではどうでしょうか?
No.5
- 回答日時:
#3ですが..
よくよく見ると・・、更新対象レコードの限定の仕方がうまくない。
UPDATE 管理テーブル T1
SET T1.管理番号 =
(SELECT T2.管理番号
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502 and
ROWNUM=1
)
WHERE
(T1.会社コード,T1.支店コード) IN
(SELECT T3.会社コード,T3.支店コード
FROM 管理テーブル T3
WHERE T3.管理年月 = 200503
GROUP BY T3.会社コード,T3.支店コード)
and T1.管理年月 = 200503 /* <========ここ== */
ただ、更新件数も多くなるはずだし、管理年月=200502のレコードの管理番号が"00000000"になることは無いと思います。
管理年月=200503以外のレコードまで、管理年月=200502の管理番号で更新されるハズです。
なので、事態が理解できないカンジです。
ありがとうございました。
このSQLでうまく行きました。結構こういう変なファイル
が多いので今後活用させて頂きます。
とても勉強になりました。
No.4
- 回答日時:
#1です。
UPDATE 管理テーブル T1
SET T1.管理番号 =
(SELECT MAX(T2.管理番号)
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502
GROUP BY T2.会社コード, T2.支店コード)
WHERE
T1.管理年月 = 200503
すみません。管理番号を抽出する方のselectに集計関数付け忘れました。
ありがとうございました。エラーもなく更新件数がぴったり合ったので出来た!と喜びましたが、
結果を見ると管理番号が全て0000000に置き換わってしまいました。これはやばい!です。
No.3
- 回答日時:
レコード(1)~(4)を更新するとき、相関性のあるデータの検索条件が甘いので、
レコード(1)に対し、(5)(6)が該当する。
レコード(2)に対し、(5)(6)が該当する。
レコード(3)に対し、(7)(8)が該当する。
レコード(4)に対し、(7)(8)が該当する。
という感じで、複数該当するので、オラクルはどちらを採用して良いか不明なため
エラーとしています。
今回のケースではどちらでも良いということなので、どちらでも良いから1件だけ限定する
条件を書き加えればOKです。
UPDATE 管理テーブル T1
SET T1.管理番号 =
(SELECT T2.管理番号
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502 and
ROWNUM=1 /* <===========1件だけよ==== */
)
WHERE
(T1.会社コード,T1.支店コード) IN
(SELECT T3.会社コード,T3.支店コード
FROM 管理テーブル T3
WHERE T3.管理年月 = 200503
GROUP BY T3.会社コード,T3.支店コード)
ありがとうございました。エラーもなく更新件数がぴったり合ったので出来た!と喜びましたが、
結果を見ると管理番号が全て0000000に置き換わってしまいました。これはやばい!です。
No.2
- 回答日時:
間違ってるかもしれませんが・・・。
UPDATE 管理テーブル T1
SET T1.管理番号 = (SELECT T2.管理番号
FROM (SELECT T3.会社コード,T3.支店コード
FROM 管理テーブル T3
WHERE T3.管理年月 = 200503
GROUP BY T3.会社コード,T3.支店コード
) T2
WHERE T2.会社コード = T1.会社コード
AND T2.支店コード = T1.支店コード
AND T2.管理年月 = 200502
)
こんな感じでどうでしょう。
ありがとうございました。参考にさせて頂きました。
でも T2.管理年月 = 200502でエラーが出てしまいました。思うに管理年月が選択されていないからでは・・
No.1
- 回答日時:
これでどうかな?
UPDATE 管理テーブル T1
SET T1.管理番号 =
(SELECT T2.管理番号
FROM 管理テーブル T2
WHERE T2.会社コード = T1.会社コード AND
T2.支店コード = T1.支店コード AND
T2.管理年月 = 200502
GROUP BY T2.会社コード, T2.支店コード)
WHERE
T1.管理年月 = 200503
更新対象のレコードの抽出条件は「T1.管理年月 = 200503」だけで十分かと。
あとは、更新する値を抽出する方で、GROUP BYを使って単一行を返します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- その他(Microsoft Office) エクセルで1行の長いデータを指定の桁数で分割する方法が知りたいです。 4 2022/05/20 21:55
- 消費者問題・詐欺 これは詐欺でしょうか 賃貸の管理会社が変更になり、家賃の支払い先が変更になったのですが二重引き落とし 3 2022/10/28 23:29
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- 銀行・ネットバンキング・信用金庫 金融機関コード・支店コード・金融会社名・支店名・口座番号・口座名義人が漏れた場合、 不正に利用するこ 3 2022/03/28 11:17
- その他(IT・Webサービス) クレカの認証ワンタイムパスワードが送られてこない 1 2022/10/18 20:29
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
場合によって条件を変えるSQL
-
Accessユニオンクエリーで2つ...
-
[Oracle] UPDATE分の副問い合わ...
-
ACCESS 一つのフィールドに複...
-
PLSQLの識別子エラー
-
sqlで質問です。 Aテーブルは店...
-
ACCESS2000でDCount関数の使い方
-
主キーの変更
-
請求と入金のテーブルの作成の...
-
update文で質問です。 下記の条...
-
片方だけ抽出する方法(SQL)
-
SELECT時の行ロックの必要性に...
-
accessテーブル作成クエリを実...
-
データの二重表示の原因
-
[ BETWEEN ] vs [ >= AND <= ]
-
ACCESS2007 フォーム 「バリア...
-
accessのロック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
ACCESS 一つのフィールドに複...
-
PLSQLの識別子エラー
-
主キーの変更
-
Accessでフィールドを比較した...
-
SQL 2つのテーブルとSUBSTRING...
-
続.ORACLEのSELECTのソートに...
-
行方向のデータを横に並べる
-
下記のsqlで取得されるレコード...
-
VIEWでテーブルの集計結果...
-
update文で質問です。 下記の条...
-
[Oracle] UPDATE分の副問い合わ...
-
片方だけ抽出する方法(SQL)
-
自分自身への矢印
-
連番のMin, Maxを取得したい
-
Accessユニオンクエリーで2つ...
-
日付の最大値を検索条件にする方法
-
Inner join と Left joinの明...
おすすめ情報