SQL質疑応答スレ 12問目

このエントリーをはてなブックマークに追加
825NAME IS NULL
sqliteで select * from test where a = '1' or a = '2'

って感じで取得してるんですが、
上記のwhereで指定した条件の順番に結果がかえってこないんです。

理想としてはaが1のデータが配列の0番目の要素、2のデータが配列1番目の要素って感じに、
where句で指定した順に取得したいんです

そんなことは無理なんでしょうか?
ちなみにソートでは対応できない任意の順番なのでorder byでは無理です。

ちなみにunionでselect文で繋いでも、where句で指定した順番では帰ってきませんでした。
暫定対応としてselect文を一度ずつ実行して配列に入れています。
826NAME IS NULL:2012/07/04(水) 23:09:29.97 ID:???
無理。
827NAME IS NULL:2012/07/04(水) 23:12:50.93 ID:???
SQLって使えねーな
ありがとうございました
828NAME IS NULL:2012/07/04(水) 23:18:36.01 ID:???
自分の力量のなさをツールのせいにするなよ
829NAME IS NULL:2012/07/04(水) 23:23:29.28 ID:???
うるせー
PHP板からいちいちやってくんなカス
830NAME IS NULL:2012/07/04(水) 23:24:42.77 ID:???
>>825
> order byでは無理
この決めつけが視野を狭くしてるのではないかね
831NAME IS NULL:2012/07/04(水) 23:33:04.35 ID:???
>>830
その通りでした。
カラムをもう一つ増やせばできないこともないことに気づきました。
まあそのカラムにソートに必要な値を入れといて、
後でそいつをキーにソートするって方法ですけど。
でもそうするとこのキーの値もデータ更新時に毎回更新することになるから、
ちょっとなーって思ってたところです。
まあ400回ループするよりマシかもしれないのでちょっと考えてみます。
でも現状のカラムデータだけではソートは無理です。
ありがとうございました。
832NAME IS NULL:2012/07/05(木) 04:36:34.32 ID:???
出来ないやつって物のせいにするよね
833NAME IS NULL:2012/07/05(木) 05:38:44.50 ID:???
>>831
本気で取り出し順を工夫するときは、別に取り出し順テーブルを持たなくちゃ。
834NAME IS NULL:2012/07/05(木) 08:41:39.02 ID:???
>>832
あのな
自分の力量がないことなんかわかってんだよ
ただの捨て台詞だ
黙ってろボケ

>>833
なるほど。
それいいですね
参考になりました
ありがとうございます。
835NAME IS NULL:2012/07/05(木) 10:45:48.42 ID:???
ある整数型のカラムnumがあって、
その内容が、100以下の素数であるレコードだけ抜き出すために
SQLを簡潔に書く方法はありますでしょうか

where num=2 or num=3 or num=5 (略) num=89 or num=97
と書いてもいいんですが、
たとえば
where num={2,3,5,7,11,(略),83,89,97}
のようなまとめた書き方があったら教えてください
836NAME IS NULL:2012/07/05(木) 11:28:05.41 ID:???
in
837NAME IS NULL:2012/07/05(木) 14:27:43.64 ID:???
838NAME IS NULL:2012/07/05(木) 18:59:18.72 ID:???
select id, name, email from users;
というSQLがあって、idとemailはユニークだけど、nameは重複可能であるとします。
このとき、nameが重複したときは最初(または最後)に現れたレコードだけをselectすることはできますか。
DBはPostgreSQL 9です。
よろしくお願いします。
839NAME IS NULL:2012/07/05(木) 19:18:57.36 ID:???
Postgresならdistinct onでできるけど
標準SQLではない点はマニュアルにも書いてある通り
http://www.postgresql.jp/document/current/html/queries-select-lists.html
840NAME IS NULL:2012/07/05(木) 19:24:03.31 ID:???
環境ないからSQL書かんけど
nameでgroup byしてmin(id)とって、それと突き合わせてemail取るとかでいけそうな
841NAME IS NULL:2012/07/05(木) 20:38:42.24 ID:???
それなら
>>4
とだけ書けばいい
842NAME IS NULL:2012/07/05(木) 20:54:58.05 ID:???
>>839-841
ありがとうございます。
distinct onがいちばん簡単そうなので、これでできるかをまず検討し、
できなければ>>4の方法でいこうと思います。
843NAME IS NULL:2012/07/06(金) 00:26:01.09 ID:???
C# SQLite
特定の列にNallがあるかどうかの判定をして、あるかないかによって0または1を返したいのですが
へたれな頭で考え、ネットからコピーして、下記のように力業?で一応出来ております
もっと簡単にできるものでしょうか?

// 変数宣言
const string DATABASE_NAME = @"c:\test.db";
string gDataBaseFilePath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), DATABASE_NAME);
string gDataSource = "Data Source=" + Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), DATABASE_NAME) + @";password=""testpass""";
int hantei = 0;

// 処理
private void HanteiShori() {
string sql;
SQLiteCommand command;

using (SQLiteConnection conn = new SQLiteConnection(gDataSource)) {
try {
conn.Open();
int allData = 0;
int noNall = 0;

// レコード数
sql = "SELECT COUNT(*) FROM testTable";
command = new SQLiteCommand(sql, conn);
SQLiteDataReader reader = command.ExecuteReader();

while (reader.Read()) {
string tmp = reader[0].ToString();
allData = int.Parse(tmp);
}

// Nall以外の数
sql = "SELECT COUNT(retuData) FROM testTable WHERE retuData is not NULL";
command = new SQLiteCommand(sql, conn);
reader = command.ExecuteReader();

while (reader.Read()) {
string tmp = reader[0].ToString();
noNall = int.Parse(tmp);
}

if (allData > noNall) {
hantei = 1;
}
else {
hantei = 0;
}
}
catch { }

finally {
conn.Close();
}
}
}
844NAME IS NULL:2012/07/06(金) 00:39:12.40 ID:???
NallってNullのことか?
普通にNullの行数数えるだけだろ
select count(*) from testTable where retuData is null
でダメなのか?
845843:2012/07/06(金) 00:59:36.16 ID:???
それでいけました
ありがとうございます

それにしてもへこむ、、、
結構がんばって検索して頭ひねったつもりでいたのにあっさりと答えて頂いた
自分で出来たときなんか「オレって天才じゃねw」とか思っていたりして

