SQLなら俺に訊け [無断転載禁止]©2ch.net

1デフォルトの名無しさん
垢版 |
2017/07/14(金) 07:40:53.63ID:HFjsarQi
さあ
2デフォルトの名無しさん
垢版 |
2017/07/18(火) 22:00:59.52ID:siPNnjTj
count(*)の*と、select * fromの*は同じでしょうか
2017/07/20(木) 17:02:54.84ID:q+vyIcRX
>>2
同じだろ。何でそんな事が気になる?
2017/07/20(木) 17:41:19.81ID:3fjdXCU7
>>3
違うよ

select * from fooは、「fooテーブルの全カラム」という意味

count()の方は、
count(column_name)とカラム名を指定したときは、column_nameがnullではない行数が取得される
count(*)だとnullとか関係なしに全行数
52
垢版 |
2017/07/20(木) 20:03:27.83ID:fM45JSSS
>>3 >>4
ありがとう。なんとなく違う感じでうまく説明できなかったけど、>>4の通りだわ
2017/07/21(金) 05:29:05.88ID:5O09iCBm
>>4
>column_nameがnullではない行数
column_nameがnullになる事が有るの?
2017/07/21(金) 06:56:59.69ID:xjFWQMIy
スルー検定(初級)
2017/08/26(土) 19:24:02.61ID:DSilAr/A
foo_id, bar_id_list
"1", "1,2,3"
"2", "4,5"
"3", "6,7,8"

これを

foo_id, bar_id
"1", "1"
"1", "2"
"1", "3"
"2", "4"
"2", "5"
"3", "6"
"3", "7"
"3", "8"

こう変換するクエリって書ける?
なるべく標準がいいけどポスグレ依存でも可
9デフォルトの名無しさん
垢版 |
2017/08/30(水) 07:14:19.33ID:FYBJnXXr
>>8
お前は秘密の合言葉を言ってない。
「お願いします。どうか教えて下さい」
108
垢版 |
2017/08/30(水) 08:02:42.85ID:ItMe6Tvy
再帰クエリでできました

SQLは業務で使うことも多いのにSQLスレに人がいないのは寂しいですね
2017/11/03(金) 19:41:06.46ID:N8t7Jq3a
てす
12デフォルトの名無しさん
垢版 |
2017/11/03(金) 20:07:37.65ID: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)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。
なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況