SQLなら俺に訊け [無断転載禁止]©2ch.net (457レス)
SQLなら俺に訊け [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1499985653/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
11: デフォルトの名無しさん [sage] 2017/11/03(金) 19:41:06.46 ID:N8t7Jq3a てす http://mevius.5ch.net/test/read.cgi/tech/1499985653/11
12: デフォルトの名無しさん [] 2017/11/03(金) 20:07:37.65 ID:N8t7Jq3a SQL初心者です。 複数のrowを一度に取りたいのですがどう書けばいいのでしょうか。 後述の(C)より効率のよい記述を探しています。 (なおRock54回避の為シングルクオートを全角に、またselectをカタカナに変更しています) 用途は掲示板で、以下のような「先頭と最近の5投稿」の取得が目的です。 https://mevius.5ch.net/tech/ 環境はSQLiteです。SQLite依存で構いません。 単純には以下2クエリになりますが、 select * from thread order by no limit 1; // (A) select * from thread order by no desc limit 5; // (B) A-B間で更新されたときに過渡状態のデータが返ることを避けるため、一つに纏めたいのです。 SQLiteでは読み込みにはトランザクションが使えず、BEGIN/COMMITで囲んでブロック出来ません。 試行錯誤して一応以下のクエリは通るようですが、サブクエリが効率が悪く見えるのでもっと良い書き方を探しています。 セレクト from ’1234’ where no in (values(’1234’) union セレクト no from ’1234’ order by rowid desc limit 6); // (C) ここで1234はスレッド名=スレッド最初の投稿Noです。 4chanのように板毎にNoが打たれており、スレ内のNoは飛び飛びになっています。 なお前側values部分もサブクエリにして先頭番号を取得する limit 1のサブクエリも書き方があれば教えてください。 (デバッグ時に使う) これも出来ません。例えば、以下は通りません。 セレクト * from ’1234’ where no in ((セレクト no from ’1234’ limit 1) union セレクト no from ’1234’ order by rowid desc limit 6); // (D) // limitはunionの後に、とエラーが出る (A)+(B)は同時にデータも取得する為、(C)より効率がいいと考えています。 (データの順序が異なるが、簡単にカバー出来る範囲なので問題ない) ただし(A)+(B)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。 なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。 http://mevius.5ch.net/test/read.cgi/tech/1499985653/12
14: デフォルトの名無しさん [sage] 2017/11/03(金) 23:25:25.83 ID:N8t7Jq3a >>13 そうなのかもしれませんが、それを変える方法が分かりません。 SQL自体はSQL92準拠らしいです。 http://www.sqlite.org/fullsql.html ちなみにトランザクションのページはこちら。 http://www.sqlite.org/lang_transaction.html なお、select自体は一つのトランザクションらしく、例えば上記(A)(B)を繋いで begin; commit;で囲むと、 「トランザクション中でトランザクションを開始出来ません」というエラーになります。 // Error: cannot start a transaction within a transaction http://mevius.5ch.net/test/read.cgi/tech/1499985653/14
15: デフォルトの名無しさん [sage] 2017/11/03(金) 23:38:29.19 ID:N8t7Jq3a ああすいません、これですかね? PRAGMA read_uncommitted; http://www.sqlite.org/pragma.html#pragma_read_uncommitted ここの書き方だとよく分からないのですが、 デフォはSERIALIZABLEで、これをREAD UNCOMMITTED(true)にして、 さらに書き込み側をBEGIN EXCLUSIVEにしろってことですかね? > After a BEGIN IMMEDIATE, > no other database connection will be able to write to the database or do a BEGIN IMMEDIATE or BEGIN EXCLUSIVE. > Other processes can continue to read from the database, however. > An exclusive transaction causes EXCLUSIVE locks to be acquired on all databases. > After a BEGIN EXCLUSIVE, > no other database connection except for read_uncommitted connections will be able to read the database > and no other connection without exception will be able to write the database until the transaction is complete. > http://www.sqlite.org/lang_transaction.html http://mevius.5ch.net/test/read.cgi/tech/1499985653/15
16: デフォルトの名無しさん [sage] 2017/11/03(金) 23:58:59.47 ID:N8t7Jq3a あ、いや、違いましたね。 read_uncomitted は制限を緩和する方向でした。 まだ全貌を把握しておらず、ここら辺はすみません。 SQLiteはseriarizableを実装しているとは書いてありますが、デフォが何かはよく分かりません。 > SQLite implements serializable transactions > http://www.sqlite.org/transactional.html ただまあ、今のところ複数selectをトランザクションに指定する方法が分かりません。 多分単発のselectなら自動的にトランザクション化してます。 http://mevius.5ch.net/test/read.cgi/tech/1499985653/16
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.027s