しかも長文が恥ずかしい
さらにNallって

精進いたします
846NAME IS NULL:2012/07/06(金) 01:02:50.02 ID:???
アフリカではよくあること
847NAME IS NULL:2012/07/06(金) 02:58:52.30 ID:???
格好つけて「なる」と発音してきたのはよく分かった。
848NAME IS NULL:2012/07/06(金) 10:54:20.12 ID:???
俺もナルって言ってるわ。
ドイツ語だとヌルらしいな。
ゼロもヌルだそうなので、ジェームス・ボンドはドイツ語だと「ヌルヌルズィーベン」だそうな。
849NAME IS NULL:2012/07/06(金) 13:04:15.89 ID:???
そしてポッカの「レモン100」は、
ツィトローネ フンダート!
になるんですよ。

スレ汚しごめん。
850NAME IS NULL:2012/07/06(金) 22:24:51.95 ID:???
>>835
なんだよ、SQLite スレとのマルチかよ。
851NAME IS NULL:2012/07/08(日) 13:04:32.99 ID:0KdAjTTB
DB初心者です。質問させてください。

特定多数の人が利用するFacebookの投稿情報を管理するデータベースを作るとした時に、
そのデータのテーブルの作り方は、

1案. UserIDカラムのある一つのテーブルに全部入れてしまうのか
2案. ユーザー毎にテーブルを作って管理するのか

では、一般的にはどちらのほうが良いとされるのでしょうか。

2案では、同じカラムのテーブルが作られるから、1案が妥当になるのでしょうか。
しかし一つのテーブルに特定多数の人のデータが入っているのはいかがなものかという気がしてます。

一ユーザーが保存する投稿データは10件くらいにする予定です。

よろしく御願いたします。
852NAME IS NULL:2012/07/08(日) 13:31:01.25 ID:???
普通に案1のほうだろ。
853NAME IS NULL:2012/07/08(日) 13:31:23.54 ID:???
ってスレチだな。設計スレに行け。
854NAME IS NULL:2012/07/08(日) 13:45:42.69 ID:???
ユーザごとにテーブルっていう発想が素晴らしい
将来大物になるかも
855NAME IS NULL:2012/07/08(日) 13:53:02.65 ID:???
DB初心者がいきなりでかい物を作ろうとするときのよくある勘違い発想じゃん
856851:2012/07/08(日) 13:55:23.74 ID:0KdAjTTB
普通は1案ですか。
スレチで且つお恥ずかしい質問でどうも申し訳ございませんでした。
ありがとうございました。
857NAME IS NULL:2012/07/08(日) 13:56:47.06 ID:???
2案でやってみりゃすぐ破綻するからやってみ。
858NAME IS NULL:2012/07/08(日) 14:11:34.51 ID:???
>>856
すこし集合を勉強すれば?
859NAME IS NULL:2012/07/08(日) 14:26:58.35 ID:???
>>856
結構意味深い質問なのではないかと思う。
オブジェクト指向で育った人なら2案を考えても不思議ではない。
2案の弱点は最終的には FROM テーブル名 のテーブル名のところに
変数を持って来なくてはならなくなる。それはSQLの設計思想から外れる。
860851:2012/07/08(日) 14:52:18.70 ID:0KdAjTTB
>>857
ユーザーが増えすぎると、一々ユーザー毎のテーブルを開くのに破綻するということでしょうか。
普通はトランザクション使って大量データを更新するんですね。

>>858
はい

>>859
すごいですね。仰せのとおり会社業務では、オブジェクト指向のソフト開発がほとんどです。
オブジェクト指向とは関係ないですが、よく配列データに操作するのにハッシュ的感覚で添字使って高速アクセスしたりするので、
そのような考え方をしてたと思います。


つまりは何回もテーブルは開いたり閉じたりするなということでしょうか。

因みにSQLiteです。
861NAME IS NULL:2012/07/08(日) 15:00:29.24 ID:???
>>859
> オブジェクト指向で育った人なら2案を考えても不思議ではない。

え?w
862NAME IS NULL:2012/07/08(日) 15:01:07.43 ID:???
あるユーザーの投稿一覧を取得しようとしたとき
どのテーブルを使うかはどうやって調べるんだよ
863851:2012/07/08(日) 15:12:04.26 ID:0KdAjTTB
>>862
ユーザー毎のテーブルなのだから、テーブル名がユーザーIDです。
864NAME IS NULL:2012/07/08(日) 15:20:23.06 ID:???
そのユーザーIDはどこから引いてくるの?
何らかの検索結果で出たIDをテーブル名にしてさらにSQL発行するのか
一つのテーブルなら一発でひけるのに
865NAME IS NULL:2012/07/08(日) 15:22:15.49 ID:???
>>863
ユーザマスタ(ID,名前)もユーザ毎にテーブルを作らないのか?w
866851:2012/07/08(日) 15:24:32.16 ID:0KdAjTTB
>>864-865
一つのテーブルでいいことはもうわかりましたのでそうします。
ありがとうございました。
867NAME IS NULL:2012/07/08(日) 15:55:21.33 ID:???
スレ違いだってのがわからないの? 馬鹿なの? 死ぬの?
868NAME IS NULL:2012/07/08(日) 16:00:10.99 ID:???
うまい回答が出来なかった時の免罪符ってか
869NAME IS NULL:2012/07/08(日) 16:13:29.99 ID:???
生まれて初めてプログラミング(PHP+MySQL)やったとき、
主キーもインデックスも知らなかったから、動作を軽くするためにやったわw>キーごとにテーブル作成
870NAME IS NULL:2012/07/08(日) 16:21:44.74 ID:???
生まれて初めてのプログラミングでデータベースまで使ったのか、
最近の子はすげーな。
871NAME IS NULL:2012/07/08(日) 16:41:16.69 ID:???
このスレの凄いところは
普段は人の気配がほとんどないと思わせておきながら何かあると急に湧き出してくるところ
872NAME IS NULL:2012/07/08(日) 16:42:25.56 ID:???
主キーって今まで設定してなかったんだけどあれなに?
873NAME IS NULL:2012/07/08(日) 16:44:31.93 ID:???
ぬしキーを知らぬとは、、、
874NAME IS NULL:2012/07/08(日) 16:45:26.97 ID:???
Facebookの管理にそんな必要があるかは疑問だが、個人ごとにテーブルで
管理することの面白さは、それぞれの個人を別の属性の集合、全積、関係として
管理できる点にある。設計という観点からすれば、それなりに筋が通っている。
ただ、RDBそれからRDBに起源を持つ、SQLとは折り合わない部分が多々ある
のでは、ということだ。
875NAME IS NULL:2012/07/08(日) 16:45:51.59 ID:???
ぬしって読むのかw
しゅきーかと思ってた
876NAME IS NULL:2012/07/08(日) 16:47:41.14 ID:???
>>872
そういう話をテーマにしたスレが確かあったはず。
877NAME IS NULL:2012/07/08(日) 16:55:33.51 ID:???
>>876
恐怖なんとやら、っていうスレなら随分前に1000まで行って終わった。
878874:2012/07/08(日) 17:50:53.36 ID:???
ごめん直積だった。最近こんな言葉使ったことなかったもんで・・すみません。
879NAME IS NULL:2012/07/08(日) 18:51:31.79 ID:???
>>874
そんな設計で筋が通っているなんて・・・恐ろしくてとても言えないわw
880NAME IS NULL:2012/07/08(日) 19:33:51.79 ID:???
そういや設計スレもだいぶ前に落ちたよな
とか言おうと思ったらまた立ってた

