質問編集履歴
2
その後の対応について追加
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リストについての説明を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
### 実現したいこと
|
2
|
-
以下の利用履歴(history)のテーブルから、手持ちのscidリストを元にselect
|
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')
|