質問編集履歴

2

その後の対応について追加

2023/08/16 04:24

投稿

thizm
thizm

スコア5

test CHANGED
File without changes
test CHANGED
@@ -91,3 +91,70 @@
91
91
 
92
92
  使用しているSQLクライアント
93
93
  Heidi SQL
94
+
95
+ ※その後について記入しましたが、あくまでも素人による解決の仕方です。ご指摘
96
+
97
+ ### その後について
98
+ neko_the_shadow さんに提示していただいたコードで見事に実現できました!が、3000件を超えたあたりでタイムアウトエラーに…
99
+ 紆余曲折を得て、さらに別の方法でのコードを書いてみました。
100
+ ```SQL
101
+ SELECT scid,pcode,usedate FROM "history" T1
102
+ WHERE NOT EXISTS (
103
+ SELECT * FROM "history" T2 WHERE T1.scid = T2.scid AND T1.usedate < T2.usedate
104
+ ) AND scid = '2039 '
105
+ UNION ALL
106
+ SELECT NULL, NULL, NULL -- 必要なだけNULL値を追加
107
+ WHERE NOT EXISTS (
108
+ SELECT scid,pcode,usedate FROM "history" T1
109
+ WHERE NOT EXISTS (
110
+ SELECT * FROM "history" T2 WHERE T1.scid = T2.scid AND T1.usedate < T2.usedate
111
+ ) AND scid = '2039 ');
112
+ ```
113
+
114
+ こちらのコードでも実現できました。
115
+ ただし、こちらでも大量にセレクト文を発行するとタイムアウトやメモリ不足でエラーが出てしまいました。
116
+
117
+ ### その他の解決方法へ
118
+ - メモリ不足については、一時テーブルを作って回避できるかな?
119
+ - タイムアウトについては、処理を分割して実行すれば問題ないかな?
120
+
121
+ ということで、試してみました。
122
+
123
+ 一時テーブルを作成
124
+ ```SQL
125
+ CREATE TABLE "#tmp_history"( -- テーブル名の頭に # をつけることで一時的なテーブルを作成できる
126
+ scid VARCHAR(100) NULL
127
+ ,usesdate date NULL
128
+ ,pcode varchar(100) NULL
129
+ )
130
+ ```
131
+
132
+ セレクトしつつ、作成した一時テーブル #tmp_history へインサートする。
133
+ これ1処理1行にまとめて手持ちのscid分コードを生成…手持ちのscidリスト(.csv)は、全部で5万件あるので
134
+ 一度にすべてでなく SQLファイルに 処理を3000件ずつ分けて list_01.sql~list_17.sql ファイルを生成。
135
+ ```SQL
136
+ INSERT INTO "#tmp_history" (scid,usedate,pcode)
137
+ SELECT TOP(1) scid,usedate,pcode FROM "history" T1
138
+ WHERE NOT EXISTS (
139
+ SELECT * FROM "history" T2
140
+ WHERE T1.scid = T2.scid AND T1.usedate < T2.usedate
141
+ ) AND scid = '69112'
142
+ UNION ALL
143
+ SELECT NULL, NULL, NULL
144
+ WHERE NOT EXISTS (
145
+ SELECT scid,pcode,usedate FROM "history" T1
146
+ WHERE NOT EXISTS (
147
+ SELECT * FROM "history" T2
148
+ WHERE T1.scid = T2.scid AND T1.usedate < T2.usedate
149
+ ) AND scid = '69112'
150
+ );
151
+ ```
152
+ HeidiSQLクライアントにて、[ファイル]→[SQLファイルを実行]で作成したSQLファイルすべて選択して
153
+ 全ての処理を終えました。
154
+
155
+ 取り急ぎこのような流れで解決しましたので、参考になればと思います。
156
+
157
+
158
+
159
+
160
+

1

手持ちのscidリストについての説明を追加

2023/08/15 03:42

投稿

thizm
thizm

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,5 @@
1
1
  ### 実現したいこと
2
- 以下の利用履歴(history)のテーブルから、手持ちのscidリストを元にselectて、かつ usedateの最新のレコードを抽出し、scid が存在しない場合は意図的に1行のダミーデータを入れて一つの結果にしたいです。(ダミーでなくても、結果(理想2)のように、とにかく1行何もないデータでもOKです。)
2
+ 以下の利用履歴(history)のテーブルから、手持ちのscidリスト(.csv)を元にselect文を作って、かつ usedateの最新のレコードを抽出し、scid が存在しない場合は意図的に1行のダミーデータを入れて一つの結果にしたいです。(ダミーでなくても、結果(理想2)のように、とにかく1行何もないデータでもOKです。)
3
3
 
4
4
 
5
5
  **テーブル名:history**
@@ -33,7 +33,7 @@
33
33
 
34
34
  別に scid のみの一覧のリストがあって、select分を大量に発行し、実行しているのですが、scidリスト を元に select してレコードが無い場合、以下のコードのように if で処理分岐させて空のデータを意図的に流しこんでいます。
35
35
 
36
- _※手持ちの scid のリストは 約5万件ほどあります。_
36
+ _※手持ちの scid のリスト(.csv)は 約5万件ほどあります。_
37
37
 
38
38
  ```sql
39
39
  IF EXISTS(SELECT scid,usedate,pcode from "history" where usedate = (SELECT MAX(usedate) FROM "history" WHERE scid = '2039') and scid = '2039')