DB設計を語るスレ 6
http://toro.2ch.net/test/read.cgi/db/1341061787/
881Kinjyo Hirohito:2012/07/08(日) 22:28:06.75 ID:???
入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり
HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など
DETAILには、アイテムと数量が入っているとします
そこでDAILY MOVEMENTを作成したいのですが、
1~31のように固定ではなく、トランザクションがあった日のみ、つまり
SELECT TRANS_DATE FROM
(SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y'
UNION ALL
SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE
group by TRANS_DATE ORDER BY 1
でTRANS_DATE抽出しておきます
結果をREPORT WRITEとかWEBを用いずに
TRANS_DATEが横方向に1行目に表され、
2行目1カラムは、アイテム、2カラム目はOPENING数量で、
3カラム以降はIN又はOUTの数量を表記したいのですが
JUL/8はトランザクションがありませんので表記されていません
最後のカラムは、その月の現在までのSUMMARY

  JUL/7  JUL/9           JUL
IN OUT IN OUT IN OUT CLOSE
   3 5   3 3 8  15

みなさんなら、どうSQLを書きますか、教えてください
882NAME IS NULL:2012/07/08(日) 22:43:59.63 ID:???
>>7
883Kinjyo Hirohito:2012/07/08(日) 23:56:14.25 ID:???
Stored Procedureを用いてループさせるとした場合ならどうでしょうか
特にどのSQLかは、こだわりませんが、擬似SQLコードでは、どうでしょうか?

     JUL  JUL7 JUL9 JUL
     OPEN   IN OUT IN OUT IN OUT CLOSE
アイテム 15 3 5 3 3 8 10
884NAME IS NULL:2012/07/09(月) 00:22:30.19 ID:???
>>881
まともに意見が欲しいなら、もうちょっと他人に解るように説明した方が良いんじゃね
俺様用語が多すぎるわ

SQLに「表記」はないぞ
なぜそれをカラム可変でやる必要があるのか理解できん
素直に日付ごとに行を持てば(出力すれば)良いんじゃないのか
885Kinjyo Hirohito:2012/07/09(月) 23:45:13.84 ID:???
トランザクションが毎日あるなら別ですが、1週間に2,3回とかですと、
ブランクばかりになってしまいます、ですので可変で表記する必要があります
もちろんレコードが存在する日付のみを、カスケイドすれば可変になりますが
それでは、知恵がないかと思いまして、SQLに経験豊かな方々は、
どのようなコーディングをされるのかを、拝見したく思いまして
886NAME IS NULL:2012/07/10(火) 00:04:30.95 ID:???
>>885
>>884は、カラム数を可変にする必要性があるのかっていってるんだが?
トランザクションが二日あったら、2行で出力すれば良いんじゃないのか?
それを表示するときにホストアプリで縦横変換すれば良いだけで
データの表示形式を決めるのはSQLの範疇ではないって言ってるんだが

>レコードが存在する日付のみを、カスケイドすれば可変
意味がわからん
887NAME IS NULL:2012/07/10(火) 00:11:39.66 ID:???
日本語でおk
888NAME IS NULL:2012/07/10(火) 05:47:11.21 ID:???
そもそも、これは7月の入出庫だけが入っているテーブルなのかな。
7月だけActiveにしてあるなんて考え難いし。
889Kinjyo Hirohito:2012/07/10(火) 07:23:45.50 ID:???
Activeは、その月を取り出すためためだけの目的でして、
倉庫では、お客様の都合で2重帳簿を作ることがしばしばあります
つまりトランザクションDATEの年と月だけでデータ抽出すると
要望に答えれないからです。在庫があるのに、落としてある、
在庫がないのに、あるように見せるなど、各お客の要望に従って
幾つかのACTIVEのようなカラムを儲けています
890NAME IS NULL:2012/07/10(火) 09:10:09.76 ID:???
後から後からどんどん条件が出てくる w
891NAME IS NULL:2012/07/10(火) 10:09:57.34 ID:???
条件というか蛇足だな
本質は>>5のカラム数をデータに依存して決定したいという話なのに
892NAME IS NULL:2012/07/10(火) 10:29:42.27 ID:???
自分で調べる奴・・・問題の本質を理解する力がある
2chで聞いて済ませる奴・・・抽象化する力がないので質問内容もわけわかめ
893NAME IS NULL:2012/07/10(火) 22:07:06.14 ID:???
SQLじゃなくてRPGでも使うべきなんだろうな、ああいう人は。
894NAME IS NULL:2012/07/10(火) 22:29:11.76 ID:???
SQLの代わりにグレネードランチャー使うって凄いな
895NAME IS NULL:2012/07/10(火) 22:50:11.91 ID:???
oracle使っているのですが、
カンマ区切りの文字列を、カンマで分割した複数行としてSELECTできないでしょうか?

SELECT * FROM (select "1,2,3,4" from dual) 〜〜〜〜〜
とかで複数行として、カンマ分割した結果がほしいです!
896NAME IS NULL:2012/07/10(火) 22:57:58.51 ID:???
無理やりやるならテキストデータレベルでカンマを「 from dual union select 」で置換して
select * from (select '1' from dual union select '2' from dual union select '3' from dual union 〜)
みたいにする
897NAME IS NULL:2012/07/10(火) 22:58:18.39 ID:???
>>895
ストアド書けばいいんじゃね?
http://ichi-note.sblo.jp/article/34919609.html
898895:2012/07/10(火) 23:33:45.63 ID:???
ご教示ありがとうございます!
テキストベースにしたりファンクションにしたりしないとやはり厳しいんですね・・・。
ファンクション形式でやってみます!
899NAME IS NULL:2012/07/11(水) 04:31:57.39 ID:???
まず格納時にちゃんと複数行で格納するべき
それが無理なら、ホストアプリで分解する
SQLやストアドで何とかするのはとても勧められない
900NAME IS NULL:2012/07/11(水) 10:40:32.47 ID:???
テーブル名:PRODUCT

CODE, PRODUCT_NAME, M_Type
001,パソコン,01
002,パソコン NEC,01
003,パソコン FUJITSU,01
004,パソコン,01
005,パソコン,02
006,プリンター,03
・・・

とあるとき

@
PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか?

001,パソコン,01
004,パソコン,01
005,パソコン,02

が出て欲しい

A
PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか?

001,パソコン,01
004,パソコン,01

が出て欲しい

お願いします。

901NAME IS NULL:2012/07/11(水) 11:04:57.54 ID:???
GROUP BYしてHAVINGかな
902NAME IS NULL:2012/07/11(水) 11:35:56.43 ID:???
DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0)

[テーブルデータ]

CREATE TABLE tblA(
id INTEGER,
status001 INTEGER,
status002 INTEGER,
status003 INTEGER,
status004 INTEGER,
.
.
.
status300 INTEGER
);

id |status001|status002|.... . |status300|
----+--------+--------+ +--------|
1| 0 | 0 | | 0 |
2| 1 | 0 | | 0 |
3| 0 | 0 | | 1 |
4| 0 | 1 | | 1 |
5| 0 | 0 | | 0 |
6| 1 | 1 | | 0 |
7| 0 | 1 | | 0 |
8| 1 | 1 | | 1 |
9| 1 | 1 | | 0 |

想定レコード数 50,000〜2000,000

[欲しい結果]
-------------------------------------------
status001 | 4 //status001=1であるレコード数
status002 | 5 //status002=1であるレコード数
.
.
.
status300 | 3 //status300=1であるレコード数

正規化に問題があるように思えますが
これらを一度のSQLで取得出来ないでしょうか。
この結果を最も速く取得する方法を模索しています(__)
903NAME IS NULL:2012/07/11(水) 12:53:07.45 ID:???
UNIONを300書けばできる
904902:2012/07/11(水) 13:27:22.01 ID:???
>>903
一例ありがとうございます。既にそちらの方法は作成済みです。
905NAME IS NULL:2012/07/11(水) 16:03:08.87 ID:???
>>901

すみません知識不足のためよくわからないです。
サブクエリの部分がよくわからないです。
906NAME IS NULL:2012/07/11(水) 16:48:12.77 ID:???
ggrks
907NAME IS NULL:2012/07/11(水) 17:44:27.04 ID:???
>>900
select * from product group by product_name having count(*) > 1;
かな。試してないけど。
908NAME IS NULL:2012/07/11(水) 18:10:02.97 ID:???
>>900
@
select *
from  PRODUCT T1
where  exists (
        select *
        from  PRODUCT T2
        where  T1.CODE <> T2.CODE
        and   T1.PRODUCT_NAME = T2.PRODUCT_NAME
    )
;

A
select *
from  PRODUCT T1
where  exists (
        select *
        from  PRODUCT T2
        where  T1.CODE <> T2.CODE
        and   T1.PRODUCT_NAME = T2.PRODUCT_NAME
        and   T1.M_Type = T2.M_Type
    )
;
909NAME IS NULL:2012/07/11(水) 18:22:06.44 ID:???
>>902
>>903に一票

それか結果を
status001|status002|.... .|status300|
--------+--------+  +--------|
      4|     5|  |      3|
で得てからアプリ側で縦横入れ替えるか
910NAME IS NULL:2012/07/12(木) 11:02:21.60 ID:???
テーブル作りなおすべき
911NAME IS NULL:2012/07/12(木) 11:31:15.26 ID:???
【質問テンプレ】
・SQLite3
・テーブル
id,unixtime
100001,1341404056
100001,1341997094
100001,1341987930
100002,1341997860
100002,1341989037

・欲しい結果
100001,1341997094
100002,1341997860

・説明
上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出すには
どのようなクエリでできるでしょうか。1回では無理でしょうか。
912NAME IS NULL:2012/07/12(木) 11:40:58.03 ID:???
select id,max(unixtime) from hoge group by id order by id;
913911:2012/07/12(木) 11:53:58.76 ID:???
すみません、情報不足でした。テーブルにはテキスト情報もあり、
id,unixtime,value
"1" "1341404056" "内容1"
"1" "1341997094" "内容2"
"1" "1341987930" "内容3"
"2" "1341997860" "内容1"
"2" "1341989037" "内容2"

このような場合に
>>912さんに教えていただいた
select id,max(unixtime),value from t_test group by id order by id
とすると、
"1" "1341997094" "内容3"
"2" "1341997860" "内容2"
と内容がずれてしまうのですが、

こういった場合では、
"1" "1341997094" "内容2"
"2" "1341997860" "内容1"
と出すにはどうしたらよいでしょうか。
914NAME IS NULL:2012/07/12(木) 12:07:38.20 ID:???
>>913
それだと副問い合わせになるな
(id,unixtime) がユニークだとして

select t.id,t.unixtime,t.value from t_test t,
(select id,max(unixtime) as unixtime from t_test group by id) tmp
where t.id=tmp.id and t.unixtime=tmp.unixtime
order by t.id;
915911:2012/07/12(木) 12:25:38.43 ID:???
>>914
神様ありがとうございます!出来ました!
916902:2012/07/12(木) 13:38:28.50 ID:???
ご意見ありがとうございます!

>>909
検討してみます。

>>910
status群を子テーブルにするのが正しい姿のような気がします。
917NAME IS NULL:2012/07/12(木) 13:52:41.61 ID:???
代わりにエクセルとかでささっと編集するのが面倒になるけどね
918NAME IS NULL:2012/07/17(火) 22:22:45.76 ID:Di4GcY9V
・DBMS名とバージョン
MySQL5
・テーブルデータ
name (verchar)

abc040
abc100
abc90
abc20
abc1000

・欲しい結果
nameはユニーク
abcは固定、そのあとに数値文字列
ソートして、数値文字列の大きい順に抽出したい

abc1000
abc100
abc90
abc040
abc20

・説明
919NAME IS NULL:2012/07/17(火) 22:46:27.80 ID:???
4文字目以降をゼロ詰めしてソートすればいいな。
920NAME IS NULL:2012/07/17(火) 23:08:36.14 ID:???
4文字目以降の文字列を作る
左側を0でトリムする
その値で降順ソートする
921NAME IS NULL:2012/07/17(火) 23:16:02.84 ID:???
ご意見ありがとうございます!

ちょっと難しそうですね。
922NAME IS NULL:2012/07/18(水) 01:16:57.24 ID:???
ABCが固定であれば、
order by カラムdesc;
じゃ駄目なの?
923NAME IS NULL:2012/07/18(水) 03:57:57.20 ID:???
4ケタ目以降で、ゼロ埋めじゃなくて、数字変換する方が良いと思うんだが
つかまあテーブル定義やり直すべきだろう
カラムは最小単位で定義するのが鉄則
924NAME IS NULL:2012/07/18(水) 08:04:37.87 ID:???
>>922
それだと
abc90
abc20
abc1000
abc100
abc040
こうなるよ
925NAME IS NULL:2012/07/18(水) 16:16:22.74 ID:???
>>918
SELECT * FROM table ORDER BY CAST(TRIM(LEADING 'abc' FROM name) AS SIGNED INTEGER);
926NAME IS NULL:2012/07/18(水) 21:22:10.82 ID:???
>>925
完璧です。
ありがとうございます。
927NAME IS NULL:2012/07/19(木) 00:26:03.79 ID:???
・バージョン
MySQL5.5

・テーブルデータ
time (TIME), num1 (INT), num2 (INT)

00:00:00, 1, 0
00:00:10, 2, 0
00:00:20, 3, 2
00:00:30, 4, 3
00:00:40, 5, 3

・欲しい結果
00:00:20, 3, 2
00:00:30, 4, 3
00:00:40, 5, 3

・説明
time(時刻)が新しい(最近の)方から3行ぬきだし、
timeが昇順になるように並べます。
SELECT文でうまいことできないでしょうか。
よろしくお願いします。
928NAME IS NULL:2012/07/19(木) 06:57:42.24 ID:???
>>927

↓俺が使ってるもの(銘柄コード指定で最新データ10日分のを抜き出し
 日付の昇順で表示するもの

select * from
( select vdate,sp,hp,lp,cp ,vol
from daily_sp_tbl where sc=5401 order by vdate desc limit 10 ) t
order by vdate;

そちらの名称に合わせて書き換えてみたら
929NAME IS NULL:2012/07/19(木) 15:53:43.08 ID:???
ゴキ光線のお小言が始まるでぇ〜( ´Д`)y━・~~
930NAME IS NULL:2012/07/22(日) 23:57:04.02 ID:???
・DBMS名とバージョン
SQLite3
・テーブルデータ
tbl1 tid(auto), name(text)
tbl2 tid(int), sid(int)
tbl3 sid(auto), tag(text),type(int)

ざっとこんな感じでnameに対して複数のタグを持っている
といった感じのテーブルに対して、データを入れたいと思っています。
で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、
タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、
と手数が思ってた以上に多いので、
挿入の手数をもう少し減らせる手段とかありませんか?
931NAME IS NULL:2012/07/23(月) 06:43:06.22 ID:???
何言ってんのか分かんない
932SQL初心者:2012/07/23(月) 11:43:26.77 ID:???
SQLの質問がありまして、書きます。

Aテーブル
A B C
1 11
2 22
3 33


Bテーブル
A B C
4 44 1
5 55 2
6 66

欲しい結果
A B
1 44
2 55
3 33
6 66

BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。
何かアドバイスお願いします。。。。。
調べても、よくわからなかったので。。。
お願いします。。。
933NAME IS NULL:2012/07/23(月) 12:57:29.52 ID:???
>>932
欲しい結果の(3,33)と(6,66)を考えなければ
select A.A, B.B from A,B where A.A=B.C;
で簡単なんだが、下の二行はどういう条件で抽出されるべきなの?
934SQL初心者:2012/07/23(月) 13:03:33.77 ID:???
>>933
そうなんですね。。。
BテーブルのCに一致しないものを表示させたいです。。。。。。。
935NAME IS NULL:2012/07/23(月) 13:39:50.34 ID:???
AテーブルのAとBテーブルのBはかぶらないのか?
AとBをUNIONして、BをOUTER JOINしてCASEでNULL判定かな
936NAME IS NULL:2012/07/23(月) 18:36:14.05 ID:???
こういうことじゃないの?
select case when A.A is null B.A else A.A end as A,
    case when B.B is null A.B else B.B end as B,
from  A
    full outer join
    B
    on A.A = B.C
937SQL初心者:2012/07/23(月) 20:45:54.91 ID:???
大変ありがとうございました。
みなさんのおかげで、無事にできました。
938NAME IS NULL:2012/07/24(火) 00:21:52.45 ID:???
>>936
> case when A.A is null B.A else A.A end as A,

なんで、coalesce(A.A, B.A) 使わないの?
939NAME IS NULL:2012/07/24(火) 06:22:52.28 ID:Gfkf5V7p
初心者用が見つからなかったのでこちらで質問します

テーブル tbl
|-----INDEX----|--DATA--|
yyyy mm dd no item
2012 01 05 005 itemAA
2012 01 05 007 itemAC
2012 01 05 009 itemBB
2012 01 10 001 itemBA
2012 01 10 007 itemFG
2012 01 12 006 itemQW
      :
      :

結果
2012 01 10 001 itemBA
2012 01 10 007 itemFG

この場合
select * from tbl
where yyyy='2012'
 and mm='01'
 and dd='10'

このようにnoを指定しないと検索時にインデックスは有効とならないのでしょうか?
インデックスはその項目全てをSQLに明記しないと有効とはならないのでしょうか?

初歩的すぎる質問だと思いますがお願いします
940NAME IS NULL:2012/07/24(火) 06:24:12.46 ID:???
sage忘れました
申し訳ないです
941NAME IS NULL:2012/07/24(火) 06:52:25.93 ID:???
インデックスってこのスレで取り扱ってたっけ
942NAME IS NULL:2012/07/24(火) 06:53:23.18 ID:???
オプティマイザ次第。
943NAME IS NULL:2012/07/24(火) 18:40:45.30 ID:???
>>938
DBMS名書いてないから

>>939
普通のインデックス構造をもつ普通のDBMSなら普通は有効となる
ただしどんな状況でも必ずそうだとは言い切れないので
実機でアクセスパスを確かめること
(確かめる方法はDBMS固有なのでスレ違い)
944NAME IS NULL:2012/07/24(火) 18:58:10.33 ID:???
オプティマイザ以前に、そのDBMSでその手の検索にインデックスが有効かどうかが問題
今時のDBMSなら効くと思うけど、まずはDBMSのマニュアルで確認するべきだな
そのうえで実際の読み込みにインデックスが使われるかどうかはオプティマイザ次第

つか初心者ならまずちゃんとマニュアル読めよと
945NAME IS NULL:2012/07/24(火) 21:17:09.74 ID:???
・DBMS名とバージョン MySQL 5.1
・テーブルデータ
CSVファイル
"犬","シベリアンハスキー"
"猫","マンチカン"
"熊猫","レッサーパンダ"
・欲しい結果
インポートして、次のようにしたい、要するに連番をつけたい
ID 動物 種類
1 犬 シベリアンハスキー
2 猫 マンチカン
3 熊猫 レッサーパンダ
・説明
インポートするときにdefaultをつければいいのですが、SQL文で書けないでしょうか。
946NAME IS NULL:2012/07/24(火) 21:24:05.88 ID:???
MySQLならAUTO_INCREMENTあるだろ
947NAME IS NULL:2012/07/24(火) 21:26:27.73 ID:???
すると次はレコード消した時にIDが虫食い状態になるのでなんとかしたい…とかの質問が来るんだな w
948NAME IS NULL:2012/07/24(火) 21:38:32.92 ID:???
>>946
そうなんですが、csvのデータをいじらずにSQLのload data infile文で
なんとかならないかと思ったのですが
949NAME IS NULL:2012/07/24(火) 22:20:57.99 ID:???
誰がいじれなんつった?両方使えよ
950NAME IS NULL:2012/07/24(火) 22:23:29.63 ID:???
そんなんSQL92の範囲にあったっけ?
951939:2012/07/24(火) 22:28:35.43 ID:???
>>941-944
MySQL 5.5 と ACCESS2003です

オプティマイザ及びアクセスパスについて調べてみることにします
レスありがとうです (_ _)
952NAME IS NULL:2012/07/24(火) 23:46:11.86 ID:???
>>943
> DBMS名書いてないから

そんなこと言うなら、case もダメだろ。
Access かも知れないんだし。

前提書いてないなら、SQL-92 あたりを想定してもいいと思うんだが。
953NAME IS NULL:2012/07/26(木) 11:15:02.64 ID:???
MySQL5.1

セール価格表(P)
商品CD 適用日 単価
aaa 2012-08-01 2500
aaa 2012-08-20 3000
bbb 2012-08-01 10000
bbb 2012-08-15 8500

予約表(Y)
商品CD 購入日 数量
aaa 2012-08-01 2
aaa 2012-08-05 3
aaa 2012-08-25 1
bbb 2012-08-13 4
bbb 2012-08-19 5

ほしい表
aaa 2012-08-01 2 2500
aaa 2012-08-05 3 2500
aaa 2012-08-25 1 3000
bbb 2012-08-13 4 10000
bbb 2012-08-19 5 8500

購入日時点で適用日以降の単価が反映された表を得るにはどうしたらいいでしょうか
954NAME IS NULL:2012/07/26(木) 13:15:07.54 ID:???
>>953

SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 < 予約表.購入日 ORDER BY 適用日 ASC LIMIT 1) AS 価格,
FROM
予約表

みたいのでいけない?
思いつきで確認してない上に普段こうならんように組んじゃうから間違っているかもだけど。
あと、もっと効率のいいのがると思うけど。
955NAME IS NULL:2012/07/26(木) 13:22:03.93 ID:???
予約表に単価を持たせる
冗長だけど我慢する
956NAME IS NULL:2012/07/26(木) 13:50:59.48 ID:???
>>954

下記のように少し直しましたら、動きました・・☆。
ありがとうございました。

SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 <= 予約表.購入日 ORDER BY 適用日 DESC LIMIT 1) AS 価格,
FROM
予約表
957NAME IS NULL:2012/07/26(木) 13:56:30.95 ID:???
>>955
セール価格表には単価だけでなく、期間立てで持っているフィールドがあるんです。
958NAME IS NULL:2012/07/26(木) 13:58:30.67 ID:???
>>956
決して効率よくないはず。
可能であれば、ホスト言語側でマージして
DB側に負担かけないようにしたほうが後日幸せになれるはず。
959NAME IS NULL:2012/07/26(木) 14:37:47.34 ID:???
MySQL 5.1です。

テーブル1
15:30:20 カツ丼
15:35:40 天丼
15:50:15 他人丼

テーブル2
15:30:30 400円
15:35:45 550円
15:51:00 480円

というテーブルがあって、テーブル1と2の時刻が近いものをマッチさせて
15:30:20 カツ丼 400円
15:35:40 天丼 550円
15:50:15 他人丼 480円

のような結果を出したいのですが、どのようにすればいいでしょうか。

よろしくお願いします。
960NAME IS NULL:2012/07/26(木) 15:52:58.39 ID:???
夏休みだからかな。
なんかの設問ぽいのが来ているな。

>>959
UNIX_TIMESTAMP()とABS()使って最も差分が最小値のを取り出せばいいんじゃないかな。
これ以上は、>>4見て質問書き直して。

UNIXTIME_TIME
961NAME IS NULL:2012/07/26(木) 16:12:19.74 ID:???
>>959
ごめん。
TIME_TO_SEC()だわ。
962NAME IS NULL:2012/07/26(木) 17:54:19.18 ID:???
>>960-961
設問じゃないのですが、ありがとうございます。
963NAME IS NULL:2012/07/27(金) 10:17:32.88 ID:KIhgtPiw
・DBMS名とバージョン
SQLite3

・テーブルデータ
テーブル名 directory
folder   val
/contact/  index
/test/    connect
/example/  foo
/hoge/    bar
/fuga/    com

・欲しい結果
問い合わせ内容とfolderの内容が部分一致していればvalを返す
/contact/ にアクセスがあった場合はindexを返す
/contact/foo の場合もindexを返す

・説明
$folder_hensuu = "%/contact/%";
select * from directory WHERE folder LIKE $folder_hensuu
とした場合はヒットするが

$folder_hensuu = "%/contact/hogehoge%";
の場合はヒットしない。
この場合はどうすれば一致判定が出来るようになりますか?
964NAME IS NULL:2012/07/27(金) 12:03:20.04 ID:???
SQLite3はよくわからないんだけど、なんか逆にすべきな気がする。
つまり、部分一致する際にそのWHEREの基準となるのがfolderカラムのほうでしょ。
だから、カラムのほうに文字列結合でみたいにすればいいんではないでしょか。
MySQLしか出来ないのでこれ以上は申し訳ない…。

MySQLで書くとこんな感じ。
SELECT val FROM test WHERE '/connect/hogehoge' LIKE CONCAT('%',folder,'%');
965NAME IS NULL:2012/07/27(金) 15:51:18.54 ID:???
休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。

・データベース:PostgreSQL 8.4
・テーブル:
休憩時間
開始時刻 終了時刻
08:00 08:30
19:00 19:30
22:00 22:30

使うかどうかわかりませんが、次のマスタもあります。
カレンダー
日付
...
2012-07-26
2012-07-27
2012-07-28
...

・説明
指定した日時から休憩時間を除いた'HH:MM'後を計算します。
計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。

・欲しい結果
'2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す)
'2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え)
'2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30'
'2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む)
966NAME IS NULL:2012/07/27(金) 16:12:55.58 ID:???
>>965
難問。
967NAME IS NULL:2012/07/27(金) 16:20:08.40 ID:???
>>965
確かに難問だ。
何を聞かれているのか説明を見るとすさまじく混乱する。

つまり、
1.出勤時刻と実労時間数を入力されたら
2.休憩時間を実労時間からはずした上で
3.勤務終了予定時刻を出力しろ。
4.ただし、終了予定時刻が休憩時間内である場合は、休憩終了時刻を出力する
ってこと?

それだけだと、欲しい結果のその日付の存在理由がなんなのかわからなくなるけど。

入力されるデータの例を出して。
ただし、ちゃんとフォーマットした形でね。
968967:2012/07/27(金) 16:31:53.50 ID:???
ごめん、1〜4を踏まえた上で例を考え直してってことでお願いします。
おそらく最後の例のままでいいんだろうけど
ちょと日本語読み直してたら混乱してきてた。
969NAME IS NULL:2012/07/27(金) 17:56:09.34 ID:???
>>967
私は出題者ではないのですが、
次の休憩開始時刻 - 一つ前の休憩終了時刻 = 就業時間 とすると
後・時間からこの就業時間を切り取って行く問題ですね。
さらに最後の休憩時間の後の就業時間をどう表現するかなど、
考えどころの多い問題のようです。
970965:2012/07/27(金) 18:19:05.67 ID:???
すみません。ちょっと欲張りすぎました。問題を一段階簡略化します。

休憩時間がマスタに設定されているとき、「与えられた日時」から実働9時間後の日時を求める。
(※)実働とは、休憩時間を除いた勤務時間。

この結果は、残業届けを出すときの残業開始日時を計算するときに使います。
(その後、月締め処理で残業届けに基づいて残業時間合計を計算します。)

「与えられた日時」は、未来の日付の残業届けを出すときは定時開始時刻(例えば09:00)になり、
過去の日付の残業届を出すときは、遅刻をしていればその日時になります。

例えば、'2012-07-27 09:00'と'09:00'という即値を使ったクエリで、 '2012-07-27 18:00'が計算
できるでしょうかというのが質問です。

勤務している時間を'+'、休憩時間を'_'で表すと、一日は、
++++++___++++++__+++_++_++++
みたいに表せて、任意の開始日時(下の*)から9時間後を求めたいということです。
+*++++___++++++__+++_++_++++
+++*++___++++++__+++_++_++++

うまく説明できたでしょうか?
971965:2012/07/27(金) 18:28:24.50 ID:???
>>969
そう、その通りです。

Excelでイメージするなら、休憩時間と勤務時間の累計をして、目視で判断すればすぐに
わかりそうな問題なんですが、クエリでできないものかと…。

最も好ましいのは、一つのクエリで結果を計算できること、
次に好ましいのは、ワークテーブルを使わずにPostgreSQLのFunctionで計算できること。

最悪はワークテーブルに「実休憩時間」を展開して、複数ステップを踏んで計算するか、
Functionを再帰呼び出しして(できるのだろうか)結果を求めるか、クライアントアプリ側で
ゴリゴリやるかになると思います。
972NAME IS NULL:2012/07/27(金) 19:10:02.82 ID:???
いやそれ、SQLでゴリゴリやる内容じゃないと思うぞ。
973NAME IS NULL:2012/07/27(金) 19:40:57.39 ID:???
休憩時間じゃなくて、実働時間をもたせたら
実働時間のサマリが指定時間を超える最大のものとかで求まらんかな
974NAME IS NULL:2012/07/29(日) 00:41:03.59 ID:???
データベース:MySQL 5.1

ストアドファンクションを作成しているのですが、
ストアド内ではGetDate()は使用できないのでしょうか?
また、何か代替のものはあるのでしょうか?

初歩的な質問で申し訳ありません。
975NAME IS NULL:2012/07/29(日) 19:49:26.46 ID:???
WHERE句の(+)ってどういう意味なのですか?
ぐぐっても出なかったもので(^_^;)
976NAME IS NULL:2012/07/29(日) 20:02:30.69 ID:???
Oracleだと外部結合演算子でググれ
他は知らん
977NAME IS NULL:2012/07/29(日) 20:38:52.00 ID:???
Oracle方言でしょ、それ
978NAME IS NULL:2012/07/29(日) 20:59:27.96 ID:???
>>976-977
ありがとうございました。
979965:2012/07/30(月) 11:43:54.03 ID:???
やはり簡単にはいかないようですね。

休みの間も考えたのですが、どうもうまくいかないので、結局、ワークテーブルを使って、
Excelでやるような累計をしながら、Functionで実装することにしました。
方針は、>>973さんの方法です。

考えて下さった方、ありがとうございました。
980NAME IS NULL:2012/07/31(火) 12:36:18.52 ID:RZdi1fDI
・Microsoft SQL2012を使っています。ちょっと質問なのですが

テーブル作成時における検査制約で、とある列の列名の長さ
が”6文字以内”という可変長の条件にしたいのですがどのよう
に書けばよいのでしょうか?

CONSTRAINT CK_stor_id CHECK(stor_id >=6 ))

上記では間違いでしょうか?よろしくお願いします。
981NAME IS NULL:2012/07/31(火) 13:42:13.86 ID:???
なぜ試して見ないの?
982NAME IS NULL:2012/07/31(火) 19:22:20.34 ID:???
間違いだろうね。
983NAME IS NULL:2012/07/31(火) 20:40:25.97 ID:???
列名の長さ?
984NAME IS NULL:2012/08/01(水) 13:26:17.32 ID:???
・SQL Server2008R2Express
テーブルデータ
・2012-08-01 11:35:00, りんご, 1
・2012-08-01 16:22:00, みかん, 2
・2012-08-02 13:54:00, りんご, 2
・2012-08-02 14:32:00, りんご, 1
・2012-08-04 16:22:00, みかん, 3

・欲しい結果
2012-08-01
2012-08-02
2012-08-04

・説明
件数に関係なく売り上げがあった日だけのリストが欲しいのですが
うまい方法あるでしょうか
985NAME IS NULL:2012/08/01(水) 15:07:44.19 ID:???
distinct と having count(*)>1
986NAME IS NULL:2012/08/01(水) 15:08:33.26 ID:???
ごめん間違えた
distinct でいい
987NAME IS NULL:2012/08/01(水) 20:08:54.81 ID:???
データベース:MySQL 5.2

table bbs(
uid INT,
rid INT,
text TEXT
);

table users(
id INT UNIQUE,
name VARCHAR(32)
);

欲しい結果のイメージ
uid, rid, uid.name, rid.name

.name は users テーブルの name の項目

掲示板で、投稿者ID (uid) と 返信先ID(rid) のそれぞれの名前を users から取得したいです。
988NAME IS NULL:2012/08/01(水) 20:22:21.92 ID:???
bbsテーブルにusersテーブルを2回JOINするだけだろ
989NAME IS NULL:2012/08/01(水) 20:47:20.02 ID:???
>>984-986
dateをformatかけて日付だけ取り出したいんじゃないかな?
Transaction-SQLわからなかったのでレスできなかったけど。

>>987
それぞれのID用にusersテーブルを別名つけて2回JOIN
やってみてダメだったら、作ったSQL文張ってみて
990NAME IS NULL:2012/08/01(水) 21:35:15.73 ID:???
>>988-989
SELECT a.id, a.name, b.id, b.name, bbs.text FROM bbs LEFT JOIN users AS a ON bbs.uid=a.id LEFT JOIN users AS b ON bbs.rid=b.id;

a とか b とかっていう名前はともかく、これでなんとか取得出来ました。
ありがとうございます m(_ _)m

(bbs にあるデータは全て取りたいので INNER ではなく LEFT にしました)


こう言った文が長くなったときに、他の言語の様にブロックで囲むと言った記述は出来ないのでしょうか?

それとも可読性を求める時は改行で分けるのが一般的なのでしょうか?
991NAME IS NULL:2012/08/01(水) 22:26:47.53 ID:???
改行とインデント使うのが一般的かと
よくやる人は>>990のSQL使うと
SELECT
a.id,
a.name,
b.id,
b.name,
bbs.text
FROM
bbs
LEFT JOIN
users AS a
ON
bbs.uid=a.id
LEFT JOIN
users AS b
ON
bbs.rid=b.id
;
くらいやる
992NAME IS NULL:2012/08/01(水) 22:43:34.35 ID:???
( ´_ゝ`)フーン
993NAME IS NULL:2012/08/02(木) 00:29:26.77 ID:???
>>991
これは改行しすぎだろ。
select みたいに、フィールド名がずらずら続く奴はべつにして
キーワードと関連するオペランドは基本的に同じ行にしといたほうが読みやすいと思うぞ。
俺ならこんな感じ。

SELECT
 a.id,
 a.name,
 b.id,
 b.name,
 bbs.text
FROM bbs
LEFT JOIN users AS a ON bbs.uid = a.id
LEFT JOIN users AS b ON bbs.rid = b.id;
994NAME IS NULL:2012/08/02(木) 00:42:40.38 ID:???
なるほど
プログラムから使うときは SQL 文を複数に分けて連結してたけど、
改行で分けて書いた方が見た目分かりやすいですね。
995NAME IS NULL:2012/08/02(木) 01:05:44.58 ID:???
>>993
俺もこんな感じで書くな

どうでもいいが俺はアプリのソースに直接SQLを埋め込む実装は好きじゃない。
SQL文は別のファイルにして、アプリからそれを読み出してwhere句の部分とかをアプリから変数で置換するのが好きだな。
アプリもSQLも仕変や改修も管理も楽になる。

と言っても元々NEとかSE出身でアプリやDBは素人のお馬鹿さんなんだがw
996NAME IS NULL:2012/08/02(木) 01:12:59.91 ID:???
>>994
あと、DBMS によってはキーワードなんかの間違い箇所を行で教えてくれるものがあるから、
長大な SQL を書く時はデバッグが楽。
997NAME IS NULL:2012/08/02(木) 16:19:44.69 ID:???
SELECT
 col1,
 col2
FROM
 (
   aTab
  INNER JOIN
   bTab
  ON
   aTab.id = bTab.id
 )
INNER JOIN
 cTab
ON
 cTab.id = aTab.id

すごく人によって差がありますなぁ…。
998NAME IS NULL:2012/08/02(木) 19:58:49.69 ID:???
999NAME IS NULL:2012/08/02(木) 20:29:23.83 ID:???
>>991-997
こっち行け

[大文字/小文字]SQLの正しい書式[改行/インデント]
http://toro.2ch.net/test/read.cgi/db/1272761178

>>998
おつ
1000NAME IS NULL:2012/08/02(木) 20:30:18.44 ID:???
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。