SQL質疑応答スレ 13問目

このエントリーをはてなブックマークに追加
1NAME IS NULL
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 12問目
http://toro.2ch.net/test/read.cgi/db/1316769778/
2NAME IS NULL:2012/08/02(木) 18:25:42.29 ID:???
3NAME IS NULL:2012/08/02(木) 18:26:42.31 ID:???
4NAME IS NULL:2012/08/02(木) 18:27:42.95 ID:???
よくある質問1

(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg

このようなテーブルから、下記のように

1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff

各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。

(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;
5NAME IS NULL:2012/08/02(木) 18:28:42.45 ID:???
よくある質問2

(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a

というテーブルから

key   a   b
--------------------
1    3   2
2    2   1

というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。

(答)
SELECT key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
6NAME IS NULL:2012/08/02(木) 18:29:43.68 ID:???
よくある質問3

(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B

HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか

(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
7NAME IS NULL:2012/08/02(木) 18:31:04.45 ID:???
よくある質問4

(問)
列の数が可変な問合せはどう書きますか?

(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。

SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx
http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server-2005-2008.aspx

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
8NAME IS NULL:2012/08/02(木) 18:32:06.36 ID:???
よくある質問5

(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい

 例:201006を指定したら、以下の結果を得たい

   20100601
   20100602
    ・
    ・
    ・
   20100630

(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。

どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)

with TEMP (NUM) as (
    select 1 from dual
    union all
    select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
9NAME IS NULL:2012/08/02(木) 18:32:54.66 ID:???
以上、テンプレ終わり
10NAME IS NULL:2012/08/02(木) 22:45:47.58 ID:???

前スレはすまんかった
11NAME IS NULL:2012/08/03(金) 12:56:34.37 ID:???
>>1
同じく申し訳ない。スレチ話題進行させてしまった。
12NAME IS NULL:2012/08/03(金) 13:26:20.86 ID:???
どうも

やっぱ前スレの984は無理ですかね
13NAME IS NULL:2012/08/03(金) 13:36:03.76 ID:???
>>12
前スレにちゃんとレスあるよ。
あとは自分でdatetimeをフォーマットする関数見つけてくればいいだけだよ。
か、もしくは文字列として扱って文字数で切ってもいいと思うけど。
それをDISTINCT付けて呼び出せばいいだけ。
14NAME IS NULL:2012/08/03(金) 13:41:33.57 ID:???
>>13
なるほどわかりました
DateTimeをフォーマットして時刻を切り捨ててDistinctすれば良いってことですね
やってみますどうもです
15NAME IS NULL:2012/08/03(金) 20:01:37.38 ID:???
SQLServerならConvertで111だな
16NAME IS NULL:2012/08/07(火) 20:58:23.91 ID:???
17NAME IS NULL:2012/08/08(水) 11:58:29.60 ID:???
>>16
商用リンク
踏むべからず
18NAME IS NULL:2012/08/09(木) 11:39:27.01 ID:???
ある期間において注文してくれた顧客IDを、日付ごとに一覧するには、次のようにします。

select date(created_at), customer_id
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
group by date(created_at), customer_id
order by date(created_at), customer_id

ここで、ある期間において注文してくれた顧客数(重複を排除したユニーク数)を知るにはどうしたらいいでしょうか。
19NAME IS NULL:2012/08/09(木) 12:44:25.12 ID:???
select count(distinct customer_id)
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
20NAME IS NULL:2012/08/09(木) 15:12:05.44 ID:???
>>19
すみません、正しくは「ある期間において注文してくれた顧客数(重複を排除したユニーク数)を *日付ごとに* 知るにはどうしたらいいでしょうか」でした。
21NAME IS NULL:2012/08/09(木) 15:55:47.25 ID:???
少しは応用しろよ
22NAME IS NULL:2012/08/09(木) 17:14:53.71 ID:???
select order_date, count(*) from
(
select distinct date(created_at) as order_date, customer_id
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
)
group by order_date
order by order_date;

試してないので無保証
23NAME IS NULL:2012/08/09(木) 19:19:21.61 ID:???
>>22
副問い合わせ使うんですか、なるほど!
あとgroup by使わなくてもdistinctでいけるんですね。大変勉強になりました。
ありがとうございました。
24NAME IS NULL:2012/08/09(木) 20:52:38.40 ID:???
副問い合わせ使わんでも、COUNT(DISTINCT customer_id)でいける気がするんだが
25NAME IS NULL:2012/08/09(木) 23:48:45.75 ID:???
質問しに来たら「よくある質問1」がドンピシャだった
26NAME IS NULL:2012/08/10(金) 10:55:56.52 ID:???
こうかな

select date(created_at), count(distinct customer_id)
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
group by date(created_at);
27NAME IS NULL:2012/08/11(土) 00:10:17.78 ID:???
仕事柄毎日SQLをごりごりしてるんだけど未だに苦手な小計なんですが
グルーピングIDの番号って何か規則性があるんでしょうか?
小計中計大計とか出す時いつも結果を見ながらグルーピングIDの番号を調べているんですが面倒臭くて
SQLをメンテすると番号変わったりするし大嫌いなんだけどパフォーマンスを考えたらロールアップ以外の選択肢は無いし
28NAME IS NULL:2012/08/11(土) 00:36:14.55 ID:???
>>27
自分がつかってるDBMSが何かもわからないのか?
まずそのマニュアル見ろよ

ORACLEとSQL Serverで見る限りではGROUPING_IDは指定した各項目がビットに割り当てられる数値っぽいが
2進数解らんのか?
29NAME IS NULL:2012/08/11(土) 01:05:45.89 ID:???
なんでそんな態度悪いの?
30NAME IS NULL:2012/08/11(土) 01:39:01.89 ID:???
にちゃんなんてこんなもんだろ。

優しく対応して欲しいなら、Oracle なり MS のセミナーとかに行けよ。
31NAME IS NULL:2012/08/11(土) 01:48:19.45 ID:???
2chだからわざと態度悪くしてるの?
32NAME IS NULL:2012/08/11(土) 02:01:41.10 ID:???
この程度で態度悪いと思うなら見ない方が良いと思うぞ
33NAME IS NULL:2012/08/11(土) 10:47:39.97 ID:???
出た見ないほうがいい
34NAME IS NULL:2012/08/11(土) 11:02:18.90 ID:???
自分で調べたりしないくせに人に優しく教えるよう強要するって図々しいなあ
35NAME IS NULL:2012/08/11(土) 11:12:59.51 ID:???
何でこのスレにいるんだ
3630:2012/08/11(土) 11:16:04.73 ID:???
>>28 なんて、ちゃんと答え書いてあるし、まっとうな回答だと思うが。

そもそも、会社で先輩に聞いてもこんな回答だろ。
37NAME IS NULL:2012/08/11(土) 11:57:14.45 ID:9f4DSmDL
どなたかご教示ください。お願いします。

環境:SQLServer 2008

目的は、以下のようなデータでの、カラムBのnull以外の件数の取得です。
A(int) ・B(int)
------ ・----
100 ・ ・ null

count(B)の結果は0件となり正しいですが、・「警告: NULL 値は集計またはその他の SET 演算で削除されました。」・と警告が出ます。
この警告を取り除くにはどのようにすればよいでしょうか。


実験用に以下のクエリで再現できます。
select・
COUNT(null_column)・
from・
(
・ ・ select cast(null as int) null_column
) A

よろしくおねがいします。
38NAME IS NULL:2012/08/11(土) 12:51:22.84 ID:???
やりたいこととクエリとテーブルの例がまったくかみ合わないんだが。

SET ANSI_WARNINGS OFF
3937:2012/08/11(土) 13:36:24.71 ID:???
〉38
実行したら警告出なくなりました。
ありがとうございます。
40NAME IS NULL:2012/08/11(土) 13:48:41.11 ID:???
それでいいんだ…
41NAME IS NULL:2012/08/12(日) 10:11:09.13 ID:???
>>28はきっと小計の出し方しらなかったと思う、んで知ったかぶりするためにすぐ調べた
でも難しくてムキー
42NAME IS NULL:2012/08/12(日) 12:34:34.20 ID:???
>>41
お前そんなに悔しかったのか?w
43NAME IS NULL:2012/08/16(木) 15:51:53.91 ID:???
質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい
環境:postgresql 9.0

価格変動テーブル
kakaku_datetime name price
2012-08-01 10:00:00 トマト 100円
2012-08-01 10:00:00 バナナ 200円
2012-08-10 10:00:00 バナナ 180円
2012-08-15 10:00:00 トマト 150円

売上履歴テーブル
uriage_datetime name
2012-08-01 12:00:00 トマト
2012-08-05 18:00:00 トマト
2012-08-08 15:00:00 バナナ
2012-08-16 19:00:00 トマト

を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。
uriage_datetime name price
2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる
2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる
2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる
2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる

よろしくお願いします。
44NAME IS NULL:2012/08/16(木) 16:06:10.72 ID:???
前スレよりコピペ

770* 名前:sage [] 投稿日:2012/06/21(木) 12:06:59.60 ID:oEiJL9az
すまん、763です。具体的に言うと
株価Tab(時刻、株価)
為替Tab(時刻、$\為替レート)
を株価のテーブルをメインにして
SELECT時刻、株価、$|為替レート
にしたいんだけど株価と為替の時刻は当然一致していないけど、
株価の時刻からみて最新の為替レートを表示したいんです。
よろしくおねがいします。

777 名前:NAME IS NULL [sage] 投稿日:2012/06/21(木) 19:14:27.33 ID:???
>>770
こうかな?

select *
from  A T1
    left outer join
    B T2
    on T1.a1 >= T2.b1
where  not exists (
        select *
        from  B T3
        where  T1.a1 >= T3.b1
        and   T2.b1 < T3.b1
    )
order by a1
;
45NAME IS NULL:2012/08/16(木) 17:14:05.07 ID:???
>>44
素早い回答有り難うございます!ちょっと試してみましたが何とかなりそうです!
46NAME IS NULL:2012/08/17(金) 14:37:49.68 ID:???
EXISTSとINの違いをわかり安く教えてもらえませんか?
47NAME IS NULL:2012/08/17(金) 17:18:36.53 ID:???
一緒です
48NAME IS NULL:2012/08/17(金) 17:19:11.91 ID:???
というのは嘘です
49NAME IS NULL:2012/08/17(金) 18:50:01.07 ID:???
INは項目、EXISTSは行
50テキトーですいませ〜ん:2012/08/17(金) 23:15:14.73 ID:???
NULLを含む含まないで違うんじゃなかった?
51NAME IS NULL:2012/08/18(土) 03:33:12.84 ID:???
少し前に簡単な表で説明してくれてたが何だったかなあ
52NAME IS NULL:2012/08/18(土) 06:11:02.85 ID:???
select文では、joinを使えば複数のテーブルを使った条件式が指定できます。

-- Sales部門に属する従業員の一覧
select e.id, e.name, e.saraly from employees as e
join departments as d on d.id = e.department_id
where d.name = 'Sales';


同じことをupdate文でもしたいのですが、どうすればいいでしょうか。

-- Sales部門に属する従業員のデータを更新
update employees as e set saraly = saraly + 10
join departments as d on d.id = e.department_id
where d.name = 'Sales';


副問い合わせを使えばできますけど、できればselect文と同じようにjoinを使って指定したいです。

update employees as e set saraly = saraly + 10
where e.department_id in (select id from departments where name = 'Sales');


よろしくお願いします。
53NAME IS NULL:2012/08/18(土) 14:33:32.71 ID:???
>>52
SQL Server なら FROM で書けるけど
他DBは知らない
54NAME IS NULL:2012/08/18(土) 16:26:19.95 ID:???
標準SQLではjoinはfrom句かmerge文のusing句にしか書けず、
from句はselect文(かサブクエリ)にしか書けない
55NAME IS NULL:2012/08/19(日) 10:56:24.34 ID:???
>>53,54
ありがとうございます。
PostgreSQLではupdate文でfrom句が使えるようです。
ttp://www.postgresql.jp/document/current/html/sql-update.html
これで解決できました。
56NAME IS NULL:2012/08/20(月) 12:17:32.07 ID:???
t1
id str
1 a
2 b
3 c

t2
id str
1 d
2 e
3 f

t3
id t1.id t2.id
1  1  1
2  1  2
3  1  3
4  2  1
5  3  1
6  3  3

こういうテーブルがあります
left joinで結合したところ

t1.id t1.str t2.id t2.str t3.id
1   a   1   d   1
1   a   2   e   2
1   a   3   f   3
2   b   1   d   4
3   c   1   d   5
3   c   3   f   6

こうなりました
これを

t1.idが2でt2.idが2か3はnullなので入っていません
同様にt1.idが3でt2.idが2のとこもnullなので入っていません
これを入れて

t1.id t1.str t2.id t2.str t3.id
1   a   1   d   1
1   a   2   e   2
1   a   3   f   3
2   b   1   d   4
2   b   2   e  null
2   b   3   f  null
3   c   1   d   5
3   c   2   e  null
3   c   3   f   6

こんな感じのを取得したいのですがどのようなSQLをかけばいいでしょうか?
使用DB SQLite3
57NAME IS NULL:2012/08/20(月) 12:42:20.31 ID:???
>>56
t1とt2で直積取って、それにt3を外部結合
SQLite3ってCROSS JOIN使えたっけ?
5856:2012/08/20(月) 12:47:20.36 ID:???
>>57
cross joinは使えるみたいです
外部結合はleft outer joinが使えるらしいので試したのですが
使い方が悪いのかleft joinと結果が同じでした
ちょっとcross joinでいろいろ試してみます
59NAME IS NULL:2012/08/20(月) 12:53:48.24 ID:???
>>58
left outer joinとleft joinは同じだぞ。outerが省略されただけ
t1とt2をcross joinしてからt3をleft joinするんだ
60NAME IS NULL:2012/08/24(金) 02:20:07.64 ID:vyiuPUqc
マテビューでセレクトする項目に空白を含めたいのですが、可能でしょうか?
61NAME IS NULL:2012/08/24(金) 05:06:26.49 ID:???
可能です
62NAME IS NULL:2012/08/24(金) 06:02:53.93 ID:vyiuPUqc
では、セレクトするのは空白・型は日付型にできるでしょうか
63NAME IS NULL:2012/08/24(金) 09:02:34.58 ID:???
お前の使ってるDBMSの日付型が空白を許容するなら可能
64NAME IS NULL:2012/08/24(金) 18:28:51.27 ID:vyiuPUqc
>>63
神様!
ありがとうございます!
65NAME IS NULL:2012/08/25(土) 21:43:10.85 ID:???
え、マテビューで空白のselectって無理じゃない?
66NAME IS NULL:2012/08/26(日) 21:04:43.22 ID:wqfUioWl
>>65
SELECTする取得元の項目がNOT NULLでなければいけた気がするよ
67NAME IS NULL:2012/08/27(月) 12:01:15.23 ID:???
プログラムからSQLの呼び出しについての質問ですが、
以下のSQLのテンプレートがあり、@〜Cにweb画面から渡された値を展開しています。

インジェクション対応していなかったようで、その対応を考えてます。

インジェクションでサブSQLを実行され情報漏えいできなければなんでもいいとのことで、
「(」だけをケアすればいいかなと思い、「(」を削除して

Aは「'」を「''」にエスケープしますが、それ以外は「(」をカットしようかと考えています。
@とBにて、hogeの項目情報は公開されているので、他の項目を指定される文にはいいとの条件です。

select xx1, xx2 from hoge where @ = 'A' order by B C

「(」をカットだけすれば、とりあえず他テーブル情報を取得または更新されることは防げるでしょうか?
68NAME IS NULL:2012/08/27(月) 12:30:24.60 ID:???
スレ違いだし、そのレベルでは話にならん
69NAME IS NULL:2012/08/27(月) 19:44:35.26 ID:???
いいカモだなw
70NAME IS NULL:2012/08/28(火) 11:50:51.02 ID:???
使用DB:postgresql

DBにこんなテーブルがあり
name price
りんご 100
バナナ 200
みかん 150

手元にこんなCSVデータがあって
りんご,150
みかん,100

CSVのデータを元に一括でUPDATEしたいです。
name price
りんご 150
バナナ 200
みかん 100

CSVデータの文字列加工はPHP使うので大体のことは出来ます。
最悪1行ずつUPDATEでいいのですが、行数が多いので出来ればSQL発行を1回にしたいです。お願いします。
71NAME IS NULL:2012/08/28(火) 12:40:11.93 ID:???
1回ってINSERT文みたいにつなげたいってこと?
そのまま1行ずつ書いて、BEGIN ENDで挟むだけじゃだめかね。
72NAME IS NULL:2012/08/28(火) 13:11:59.43 ID:???
そうです、UPDATEでも
INSERT INTO fruits (name,price) VALUES(りんご,150),(みかん,100)
みたいな書き方で1回ですっきり出来る方法はないかなーと。

特にないのならご私的の通りこんな感じで行こうと思います。
BEGIN;
UPDATE fruits SET price = 150 WHERE name = りんご;
UPDATE fruits SET price = 100 WHERE name = みかん;
END;
73NAME IS NULL:2012/08/28(火) 13:12:29.34 ID:???
×ご私的
○ご指摘
7470:2012/08/28(火) 13:21:10.26 ID:???
なぜそうしたいかというのは、「UPDATE大量発行より1回の発行のほうが軽いだろJK」という思い込みが理由なので、
もし何らかの方法があるとしても負荷は大して変わんねーよということであれば>>72のでもいいです。
(UPDATE対象は1万レコードくらい、カラムは数個)
75NAME IS NULL:2012/08/28(火) 16:42:57.96 ID:???
UPDATE fruits
SET price = CASE
WHEN name = りんご THEN 150
WHEN name = みかん THEN 100
ELSE price END;
7670:2012/08/28(火) 17:22:36.39 ID:???
>>75
ありがとうございました!
77NAME IS NULL:2012/08/28(火) 17:46:24.67 ID:???
まずDBにワークテーブル作って、そこにCSVの内容突っ込んでから
SQLで更新かければ、更新のSQLは1行ですむぞ
78NAME IS NULL:2012/08/28(火) 18:00:00.55 ID:???
同じ名前が複数あったとき困る気がする、、スクリプトで排除するのかな
79NAME IS NULL:2012/08/29(水) 16:53:03.81 ID:???
大体、単価をマスターに含めること自体が
部分関数従属がだな
80NAME IS NULL:2012/08/29(水) 19:18:39.62 ID:???
って、確認せずに書いてもいないことを思い込みで進めて、後で困るパターン。
81NAME IS NULL:2012/08/31(金) 17:21:33.02 ID:???
使用DB:mysql5

t1
id str
1 a
2 b
3 c

t2
id t1.id t1.id
1 1 2
2 2 3
3 3 1

このふたつのテーブルを結合して

id t1.id t1.str t1.id t1.str
1 1 a 2 b
2 2 b 3 c
3 3 c 1 a

こういう結果を得る方法はありますか・・・?

select * from t1 a
INNER JOIN t2 b on b.id = a.id
and b.id = a.id

とやってみても、idが2つあるので結合出来ないです。
82NAME IS NULL:2012/08/31(金) 18:07:06.69 ID:???
t2のカラム名おかしくね?

t2にt1を2回JOINするだけだと思うけど
83NAME IS NULL:2012/08/31(金) 18:48:29.22 ID:???
同じテーブルを複数JOINできるよ
84NAME IS NULL:2012/08/31(金) 19:14:46.70 ID:???
t2のカラム名、いくらmysqlでもこんなカラム名許すわけないよな
t2って実テーブルじゃないのか?

とりあえずt2のカラム名ちゃんとしてれば、t1に別名つけて2回Joinすればいけるはずだが
85NAME IS NULL:2012/08/31(金) 23:16:34.78 ID:???
許しちゃうんだなこれが
select 1 as `t1.id`
86NAME IS NULL:2012/09/03(月) 19:47:21.70 ID:???
複数のテーブルを結合して、その列名のみを取得するのはできるのでしょうか?
教えてください

SQLServerです。
87NAME IS NULL:2012/09/03(月) 20:35:47.33 ID:???
SQL Server知らんからググったが、syscolumnsとサブクエリ使えばいけるんじゃね
88NAME IS NULL:2012/09/03(月) 20:46:00.48 ID:???
列名のみ取得ってのがイマイチ何をどうしたいのか解らんな
where 1=0とかで良いような気もする
89NAME IS NULL:2012/09/03(月) 20:47:45.29 ID:???
>>88
値として列名を取得したいのです。
90NAME IS NULL:2012/09/03(月) 20:48:09.46 ID:???
列名も知らないDBを使って何かしようとしてるの?
SQLインジェクションのやり方の質問か
91NAME IS NULL:2012/09/03(月) 20:53:14.13 ID:???
>>87
どうやったらできますか?
調べてもよくわかりません。
教えてください
92NAME IS NULL:2012/09/03(月) 20:57:21.89 ID:???
>>91
それ結合とか関係ないな
システムテーブルってDBMS固有な場合が多いし、SQL Serverのスレ行って聞け
93NAME IS NULL:2012/09/03(月) 21:00:40.98 ID:???
>>92
わかりました。ありがとうございました。
94NAME IS NULL:2012/09/03(月) 21:32:03.84 ID:???
INFORMATION_SCHEMA が使えるだろ。
95NAME IS NULL:2012/09/04(火) 12:43:36.13 ID:???
画期的なDBメンテツールを開発中なの鴨試練
96NAME IS NULL:2012/09/04(火) 23:46:29.63 ID:???
こんなスレで聞いてるぐらいだから、あらぬ方向に画期的なツールになりそう…
97NAME IS NULL:2012/09/05(水) 21:54:02.90 ID:DaBfuwdT
SQL Server 2005です

INSERT テーブル名
SELECT
"あ",
"い",
"う",
(SELECT A列
FROM 別のテーブル名
WHERE B列 = 0)



これってサブクエリの制限にひっかかるのでしょうか?
コンパイルは通るみたいですが・・・
98NAME IS NULL:2012/09/05(水) 21:57:57.52 ID:???
INSERTの構文調べようか
99NAME IS NULL:2012/09/05(水) 22:14:37.76 ID:???
>>97
サブクエリの制限ってのが何を言ってるかよくわからんが
単一行を返すことを期待するサブクエリが複数行返したらエラーになった気はするな
それは実行時エラーで、コンパイル(つか文法チェック)ではエラーにはならない

SQL ServerならそのSQLは通る気がする
別のテーブル名 にB列=0の行が複数あれば実行時エラーがでる
そうじゃなければ多分動くだろ
100NAME IS NULL:2012/09/05(水) 22:32:49.38 ID:???
>>98
ありがとうございます
職場で調べたつもりですが、なんかINSERT文だけは除外されるみたいな書き方でした・・・

>>99
ありがとうございます
そこまで到達しないとエラーかどうかわからないんですね・・・
RDBが職場にしかなく、しかもデータのトラブルでなかなか検証できないんですが、

確か、EXISTSなどがない限り、サブクエリにおいて・・・みたいなエラーメッセージでした

明日の午後にはテストがあるので急いで情報集めたいのですが、
とりあえず、仰るとおり、複数行が帰らなければよいのですね・・・・
101100:2012/09/05(水) 22:43:08.27 ID:DaBfuwdT
すいません
こちらでした

http://www.agtech.co.jp/html/v9manuals/sp2/prog_gde/prog_gde-20-7.html


WHERE 句のサブクエリは、検索基準の一部になります。SELECT、UPDATE および DELETE ステートメントでサブクエリを使用する場合は、以下の制限が適用されます。
サブクエリを小かっこで囲まなければならない。
サブクエリに UNION 句を含めることはできない。
外側のクエリの WHERE 句で ANY、ALL、EXISTS または NOT EXISTS キーワードを使用しないかぎり、サブクエリの選択リストには列名の式を 1 つしか組み込めない。



でもこれは、SQL Serverではない別のDBの話でした
すいません
102NAME IS NULL:2012/09/06(木) 00:57:57.10 ID:???
そもそもそれWHERE句のサブクエリじゃないし
103NAME IS NULL:2012/09/06(木) 12:26:18.97 ID:wb5oKqRc
mysql5.1.38のバージョンを利用してます

会員テーブル(usr_tbl)
|id|usr_name|usr_status|

受注テーブル(order_tbl)
|id|usr_id|order_name|order_price|order_status|

状態テーブル(status_tbl)
|id|status_name|

上記のような3つのテーブルを、JOINしてデータを取り出す時

select
  u.usr_name,
  s1.status_name,
  o.order_name,
  o.order_price,
  s2.status_name
from
  order_tbl as o
  left join usr_tbl as u on o.usr_id = u.id
  left join status_tbl as s1 on o.order_status = s1.id
  left join status_tbl as s2 on o.order_status = s2.id


と言う書き方としていますが、status_tblを1回joinですます方法は
なにかあるんでしょうか?
104NAME IS NULL:2012/09/06(木) 12:32:54.55 ID:wb5oKqRc
left join status_tbl as s1 on o.order_status = s1.id
の部分は
left join status_tbl as s1 on u.usr_status = s1.id
のミスです
105NAME IS NULL:2012/09/06(木) 16:15:35.55 ID:???
usr_statusとorder_statusが別物なのだから無理
106NAME IS NULL:2012/09/06(木) 22:08:11.85 ID:???
ordersテーブルから、顧客のユニーク数を数えたい。
いちおうこれでできたっぽい。

select count(*) from (select customer_id from orders group by customer_id) as t;

もっとうまい書き方があれば教えてほしい。
select count(dictinct customer_id) from orders
はうまくいかなかった。
当方 PostgreSQL 9.1
107NAME IS NULL:2012/09/06(木) 22:44:20.57 ID:???
count(dictinct が使えないならそうするしかないんじゃない?
サブクエリはgroup byじゃなくてselect distinctのほうが自然な感じがするけど
108NAME IS NULL:2012/09/06(木) 22:46:20.83 ID:???
>>106
うまくいかなかったってのはどう上手くいかなかったんだ?
ちなみにdistinctのスペル間違ってるけど、それ直してもだめか?
109NAME IS NULL:2012/09/06(木) 22:55:45.59 ID:yurKVJdz
SELECT
CASE
WHEN @var = 1
THEN
ELSE
END




SELECT
IF @var = 1
ELSE
END


は普通のプログラミング言語と同じく好みの問題ですか?
110NAME IS NULL:2012/09/07(金) 03:30:21.61 ID:???
標準的なSQLにIFなんてなかったはず
それが同一かどうかはそのDBMSのスレで聞くかマニュアルでも読んで自分で調べろ
111NAME IS NULL:2012/09/07(金) 06:45:33.35 ID:???
>>107
select distinctなんてものがあるのか。知らなかった。ありがとう。

>>108
スペル直したらいけたorz お恥ずかしい サンクス
112NAME IS NULL:2012/09/07(金) 11:10:36.19 ID:???
distinct はSQLの初歩の方で出てくるはずだが…
113NAME IS NULL:2012/09/07(金) 12:17:53.67 ID:???
重複する結果を1行だけ欲しいというニーズがなかったのか?・・・w
114NAME IS NULL:2012/09/07(金) 14:34:17.15 ID:???
order表
id, date, user
1, 2012-09-01, u1
2, 2012-09-02, u1
3, 2012-09-02, u2
4, 2012-10-01, u3

detail表
id, order_id, data
1, 1, aaa
2, 1, bbb
3, 2, aaa
4, 3, bbb
5, 3, ccc
6, 4, ccc

DB: postgreSQL 9.1
結合条件はorder.id = detail.order_id
欲しい結果
month, user, order_count, detail_count
2012-09, u1, 2, 3
2012-09, u2, 1, 2
2012-10, u3, 1, 1

よくある1:1..n関連の注文-注文明細タイプの2表から
月ごとにuserごとの注文件数と明細件数を1回で取得する方法はありますか。
115NAME IS NULL:2012/09/07(金) 14:40:23.77 ID:v5vYUaTi
質問です。
UPDATE TABLE SET XYZ = REPLACE(REPLACE(XYZ,'A','1'),'B','2');
このような構文の場合、
1.テーブル内のすべての行のAを1にかえてから、Bを2にかえる
2.1行ずつAを1に、Bを2に置き換えていく
どちらの動きをするんでしょうか。
116NAME IS NULL:2012/09/07(金) 17:24:20.15 ID:???
>>115
関数が入ったからと言って、XYZ = 何か を複数回UPDATEするってことはないはずだお。

厳密にいうならば、1と2、両方とも違う
あらかじめXYZの値に対して、リプレイスを2回かけて得られた値をUPDATEしているはず。
117NAME IS NULL:2012/09/07(金) 18:10:28.57 ID:???
>>114
select date_trunc('month', date) as month,
    user,
    count(distinct order_id) as order_count,
    count(*) as detail_count
from  order T1
    inner join
    detail T2
    on T1.id = T2.order_id
group by date_trunc('month', date) as month,
    user
;
118NAME IS NULL:2012/09/09(日) 23:52:06.85 ID:2/TvaXCv
SELECT *
FROM テーブルあ LEFT JOIN テーブルい ON テーブルあ.主キー = テーブルい.主キー


としたときに結合したあとの選択結果の列の順番はどのように決まるのですか
119NAME IS NULL:2012/09/10(月) 00:02:04.34 ID:???
>>118
DBMSに依るだろうが多分テーブルあがインサートされている順になる気がする
120NAME IS NULL:2012/09/10(月) 00:23:27.78 ID:???
>>119
ありがとうございます
このサイトの例題2をみてふと疑問に思ったのですが、


http://www.pursue.ne.jp/jouhousyo/SQLDoc/select22.html


普通のRDBでは、列に定義されている順番なんでしょうか
121NAME IS NULL:2012/09/10(月) 00:43:31.16 ID:???
列の順序にしても行の順序にしても、クエリで明示的に指定していない場合は
DBMSがテキトーに決めると思っておけ。
指定しない場合にどういう順序になるかなんて、考えるのは無駄。
122NAME IS NULL:2012/09/10(月) 08:11:15.12 ID:j8POAroQ
ありがとうございました
123NAME IS NULL:2012/09/10(月) 09:25:10.94 ID:???
>>117
遅くなりましたが欲しいデータが取れました
本当にありがとうございました
124NAME IS NULL:2012/09/11(火) 15:44:47.43 ID:QVEYY1qN
今主キーと外部キーの勉強をしています。
「 id 名前 身長 体重 部活 」
と表示したい時、
以下のようなtableAとtableBがあった時の主キーと外部キーの設定は
・tableA … A_id(主)、名前、身長、体重
・tableB … B_id(主)、部活、A_id(外) として、
SELECT * FROM B_table right join A_table で結合すればいいのでしょうか?
部活は一人複数入ることも考えて上記のようにしました。
125NAME IS NULL:2012/09/11(火) 18:14:47.99 ID:???
その例だと
 人(人ID、名前、身長、体重、その他人としての特性)
 部活(部活ID、部活名、その他部活としての特性)
 人−部活(人ID、部活ID)
の3テーブルにするのが基本かと
126NAME IS NULL:2012/09/11(火) 19:59:43.14 ID:???
>>124のtableBのB_idが何をしたいのかが謎すぎる
127NAME IS NULL:2012/09/11(火) 22:35:48.13 ID:???
>>126
主キーの役割がわからないとは珍しい御仁だな
128NAME IS NULL:2012/09/11(火) 22:57:36.57 ID:???
(部活,A_id)が候補キーであると考えないとtableB自体意味不明だが、
もしそうであればその複合キーの代理キーだな。
129NAME IS NULL:2012/09/12(水) 03:46:33.34 ID:???
どうでもいいんだが
B right join A より A left join B の方がしっくりくるのは俺だけ?

まあとりあえず設計はスレ違いだな
130NAME IS NULL:2012/09/12(水) 05:47:20.43 ID:???
>>127
この課題に限れば冗長になっているよ
131NAME IS NULL:2012/09/12(水) 12:23:15.65 ID:???
>>130
そんなこと言うと代理キーは全部冗長だろうが
あ、代理キー論争は余所でやってね
132NAME IS NULL:2012/09/13(木) 00:28:59.91 ID:???
親テーブル
Id, 資産
1, 100
2, 200
3, 400

子テーブル
Id, 親Id, 資産
1, 1, 10
2, 1, 20
3, 2, 10
4, 2, 20
5, 2, 30
6, 3, 10

から
Id, 資産
1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。
2, 70
3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。
4, 86
5, 96
6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。

という結果を得たい。
要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。
SQL で出来ます?
133NAME IS NULL:2012/09/13(木) 01:13:59.64 ID:???
>>132
とりあえず
select
Id,
資産 + (select 資産 from 親テーブル where Id=t.親Id) / (select count(*) from 子テーブル where 親Id=t.親Id)
as 資産
from 子テーブル t

パフォーマンスとか、親が2件だったり0件だったりとか、切り捨てとかは考慮してない
134132:2012/09/15(土) 08:24:23.00 ID:???
>>133
なるほどこんなことが出来るんだ。
子テーブルも数千件レベルだし夜間バッチ処理だから、パフォーマンスはそんなに
気にしなくてもいいと思ってる。
また親Id は一つなので親が2件はありえないし、親なしにならないように制約掛け
てるので多分大丈夫だと思う。

ありがとう。
135NAME IS NULL:2012/09/15(土) 08:57:46.51 ID:???
>>134
しかし、SQLも危ない構造をしてるね。こうまでしてしまったのは誰だ。
136NAME IS NULL:2012/09/15(土) 09:48:43.69 ID:???
fromかexists以外の部分にサブクエリを書くのはなんか格好悪いんだよな

select T1.Id,
    max(T1.資産) + max(T3.資産) / count(*) as 資産
from  子テーブル T1
    inner join
    子テーブル T2
    on T1.親Id = T2.親Id
    inner join
    親テーブル T3
    on T1.親Id = T3.Id
group by T1.Id
order by T1.Id
;
137NAME IS NULL:2012/09/15(土) 11:02:40.46 ID:???
>>136
おお、なんかよさげ。
こっちもありがとう。
138NAME IS NULL:2012/09/15(土) 16:49:24.38 ID:???
>>135
危ない構造ってどういう事だ?

>>136
1:nで結合すると1側のテーブル項目が無駄に重複してるような気もする
まあ、その辺は好みの問題(単一行サブクエリのエラーの問題はあるけど)
最近のオプティマイザは賢いからなぁ
139NAME IS NULL:2012/09/15(土) 18:11:04.07 ID:???
>>138
射影部分で結合を指定しているではないか。
あそこは本来 W への形式指定をするところだ。
この場合で言えば、意味的に W に書き込まれた
無名のテーブルに対して暗黙の結合が起こっている
ことになってしまう。
そんな逸脱を許してよい筈がない。
140NAME IS NULL:2012/09/15(土) 19:00:19.20 ID:???
なんか難しくて良くわからんな
(単一値を要求する)サブクエリが結合だってこと?
それが何かを逸脱してて許されないの?
で、それがどう「危ない」の?

たんに学術的におかしいってだけなら、それ用のスレ立ててそこで論議してくれ
141NAME IS NULL:2012/09/15(土) 19:30:46.77 ID:???
>>140
where Id=t.親Id とあるからには結合と見做される
親テーブルの資産は集約値でないから本来単一値には
なり得ない。
142136:2012/09/15(土) 19:59:43.02 ID:???
>>140
なんか変な人きちゃったね
代わりに謝る
143NAME IS NULL:2012/09/15(土) 21:48:06.59 ID:???
>>141
>集約値でないから本来単一値にはなり得ない。
なり得ないんじゃなくて、そうなる保証がないだけだろ
単一値になるかもしれないが、そうならないかもしれない
>>133は親が1件の場合以外は考慮してないと書いてある
つまりこのサブクエリが単一値になる事を前提としていることははっきり示してあると思うが

あるいは親テーブルの資産を集約すれば問題ないと?
つまりあのサブクエリが (select sum(資産) from 親テーブル where Id=t.親Id)なら問題ないの?

で、何が何を逸脱してて、何が危ないの?
144NAME IS NULL:2012/09/15(土) 22:15:09.14 ID:???
親が2件以上あると単純にいかなくなるから危ないのではないかな
145144:2012/09/15(土) 22:18:43.53 ID:???
追加 これ集約しても同じでしょ やはり基本は解の集合になる
146135,139,141:2012/09/15(土) 22:48:15.87 ID:???
私の書き込みの表現が適切でなかったのかもしれない。言い換えれば、
JOINはfrom句かwhere句の中でしか指定できないのがSQLだと思う。
ところが、>>134 の例では、親テーブルの資産が複数取れてきてしまうと
<列指定>が原因で事実上のJOINを起こさなくてはならなくなる。
これは具合が悪いのではないか。
147133:2012/09/16(日) 02:24:08.43 ID:???
>>144,145
実行時エラーの可能性を危ないと言うのであれば確かに危ない
集約すればスカラ値になることが保証されるわけだが、スカラ値が集合だと?

>>146
>JOINはfrom句かwhere句の中でしか
Joinはそうだな。で、>>134(つか>>133だろ)のどこにJoinって書いてる?

>親テーブルの資産が複数取れてきてしまうと
><列指定>が原因で事実上のJOINを起こさなくてはならなくなる
原因っていってる列指定ってのが、なにがどう問題なのかわからんが?
なぜ事実上のJoinを起こすんだ?あくまでもSelect対象のテーブルは一つしかないし、列リストにも1項目しかないんだが?
事実上の集約を起こすってならまだ話は解る。実際はそんな集約は起きないが

統計学とかの学術的にはどうかしらんが、SQLではカッコでくくったSelect文は式とみなされる
>133で要求されてる式はスカラー式で、結果として1項目で1行(または0行)であれば問題ないんだが?
たとえそのサブクエリのFromにJoinがあってもだぞ

>これは具合が悪いのではないか
親テーブルの資産が複数取れてきてしまうとたしかに具合は悪い
標準的なDBMSなら、その場合は実行時エラーになる(一部ならないDBMSもあるらしいが)
だから、親が2件だとダメだと断ってあるわけだが

ちなみに0件だとサブクエリのスカラー式がNULLを返すので、計算式全部がNULLになる
こっちの方が問題だろう

そして現実的にはWhereで主キーを指定する場合、1件か0件な事は保障できる
今回の例であれば親テーブルのIdなんだから、まあたぶん主キーだろう
そしてテーブルに親子関係があるのはテーブル名からまあ想像できる
そのばあい参照整合性制約をちゃんとかけてれば、親が0件でないことは保証できる
だからおそらく親が2件以上や0件ってことは起こらないだろうと思って
断りを入れた上でSQLにその考慮を入れてないんだが
148NAME IS NULL:2012/09/20(木) 09:19:05.00 ID:???
mysql 5.5.19
select id, filename, a.author_id, b.author_name,
book_name, a.motoneta_id, motoneta
from manga_data_tbl a
left join author_tbl b
on a.author_id = b.author_id,
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
order by id;
で、
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
order by id' at line 6
になります。
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
のどこが悪いんでしょうか??教えてくださいm(__)m
149NAME IS NULL:2012/09/20(木) 10:12:25.82 ID:???
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
の前にコンマがあるからでは?
150NAME IS NULL:2012/09/20(木) 10:21:10.22 ID:???
>>149
あぁぁぁ〜それだったのか〜orz
どうさしました。ありがとうございますm(__)m
151NAME IS NULL:2012/09/24(月) 14:00:17.01 ID:HaYq/Rnn
あるカラムの値を0にそろえたいのですが、
UPDATE *** SET xxx = 0

UPDATE *** SET xxx = 0 WHERE xxx <> 0
ってどっちが一般的でしょうか?
152NAME IS NULL:2012/09/24(月) 15:24:37.72 ID:???
0を0に置き換えて何が問題なの?
153NAME IS NULL:2012/09/24(月) 15:50:45.29 ID:???
ロック
ログの量
トリガ
ぐらいを考慮して好きなように
154NAME IS NULL:2012/09/24(月) 16:48:38.71 ID:QiS80YJo
Oracle10g

企業TBL
1:企業ID
2:企業名
3:電話番号
4:最終発送日

上記のようなテーブルがあり、同一企業でも
複数のレコードに登録されています。
電話番号が同一であれば、同一企業とみなし、
最終発送日を同一企業内で最新の日付で
一斉更新したいのですが、プログラムを使わず
SQL文だけで完結することは可能でしょうか?

下記のSQLで表示される電話番号のデータを
MAX(最終発送日)で更新するイメージです。

SELECT 電話番号,MAX(最終発送日),COUNT(*)
FROM 企業TBL
GROUP BY 電話番号
HAVING COUNT(*) > 1;
155NAME IS NULL:2012/09/24(月) 18:38:16.06 ID:???
なんで企業TBLなのに企業IDで企業が一意に決まらないのかとか
電話番号が同一だったら同一企業なんて条件で本当にいいのかとか
突っ込みどころ満載だけどその要件通りのことは一応できる

update 企業TBL set 最終発送日 = (select max(最終発送日) from 企業TBL T2 where 企業TBL.電話番号 = T2.電話番号)
156154:2012/09/24(月) 19:00:31.21 ID:QiS80YJo
>>155さま

ありがとうござます。
おしゃる通り、電話番号が等しければ同一企業と見なしてよいかは検討の余地があるところです。
すみません、テーブル構成を少し端折りましたが、親企業テーブルが別途あり、
同一企業が別の親にぶら下がる場合は、それぞれ別企業として登録する必要があるため、
このようなことが発生しています。
157NAME IS NULL:2012/09/24(月) 21:57:02.58 ID:???
総務部と人事部が電話番号違ってたらどうすんの?とか本店と支店は電話番号違うから別企業になるのか?とか果てしなく疑問が出てくる
設計スレではないからいいけど
158NAME IS NULL:2012/09/29(土) 14:37:11.50 ID:???
質問させてください。
SQLServerってSQL文の処理をサーバー側がやってくれたりします?
クライアントは命令出すだけで、実行はサーバーだったら良いなと。
現在までアクセスのmdbをNASで共有してきたのですが
Pen4(セレロン)クラスのPCでは遅いので。
159NAME IS NULL:2012/09/29(土) 15:01:18.83 ID:???
考えてる通りの動作

てか、access から mysql 使えば安く済むよ
160NAME IS NULL:2012/09/29(土) 15:17:15.04 ID:???
>>159
ありがとうございます。
その辺りも検討してみます。
161NAME IS NULL:2012/09/30(日) 00:16:54.88 ID:???
実行がクライアント側だというなら、selectはテーブルの全rowをまずクライアント側にコピーするというのか?
質問する前に少しは考えろww
162NAME IS NULL:2012/09/30(日) 01:05:38.91 ID:???
> selectはテーブルの全rowをまずクライアント側にコピーするというのか?
・うわっ、バカがいるww
163NAME IS NULL:2012/09/30(日) 01:20:37.11 ID:???
AccessのdbファイルをNASで共有という今までのやり方そのものが
実データはネットワークを介した向こうでSQL実行はクライアント
という形だね。

select文だからといって常にフルテーブルスキャンとはならないのと
同じ理由でクライアントで実行するからといって常に全rowを手元
にコピーする必要はない。
164NAME IS NULL:2012/09/30(日) 20:55:51.12 ID:???
バカだからよくわかんないや。
165NAME IS NULL:2012/10/04(木) 00:53:40.21 ID:q2phKc+6
SQL server 2005 
女子テーブル
ID  name tops pants skirt  
1 jyoshimei m l m
男子テーブル
ID  name tops pants
1 danshimei xl xxxl

というテーブルがあってそれぞれに500人ほどのデータが入っています。

女子テーブルと男子テーブルの両方から pants のサイズ、トップスのサイズ、などで絞り込みしてリストを作りたいのです。女子のみスカートのサイズがあります。

どのように書けば良いのか教えてください。
166NAME IS NULL:2012/10/04(木) 06:56:56.23 ID:???
union使え
167NAME IS NULL:2012/10/04(木) 11:52:57.19 ID:???
TransactionSQLはわからないんですが
MySQLユーザな私だと
(SELECT name,tops,pants,'' AS skirt FROM 男子テーブル)
なんぞを女子テーブルとUNIONしちゃいますが。
168NAME IS NULL:2012/10/04(木) 20:56:50.85 ID:q2phKc+6
できましたありがとう
>>166
>>177
さん
169NAME IS NULL:2012/10/05(金) 09:44:55.71 ID:xfWj/RNs

Oracleについてです。

テーブル1
列A(PK)
列B
列C
列D

があり、列B、列C、列Dの複合INDEXが1つ設定されています。

列B+列C+ 列Dで結合した列を
複数の値を条件に検索する必要があり、

WHERE 列B||列C||列D IN ('XX','XX','XX')

でとして検索しているのですが、
これではINDEXを使用してくれず、
検索が非常に遅くなってしまっています。
(テーブル1は200万件程度あります。)

テーブル構成は変更できず、INDEXまたは
SQLで解決する必要があるのですが、
何か検索を向上させる方法がありますでしょうか。
170NAME IS NULL:2012/10/05(金) 09:59:31.14 ID:???
>>169
複合INDEX とは別に 列B,列C,列D にそれぞれINDEXを付ける。
171NAME IS NULL:2012/10/05(金) 13:21:18.99 ID:hMuvgCWe
>>169
検索用のB,C,D列だけのテーブル(全部主キー)を作って
そこに該当レコードのキーを入れてJOIN
両方がINDEX SCANいなれば爆速
172NAME IS NULL:2012/10/05(金) 13:47:42.91 ID:???
正規化してテーブルを分割した後にinsertやupdateする場合は
SQL文を二つに分けてinsertするのでしょうか?
173NAME IS NULL:2012/10/05(金) 14:09:12.44 ID:???
一度にできる方法を教えてくれ
174NAME IS NULL:2012/10/05(金) 15:06:58.73 ID:???
>>172-173

とりあえず必要な情報が欠落しているから>>1見てね。
175NAME IS NULL:2012/10/05(金) 16:25:09.83 ID:???
>>174
>>173>>172へのレスだろ、空気脳さん。
176NAME IS NULL:2012/10/05(金) 16:48:45.86 ID:???
>>169
IN の中身が少なければ、B,C,Dそれぞれ単独indexを作って

where
(B=hoge1 and C=hage1 and D=moke1)
or
(B=hoge2 and C=hage2 and D=moke2)
or
・・・
177NAME IS NULL:2012/10/05(金) 18:30:41.47 ID:???
>>176
単独いらない。というか単独インデックスだとふつうはそのうち一つ
しかつかわれない。

自分もINの中身が少なければこれで良いと思う。注意点は条件式を
複合インデックスを定義したときの列の順番で書くこと。
まあ最近のオプティマイザは頭良いけど。
178NAME IS NULL:2012/10/05(金) 18:35:51.89 ID:???
列B||列C||列D のファンクションインデックスでいいだろ
179NAME IS NULL:2012/10/05(金) 19:18:07.58 ID:???
>>172-173
VIEWを作ればVIEW越しに更新できるDBMSもあるけどね

まあ正規化のために分けたんなら別々のエンティティだから分けたんであって、
そうであれば別々に更新するのが意味的には正しいと思うけど
180NAME IS NULL:2012/10/06(土) 00:21:06.93 ID:???
正規化とエンティティは全然関係ないんだが、いまだにこういう勘違いしている人がいるのな。
181NAME IS NULL:2012/10/06(土) 01:36:13.08 ID:???
>>176-177
B,C,Dで連結してから検索してるってことは、たとえば
'X','',''
'','X',''
'','','X'
の3行がin('X','Y','Z')で引っ掛からないとダメってことだろ
素直に結合した状態のインデックスつくるか、条件指定の仕方を見直すかだな
182NAME IS NULL:2012/10/17(水) 03:56:59.08 ID:pPy04zFq
SQLに関して質問です。MySQL5.1.41です。

【チームテーブル(team)】
--------------------
チームID  チーム名
--------------------
1      巨人
2      阪神
3      中日

【選手テーブル(player)】
--------------------------------------
選手ID  チームID  選手名  背番号
--------------------------------------
1     1      阿部   10
2     1      杉内   18
3     2      金本   6
4     2      鳥谷   1
5     3      岩瀬   13
6     3      谷繁   27

この条件で、各チームから背番号最少の選手を抽出するのが目的です。
結果イメージは、

----------------------------
チーム名  選手名  背番号
----------------------------
巨人    阿部    10
阪神    鳥谷    1
中日    岩瀬    13

です。SQLで
SELECT チーム名, 選手名, 背番号 FROM team LEFT JOIN player USING (チームID) WHERE MIN(背番号);
ではエラーになってしまいました。

ご教示宜しくお願いいたします。
183NAME IS NULL:2012/10/17(水) 06:05:18.97 ID:???
集計関数の使い方をちゃんと勉強してくださいね

まずはこのあたりから
select チームID,min(背番号) from player group by チームID;

>>4が参考になるかもしれません
184NAME IS NULL:2012/10/17(水) 14:57:03.90 ID:ptYm3Ltw
Oracleの検索で、100万件のテーブル検索を行うのですが、
検索結果で500件位表示される場合と、該当データがない場合では
該当データが無い方が表示に時間がかかります。
索引を使っていない検索なのですが、どういう理屈で
該当データが無い方が検索に時間がかかるのでしょうか?
185NAME IS NULL:2012/10/17(水) 21:29:23.34 ID:???
なにそれこわい

というかそれはSQLじゃなくてRDBMSの問題なのでは
186NAME IS NULL:2012/10/18(木) 01:10:04.11 ID:jxIImRzW
>>184
検索列は同じなの?
違う列でフルスキャンした結果ありませんとかじゃないだろうな
187182:2012/10/18(木) 01:38:35.05 ID:otEnXaZA
>>183
回答頂きありがとうございます。
テンプレなので最初に見たのですが、
こちらの希望は最初のSELECT文で両テーブルからフィールドを取得するので、
うまくいきませんでした。

SELECT チームID, MIN(背番号) FROM player GROUP BY チームID

の結果は
----------------------------
チームID  背番号
----------------------------
1       10
2       1
3       13

なので、あとはこれに選手名とチーム名が抽出されれば解決なのですが、
この結合とサブクエリ(?)に関するSQLがうまくいきません…。
188NAME IS NULL:2012/10/18(木) 02:50:29.43 ID:???
検索中に 500 件に達したら終わり
該当が無いから最後まで探そうとするから時間がかかる

ただそれだげ
189NAME IS NULL:2012/10/18(木) 07:18:34.78 ID:???
SELECT チーム名, 選手名, 背番号
FROM team t, player p,
(SELECT チームID, MIN(背番号) as 最少背番号 FROM player GROUP BY チームID) m
WHERE t.チームID = p.チームID
AND p.チームID = m.チームID
AND p.背番号 = m.最少背番号;
190184:2012/10/18(木) 09:48:12.50 ID:fR4udFJG
>>185 >>186

ありがとうございます。

アプリからの検索なので、渡している検索列は同一です。
すみません、複数のテーブルを使っているので、
INDEXを使ってるものと使っていないものがありました。
実行計画を見ると、どちらの検索条件も同じ計画に
なります。

例えば統計情報を更新していないとかで、こういった
事象も考えられますでしょうか。
191NAME IS NULL:2012/10/18(木) 18:48:54.43 ID:???
>>188
500件って制限してないけど。

>>190
どっかにexistsつかってない?
192NAME IS NULL:2012/10/18(木) 18:59:30.74 ID:???
>>190
>INDEXを使ってるものと使っていないものがありました。
>実行計画を見ると、どちらの検索条件も同じ計画
どっちだよ

検索の時間と表示の時間もちゃんと分けて考えてるか
193182:2012/10/19(金) 02:56:07.44 ID:???
>>189
希望通りの結果となりました!どうもありがとうございます。
今まではJOINを使った結合しかやってなかったのですが、
こういうやり方もあるんですね。参考になりました。
備忘録として保存したいと思います。
194190:2012/10/19(金) 12:14:42.93 ID:MO6yhadg
>>191 >>192
すみません、書き方が悪かったです。
使ってるものと使ってないというのは、
1個のSQL内で使用してる複数のテーブルで
INDEXを使ってるものと使っていないものが
あるという意味です。

existsは使っていません。
表示の時間はほとんどかっていません。

planはこんな感じですが。
|id | Operation |Rows | Cost |
-----------------------------------------------------------
| 0 | SELECT STATEMENT |21992 | 2668 |
| 1 | SORT ORDER BY |21992 | 2668 |
| 2 | HASH JOIN |21992 | 926 |
| 3 | TABLE ACCESS FULL | 3 | 2 |
| 4 | NESTED LOOPS |23991 | 922 |
| 5 | HASH JOIN |26172 | 922 |
| 6 | TABLE ACCESS FULL | 253 | 5 |
| 7 | HASH JOIN OUTER |26172 | 913 |
| 8 | HASH JOIN |26172 | 830 |
| 9 | TABLE ACCESS FULL | 112 | 2 |
|10 | VIEW |26172 | 826 |
|11 | FILTER | | |
|12 | SORT GROUP BY |26172 | 826 |
|13 | TABLE ACCESS BY INDEX ROWID| 523K| 826 |
|14 | INDEX FULL SCAN | 1570K| 26 |
|15 | TABLE ACCESS FULL | 5502 | 4 |
|16 | INDEX UNIQUE SCAN | 1 | |
195NAME IS NULL:2012/10/19(金) 15:42:45.49 ID:???
というかさ>>184は後出しが酷いよ。
簡単なスキーマ定義と問題になっているクエリぐらい書かないと。
184の書き方だと自分でも単一テーブルの全行スキャンの途中打ち切りを
まず疑うし、それがあとから複数テーブルのJoinとか、なんじゃらほい。

いきなり実行計画貼り付けられたところで要エスパーとまではいかなくても
答える方は無駄に面倒だ。
スキーマとクエリを提示、まずそこから。
196NAME IS NULL:2012/10/19(金) 16:59:16.79 ID:???
not inとか使ってて、最終的に0件の方がアクセスするレコード件数が多いとかじゃないのか
197NAME IS NULL:2012/10/19(金) 20:27:31.64 ID:???
>>196
そう思ってexistsを使ってるか確認してみた
198NAME IS NULL:2012/10/19(金) 21:27:55.35 ID:???
SQL インジェクションやられた、あばばばば
199NAME IS NULL:2012/10/20(土) 01:43:41.08 ID:/WZRtOi0
200NAME IS NULL:2012/10/22(月) 15:58:01.32 ID:???
oracle10gのpro*cobolで、カーソルの逆方向読み(fetch prior)は可能でしょうか?
201NAME IS NULL:2012/10/22(月) 18:14:17.47 ID:???
oracleのスレで聞けよ w
202NAME IS NULL:2012/10/24(水) 00:23:18.40 ID:???
name like 'unkounkounko'

これにワイルドカード使いたい場合どうすればいい?
203NAME IS NULL:2012/10/24(水) 13:05:23.96 ID:???
'unkounkounko' like name
204NAME IS NULL:2012/10/24(水) 18:54:38.64 ID:???
うんこをなめるのが好きだって?
205NAME IS NULL:2012/10/26(金) 12:02:08.78 ID:???
MS SQL server 2012です。
TableA
商品名 製造数
A 1000
B 2000
C 1000

TableB
商品名 単価
A 100
A 120
B 90
C 120
C 125

TableBには同一商品名で複数の単価が登録されています。
TableBの商品名毎の一番高い単価を基にして
TableAの製造数 x 単価を求めたいのですが
一発で出す方法有りましたら教えてください。

得たい結果
A 12000
B 18000
C 12500
206NAME IS NULL:2012/10/26(金) 12:21:37.47 ID:???
TableBから商品名ごとに最大値を求めるサブクエリ(max(),groupby 使用)と
TableAをジョインさせる
207NAME IS NULL:2012/10/30(火) 16:17:23.76 ID:???
DBMS名「MySQL 5.0.95」

TABLE `items`
`itemID`,itemNAME`
'1','AAA'
'2','BBB'
'3','CCC'
'4','DDD'
'5','EEE'
'6','FFF'

TABLE `purchase`
`userID`,`itemID`
'1001','1'
'1001','2'
'1002','1'
'1002','2'
'1002','5'
'1003','1'
'1004','5'
'1004','6'

TABLE `recommend`
`itemID`,`rank`
'2','10'
'4','9'
'5','8'
'1','7'

上記のように、商品マスター `items` 購入履歴 `purchase` オススメリスト `recommend`
の3つのテーブルがあります。

ここで、特定の`userID`にオススメリストを表示したいのですが、
その際には、購入済みの商品は省いて表示したいと思います。

上記の例で`userID`='1001'には
itemID = '4' と itemID = '5'
だけを表示させていたと思います。

`item`テーブルの情報も含め
items.`itemID`,items.itemNAME`,recommend.`rank`
'4','DDD','9'
'5','EEE','8'
という結果を求めるためのSQLはどう書けばよいでしょうか?
208NAME IS NULL:2012/10/30(火) 16:51:21.89 ID:???
>>207
特定のuserIDでいいんだったら、例えばuserID=1001の場合は

select I.itemID, I.itemName, R.rank
from item I, recommend R
where I.itemID = R.itemID
and I.itemID not in (select distinct itemID from purchase where userID=1001)
order by R.rank desc;
209NAME IS NULL:2012/11/01(木) 05:32:31.48 ID:wt1+qLkC
MySQLの初歩的な質問です

テーブル名y2010 主キー 場所

場所 人口
----------------
東京 1500
大阪 800
福岡  500
 ・・・

テーブル名 y2011 主キー 場所

場所 人口
----------------
東京 1600
大阪 900
福岡  600

のようなテーブルがあるときに、

テーブル名 y_sum 主キー 場所

場所 人口
----------------
東京 3100
大阪 1700
福岡 1100

のように、複数のテーブルから主キーを含むフィールドを参照して
参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成するには
どのようなクエリにすればよいのでしょうか?

おねがいしますm(._.)m おねがい

210NAME IS NULL:2012/11/01(木) 08:46:28.87 ID:???
insert into y_sum
select a.場所,a.人口+b.人口 from y2010 a, y2011 b where a.場所=b.場所;
211NAME IS NULL:2012/11/03(土) 20:29:37.60 ID:???
>>209
確認してないけど↓?

create table 新しいテーブル名
select y_view.場所, sum(y_view.人口)
from
(select 場所, 人口 from y2000
union all
select 場所, 人口 from y2011) y_view
group by y_view.場所
212NAME IS NULL:2012/11/06(火) 20:11:26.37 ID:???
質問です。
開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は
ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))
で計算できます。
それで、
・select で距離を計算するときは round() するけど
・order by でソートする時は round() なしで(つまりfloatのまま)ソートする
ということをしたいです。
SQLはこんな感じになるんですけど、
select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance
from geo_data
order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))
これだと距離の計算が二重に行われてしまい、無駄です。
これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。
よろしくお願いします。
環境:PostgreSQL 9.1
213NAME IS NULL:2012/11/06(火) 20:26:08.31 ID:???
副問い合わせ
214NAME IS NULL:2012/11/07(水) 09:29:53.25 ID:???
>>213
どうやって?URLでいいから教えて。
215NAME IS NULL:2012/11/07(水) 10:06:00.83 ID:???
こんなんじゃね?

select round(distance) from
(select ST_Distance(略) as distance from geo_data)
order by distance;
216NAME IS NULL:2012/11/09(金) 16:08:52.05 ID:???
Apache Derbyでselect文を使ったストアドプロシージャーのサンプルが用意されているwebページを教えていただけないでしょうか
jdbcから下記のqueryを叩きたいのですが、冗長なためストアドプロシージャーにしてderbyから呼び出したいのです。

select Rating2.productID,Rating2.productName,MAX(UserDistance.Distance * Rating2.ratingValue) as SuggestionScore
from (select Rating3.CONSUMERNAME,Rating3.CONSUMERID,
Sum(abs(Rating2.RATINGVALUE * Rating3.RATINGVALUE))as Distance
from rating2,rating2 as rating3
where rating2.consumerID <> rating3.consumerID
and rating2.PRODUCTID = rating3.productID
and Rating2.consumerName = 'John'
group by Rating3.ConsumerName,Rating3.ConsumerID) as userDistance,
(Select ConsumerID,ProductID,ProductName,RatingValue from Rating2 where Rating2.productID not in(select productID from rating2 where ConsumerName ='John')) as Rating2
where userDistance.CONSUMERID = Rating2.CONSUMERID
group by Rating2.PRODUCTID,Rating2.PRODUCTNAME
order by SuggestionScore DESC;
217NAME IS NULL:2012/11/11(日) 11:48:20.00 ID:???
スレ違い
VIEWにはできないの?
218216:2012/11/11(日) 14:06:21.24 ID:???
>>217
スレ違い、すみませんでした。

ConsumerName = 'John'の部分を変数にしたいのでViewではなくストアドにしたかったのです。
どうやらDerbyのストアドはJavaで書かなければならないようなので、平文のまま組み込むことにします。
219NAME IS NULL:2012/11/12(月) 22:18:27.23 ID:???
ネットで調べてsqlite他組み込みのDBMSは非常に早い事を知ったんですが
世間的にはmysqlやpostgres、oracleなど非組み込みDBMSが一般的です
なんで組み込みのDBMSが主流にならないのでしょうか?
220NAME IS NULL:2012/11/12(月) 22:49:48.64 ID:???
早いというか、小さい、だな
プログラムが小さい
扱えるデータ量も小さい
土俵が違う
221NAME IS NULL:2012/11/12(月) 23:58:42.67 ID:c7SF2yEW
>>219
スタンドアロンならそれでもいいけどな
222NAME IS NULL:2012/11/13(火) 05:51:13.24 ID:???
SQLiteでログインとかパスワードとかどうしてる?
223NAME IS NULL:2012/11/13(火) 07:14:42.96 ID:???
SQLite パスワード とかでググれ
少なくともスレチだ
224NAME IS NULL:2012/11/14(水) 01:08:33.15 ID:vnD9R/B5
jinko menseki mitsudo
200 1000 null
100 1000 null



というテーブルで
mitsudoに jinko/menseki の計算結果を挿入するにはどうすればいいんでしょうか。

jinko menseki mitsudo
200 1000 0.2
100 1000 0.1



としたいです
225NAME IS NULL:2012/11/14(水) 01:08:56.50 ID:vnD9R/B5
mysql5です
226NAME IS NULL:2012/11/14(水) 01:38:02.25 ID:???
update hogehoge set mitsudo=jinko/menseki;
227NAME IS NULL:2012/11/14(水) 01:51:13.34 ID:???
O(-人-)O アリガタヤ・・
228NAME IS NULL:2012/11/14(水) 21:13:02.28 ID:???
ご教示お願いいたします。

・DBMS名とバージョン
SQL Server2008

・テーブルデータ
テーブル名:住所_MST
ID 住所
------------
001 住所A
002 住所B
003 住所C
004 住所D
005 住所E
006 住所F
008 住所G
010 住所H

・欲しい結果
IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした
仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします
なお、IDはキー設定されています

結果は下記のようになります
ID 住所
------------
001 住所A
002 住所B
003 住所C
004 住所D
005 住所E
006 住所F
007 新住所
008 住所G
010 住所H
229NAME IS NULL:2012/11/14(水) 22:05:15.25 ID:???
IDを1〜最大値まで回してレコードが存在するか
チェックできないほど件数があるの?
230NAME IS NULL:2012/11/14(水) 22:28:01.58 ID:???
>>229
.netの環境でマッチングしても良いかと思ったのですが
数十万件分のIDを3種設定するため処理が重いのです
SQL内でループさせてIDを設定できるのでしたら助言頂けると助かります_no
231NAME IS NULL:2012/11/14(水) 22:32:59.00 ID:???
IDを再利用する意味が分からん。
232NAME IS NULL:2012/11/14(水) 22:38:21.90 ID:???
そのままじゃ無理だろう
マスタの欠番のところにダミーレコードを入れるか
ID管理テーブルを別に作るか
いずれにしても、事前に全件をなめてどっちかを行う処理が必要
233NAME IS NULL:2012/11/14(水) 23:04:26.58 ID:???
一応こんなんでもできるけど、IDの再利用なんかやめとけに一票

insert into 住所_MST
select min(ID)+1, '新住所'
from 住所_MST T1
where not exists (select * from 住所_MST T2 where T1.ID+1 = T2.ID)
;
234228:2012/11/14(水) 23:26:45.77 ID:???
>>233
確かにID再利用は仕様変更の際に面倒になりそうですよね
桁数を7桁に増やしてIDを欠番にしてみようと思います

ソースですが若いIDから+1ずつ見てあげてマッチしなければ数値を設定といった感じでしょうか?
上記のような処理でしたらID欠番にしても動きますので良さそうですね!
参考にさせて頂きますm(_ _)m
235NAME IS NULL:2012/11/15(木) 00:25:21.46 ID:???
一つの項目に複数の意味を持たせるのは基本的に設計として間違ってる
IDに、識別子としての意味と、連番としての意味の二つの意味を持たせるからそうなる
236NAME IS NULL:2012/11/15(木) 08:02:02.10 ID:???
さすがにそれは的外れ
237NAME IS NULL:2012/11/15(木) 15:25:45.41 ID:???
>>234
7桁…?
numericつかってるなら、それをintに変更することを検討してみてもいいかと。
238NAME IS NULL:2012/11/16(金) 01:58:46.13 ID:???
関係ないけどdeleteで欠番にするよりフラグ用の列増やして使ってるか使ってないかのオンオフにした方が良くね
239NAME IS NULL:2012/11/16(金) 05:46:36.55 ID:???
そんなの常識たったたらりら
240NAME IS NULL:2012/11/16(金) 10:42:18.55 ID:???
データによっては完全削除が要求されるものもあるので「常識」とはいえない.
241NAME IS NULL:2012/11/16(金) 12:02:55.52 ID:???
データ部分を削除してレコードは削除マーク付けて残しといても良いんじゃない?
242NAME IS NULL:2012/11/16(金) 13:08:38.34 ID:???
コンプライアンス上問題になるケースもあるだろ
243NAME IS NULL:2012/11/16(金) 15:42:09.78 ID:???
データは消して番号だけ残しておくのにそれは関係ないだろう
244NAME IS NULL:2012/11/16(金) 20:56:38.02 ID:???
データベースなのにデータの無いレコードに何の意味があるの?
245NAME IS NULL:2012/11/16(金) 22:14:09.91 ID:???
この場合IDそのものが必要なデータだろう。
246NAME IS NULL:2012/11/19(月) 00:04:52.48 ID:???
すいません、超初心者です。
以下のSQLの意味がさっぱりわからないのですが、
ご教授いただけないでしょうか。

SELECT * FROM [{0}]
247NAME IS NULL:2012/11/19(月) 00:56:11.37 ID:9MGZezeT
>>246
多分ミドルウェア(.NET?)でテーブル名を置換してるだけと思われる
248NAME IS NULL:2012/11/19(月) 01:01:33.88 ID:???
SQLインジェクションで死ねるな。
249NAME IS NULL:2012/11/19(月) 10:13:07.66 ID:???
そのための[]
250NAME IS NULL:2012/11/19(月) 10:36:21.93 ID:???
ユーザとグループがN:Mの関係にあるとします。

create table users (
id serial primary key,
name varchar(100) not null
);
create table groups (
id serial primary key,
name varchar(100) not null
);
create table belongs (
user_id integer not null references users(id),
group_id integer not null references groups(id)
);

このとき、あるグループIDをもとに、そのグループに
含まれるユーザを列挙する場合、方法が2つあります。

-- joinする方法
select * from users
join belongs on belongs.user_id = users.id
where belongs.group_id = ?

-- 副問い合わせを使う方法
select * from users
where id in (select user_id from belongs where group_id = ?)

これって、どちらが効率がいいのでしょうか。
たとえばCPUの実行効率がいいのはこっちだけど、メモリ消費量が少ないのはこっちだとか、
そういうのを教えてください。
251NAME IS NULL:2012/11/19(月) 10:45:31.24 ID:???
joinだろ
252NAME IS NULL:2012/11/19(月) 10:47:11.51 ID:???
253NAME IS NULL:2012/11/19(月) 20:01:41.84 ID:???
SQLは書いたとおりに処理されるとは限りません
実際にどう処理されるかはオプティマイザ次第
254NAME IS NULL:2012/11/19(月) 23:33:18.44 ID:???
>>249
表 T があるとして

"T]; truncate table [T;" ってやられたらどうする?
255NAME IS NULL:2012/11/20(火) 03:48:12.27 ID:???
ホストアプリも環境も不明でそんな話しても無意味
256NAME IS NULL:2012/11/20(火) 04:04:19.69 ID:???
プリペアードステートメントじゃないの?
257NAME IS NULL:2012/11/20(火) 10:05:29.96 ID:???
括弧部分はSQLの一部じゃないからそんなことやっても無駄w
258NAME IS NULL:2012/11/20(火) 12:27:22.51 ID:???
sqli覚えたてでうれしかったとか
259NAME IS NULL:2012/11/20(火) 14:29:05.19 ID:???
>>252
そのページは参考にはなりますが、250の質問については書かれてないようです。
ほかに参考になるページがあれば教えてください。
「SQL join 副問い合わせ 速度」とかでぐぐってるんですが、思うようなページが見つかりません。
260NAME IS NULL:2012/11/20(火) 14:33:48.29 ID:???
そんなのRDBMSの実相によるだろ
261NAME IS NULL:2012/11/20(火) 14:38:03.81 ID:???
両方のプラン見るんじゃだめなの?
262NAME IS NULL:2012/11/20(火) 14:45:52.53 ID:???
SQLだけを見てどっちが早いかなんて解りません
263NAME IS NULL:2012/11/20(火) 16:08:48.33 ID:???
基本を知らん奴に限ってまずパフォーマンスとか騒ぎ出すのが不思議。
264NAME IS NULL:2012/11/20(火) 21:43:20.03 ID:???
>>247
了解です。ありがとうございました。
.netすれで聞いてみます。
265NAME IS NULL:2012/11/20(火) 21:57:21.83 ID:???
プリペアードクエリじゃなくてストリングビルダーとかの気がするなぁ{0}
ってなるとインジェクションも可能になってきそうだけれど。

>>264てか、まだ聞かないとだめなぐらい情報が足りないのか
266NAME IS NULL:2012/11/20(火) 23:04:02.42 ID:???
>>265
すんません、C#は初めてで・・・。
いま、やっと {0} の意味がわかりました。
とほほ。
267254:2012/11/21(水) 02:13:18.28 ID:???
ほら、やっぱり C# じゃねーか。
>>257 は俺に謝れよ。

って言うのは置いといて、>>266 がどの DBMS 使ってるのか知らんけど、
例えば SQL Server 使ってるなら System.Data.SqlClient の SqlCommand
とか SqlParameter クラスを勉強しておいた方がいいよ。

でないと SQL インジェクションとかエスケープとかで色々苦労するから。
268NAME IS NULL:2012/11/21(水) 10:26:45.13 ID:???
>>267
C#なのは見た瞬間にわかるよ。
やっても無駄だって言ってるだろw
269NAME IS NULL:2012/11/21(水) 10:27:33.81 ID:???
>>254 はADO.NETの勉強をしてみては。
270NAME IS NULL:2012/11/21(水) 23:14:59.49 ID:???
>>268
>やっても無駄だって言ってるだろw

はいはい、君の脳内 DBMS だとダメなんだろうな。
271NAME IS NULL:2012/11/22(木) 16:02:12.28 ID:62kZrm3C
Oracle11gR2で

ID  Count
1 3
2 2
3 3

こういうデータを元に

Seq ID
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 3

こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?
Seqはなくてもいい
272NAME IS NULL:2012/11/22(木) 17:34:58.19 ID:???
なんとなく再帰と自己結合をすればいいのかなぁとは思うけど再帰クエリ使ったことないからわかんないや
273NAME IS NULL:2012/11/22(木) 18:36:53.32 ID:???
>>271
>>8をうまく応用すればできるにはできると思うけど
274NAME IS NULL:2012/11/22(木) 19:32:23.99 ID:eYp+vjTA
過去にOracleのINDEXでWHERE句の順番をINDEXの定義順にしないとINDEXが
使われないとか、複合INDEXの最初の項目を指定しないとINDEXが使われない
と聞いたことがあるのですが、Oracle11で検索してみるとそんなことも
ないように見えます。実際どうなのでしょうか?
例えば、あるテーブルにA,B,Cの複合INDEXが1つある場合に
@WHERE B=X AND A=X
AWHERE C=X
の検索でINDEXが使われるのか?
275NAME IS NULL:2012/11/22(木) 19:46:27.42 ID:???
>>273
With REC(ID, idx, cnt) As
(
Select ID, 0, COUNT From TEST01
Union All
Select ID, idx+1, cnt From REC Where idx+1 <= cnt
)
Select ID, idx From REC Order by ID,idx;

こんな感じでできました。ありがとう!
276NAME IS NULL:2012/11/22(木) 19:50:13.10 ID:???
>>274
昔のDBMSではそういうこともあったけど今どきのDBMSは賢いからな
277NAME IS NULL:2012/11/22(木) 20:06:56.43 ID:???
>>274
なので、質問したりするときにはバージョンが大事だったりするんです。
278NAME IS NULL:2012/11/22(木) 20:34:57.16 ID:eYp+vjTA
すると、Oracle11であるテーブルに↓のような
INDEXを作っていた場合

INDEX1 : A,B,C
INDEX2 : B,C,A
INDEX3 : C,A
INDEX4 : C,B,A,Z

INDEX4だけあれば、他は削除しても良い
という結論になりますでしょうか?
279NAME IS NULL:2012/11/22(木) 21:30:13.51 ID:???
>>274
「そんなこともないよう」ってのはどうやって確かめたの?
実行計画見たなら質問するまでもないと思うけど。
280NAME IS NULL:2012/11/22(木) 21:59:35.93 ID:???
例えばAだけを条件に検索する場合、
INDEX4でもテーブルフルスキャンよりは速いけど
INDEX1よりは遅い、というようになるのが普通。
(データのばらけ具合(カーディナリティ)にもよるので一概には言えんけど。)

その差が許容できるかとか、インデックスの数が多いと更新が遅くなることとか、
いろいろ考えてベストなバランスにもっていくのがチューニングという作業。

それと、>>278の思想だとテーブルにあるすべての列をインデックスに入れればいい
とかいう考えに行き着いて、その結果テーブルスキャンよりインデックススキャンのほうが
遅いなんてことにもなりかねない。
281NAME IS NULL:2012/11/24(土) 16:35:37.91 ID:SfsAXaIB
SQL Server 2000においてです。

テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのに
Or で接続する以外に検索する方法はありますか?

普通?に考えれば以下の方になるかと思いますが、これを簡易的?にインデックスが利く状態で書き換えたい。
> SELECT *
> FROM Tablehoge
> WHERE (電話番号="0123") OR (携帯番号="0123") OR (FAX="0123")

なので以下の様なものは却下になります。
> SELECT *
> FROM Tablehoge
> WHERE "|" & 電話番号 & "|" & 携帯番号 & "|" & FAX & "|" Like "*|0123|*"
282NAME IS NULL:2012/11/24(土) 16:41:53.02 ID:???
where '0123' in (電話番号, 携帯番号, FAX)
かな
インデックスが効くかどうかは知らない
283281:2012/11/24(土) 17:03:55.92 ID:???
>>282
うわ、目からうろこ。
そんな事も出来るんだ。全然そんな発想無かった。

正直、騙されてるなと思いつつテストしました。thx!
284281:2012/11/24(土) 17:16:02.14 ID:???
あ、でもインデックスは使われない様だ。
と言うか OR句でも使われて無かったようだ…。
285281:2012/11/24(土) 17:25:31.36 ID:???
>>284
訂正。
インデックスはちゃんと利用されていました。。
286NAME IS NULL:2012/11/24(土) 21:10:19.98 ID:???
ぐぬぬ >>282の書き方知らんかった
データベーススペシャリストのこの俺が・・・不覚 ガクッ
287NAME IS NULL:2012/11/25(日) 04:31:35.39 ID:???
遅くなる
288NAME IS NULL:2012/11/25(日) 05:20:39.84 ID:???
IN はなるべく使うなってばっちゃんが言ってた
289NAME IS NULL:2012/11/25(日) 12:48:20.61 ID:???
オプティマイザが貧弱だったころのバッドノウハウ
290NAME IS NULL:2012/11/25(日) 12:57:19.58 ID:ITwOfUhV
Orが駄目な理由は?
291NAME IS NULL:2012/11/25(日) 13:09:14.13 ID:???
インデックスも知らない人ですか?
292NAME IS NULL:2012/11/25(日) 15:07:48.41 ID:???
ご教授ください

■ACCESS 2010

・テーブルA
 カラム:key1,key2,key3,key4,data1
・テーブルB
 カラム:key1,key2,key3,key4,data2
・テーブルC
 カラム:key1,key2,key3,key4,data3
・テーブルD
 カラム:key1,key2,key3,key4,data4,data5

テーブルA〜Dをkey1〜key4で結合し、以下のテーブルを作成したいです。

・テーブルZ
 カラム:key1,key2,key3,key4,data1,data2,data3,data4,data5

よろしくお願いします。
293NAME IS NULL:2012/11/25(日) 16:16:52.40 ID:qYmr0nWB
>>292
試してないけどこんな感じ?
クエリデザイナで十分できると思うけど
SELECT
D.key1
,D.key2
,D.key3
,D.key4
,A.data1
,B.data2
,C.data3
,D.data4
,D.data5
FROM テーブルD AS D
JOIN テーブルA AS A
ON D.key 1 = A.key1
AND D.key 2 = A.key2
AND D.key 3 = A.key3
AND D.key 4 = A.key4
JOIN テーブルB AS B
ON D.key 1 = B.key1
AND D.key 2 = B.key2
AND D.key 3 = B.key3
AND D.key 4 = B.key4
JOIN テーブルC AS C
ON D.key 1 = C.key1
AND D.key 2 = C.key2
AND D.key 3 = C.key3
AND D.key 4 = C.key4
INTO TableZ
http://office.microsoft.com/ja-jp/access-help/HA001231498.aspx
294NAME IS NULL:2012/11/25(日) 21:08:14.83 ID:???
データの状態によって結合もかわりそうだね
295NAME IS NULL:2012/11/28(水) 10:08:24.34 ID:29vczbAS
複数のデータベースからデータを取り出したいのですが
似たようなデータが並んでいて、SELECTと同じようにコンマ区切りでやれば・・・と思い、
SELECT * FROM A,Bと
してみたのですが、取り出せず、
SELECT * FROM A B
としたのですが、Aのデータしか取り出せません。
どのようにすれば両方のデータを取り出せるのでしょうか。
共通のキーでくっつけるではなく、

A あほ
A ばか
A あほ
A あほ
B あほ
B ばか
B ばか
B あほ

のように取り出したいのです。
296NAME IS NULL:2012/11/28(水) 10:30:45.68 ID:???
データベースじゃなくてテーブルじゃないの?
UNIONでつなげられるかな
297NAME IS NULL:2012/11/28(水) 11:15:41.85 ID:???
あと試すにしても、マニュアルとかは見たほうがいいよ。
A,B はJOIN、A B は別名(A AS B の ASを省略したもの)になるからね。
298NAME IS NULL:2012/11/28(水) 12:52:38.69 ID:???
union
299NAME IS NULL:2012/11/28(水) 18:03:08.02 ID:29vczbAS
ありがとうございます、UNION ALLでうまくいきました!
300NAME IS NULL:2012/11/29(木) 11:51:49.95 ID:3d0Pkdso
MS SQL server2012です。

下記のデータベースから
親の値=Aで検索して
子の値を取得し、さらに
子の値=親の値で検索したいのですが
求めたい結果を一気に表示する方法が
あったら教えてください。

親子
AB
BC
CD
XY
Z0

求めいた結果
親子
AB
BC
CD
よろしくお願いします。
301NAME IS NULL:2012/11/29(木) 11:52:24.25 ID:???
>>300です。
すみません。親と子は別の列です。
302NAME IS NULL:2012/11/29(木) 17:43:18.90 ID:???
>>300
with cte as
(
select 親,子 from テーブル where 親='A'
union all
select t.親,t.子 from テーブル t join cte on t.親=cte.子
)
select * from cte
;
303NAME IS NULL:2012/11/29(木) 18:56:52.85 ID:???
>>302
ありがとうございます。
明日試してみます。
304NAME IS NULL:2012/11/29(木) 20:44:05.39 ID:???
>>300
階層はなん階層までなんだろ
305NAME IS NULL:2012/11/30(金) 00:53:57.48 ID:???
PHPのCakePHPというフレームワークである操作をすると、

SELECT `Friend`.`id`, `Friend`.`first_name`, `Friend`.`last_name`
FROM `friends` AS `Friend`
WHERE `Friend`.`first_name` = 'Andy'
AND `Friend`.`id` < 2000
ORDER BY `Friend`.`first_name` ASC
LIMIT 10

というようなクエリが出力されます。
ここで、
`Friend`.`id`
などで使われている、「ドット」にはどのような意味があるのでしょうか?

SELECT id, first_name, last_name
と記述した場合とどう違うのでしょうか?
306NAME IS NULL:2012/11/30(金) 02:25:45.28 ID:???
単なる区切り
カラム名の前についてるなら、テーブル名(かその修飾名)との区切り
その前ならDBMSによっていろいろ。スキーマとかユーザとかデータベースだったり
307NAME IS NULL:2012/11/30(金) 07:23:01.52 ID:???
>>305
「ドット」=「の」
308NAME IS NULL:2012/11/30(金) 10:33:43.97 ID:???
>>305
複数テーブルの結合の場合には、同じフィールド名が現れることがあるから、
何々テーブルの何々フィールドという言い方が必要になることかあることは
解ると思う。この表現を一般化しただけ。表現として多くの場合冗長だが、
文法上問題はない。
309305:2012/12/01(土) 02:05:23.78 ID:???
みなさん解説ありがとうございます。勉強になります。

SQL辞典の索引を見ても .(ドット) の記述が無く困っていたんですが、
初心者本のテーブルの結合の項目に説明がありました。 
310NAME IS NULL:2012/12/01(土) 03:48:55.87 ID:???
考えれば分かりそうなものを。
311NAME IS NULL:2012/12/01(土) 13:42:10.76 ID:???
まあそう言うなって
312NAME IS NULL:2012/12/01(土) 16:00:16.54 ID:???
説明してない本が悪い
313NAME IS NULL:2012/12/05(水) 10:26:01.76 ID:rmdEDUmh
SET型について質問です。

'りんご', 'みかん', 'ばなな', 'めろん'

のようなfruitという名のフィールドがあった時、
'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?

WHERE `fruit` & 5

このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。


MySQL5を使用しています。
どなたかご教授お願いしますm(_ _)m
314NAME IS NULL:2012/12/05(水) 11:27:10.32 ID:???
mysqlのwhere句でchar型の比較を行っているんですが、デフォルトでは大文字と小文字を区別しませんよね?
でも区別しちゃってるみたいなんですが、どっかで初期設定いじれるんでしょうか?

それと、mysqlから読み込んだデータをまたDBに格納する場合って、
またmysql_real_escape_stringとかでエスケープする必要あるんでしょうか?
315NAME IS NULL:2012/12/05(水) 11:47:11.51 ID:???
>>314はすべて解決しました
ありがとうございました。
316NAME IS NULL:2012/12/05(水) 17:30:30.09 ID:???
>>313
DBMSに固有の機能に関する質問はそのDBMSのスレで聞け

って、そっちでこっちに誘導されたのか
普通にandで条件2個書けばいいだけじゃないのか?
マニュアルみたらビット演算できるらしいから101とANDとって101と比べても行けるかもしれん
WHERE (`fruit` & 5 )=5 とか。mysql知らんから知らんけど
317313:2012/12/05(水) 18:57:36.68 ID:rmdEDUmh
>>316
はい、誘導されてこちらへきました

そして、WHERE (`fruit` & 5 )=5 これで上手くいきました!
回答ありがとうございます!
わざわざマニュアルまでみて調べて頂き、本当にありがとうございましたm(_ _)m
318NAME IS NULL:2012/12/05(水) 20:20:24.98 ID:AK9BWENG
MySQL5.1

table1
id,hoge1,hoge2

idが2,4,6の中で、hoge1が1,3,5のidを取得したい。

SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5));

このsqlでidが2,4,6の3件からの検索なりますか?
もっといいsqlありますか?
319NAME IS NULL:2012/12/05(水) 21:45:40.99 ID:???
それでいいと思う
もっといいSQLはちょっと思いつかない
320NAME IS NULL:2012/12/07(金) 13:52:11.17 ID:BCru92G9
複数のテーブルからデータを取るとき、selectを複数回実行するのと
joinを使ってメインのデータとそれに付随するデータをまとめて取得するのはどう使い分けたら良いんでしょうか?
たとえば、日記の記事(メイン)、タグ(サブ)、写真情報(サブ)という感じに
3つのテーブルがあるようなとき日記自体は1件しかないのにleft joinでとると何十行のデータになる場合があると思います
そうするとプログラムで整形する手間が生まれるし
でも、個別にselect()を3回実行するよりもjoinを使った方が速度は早いらしいし…

負荷とか速度とか、この兼ね合いは皆さんどういう風に判断してるんでしょうか
321NAME IS NULL:2012/12/07(金) 20:34:13.03 ID:???
臨機応変
ケースバイケース
気分次第
322NAME IS NULL:2012/12/07(金) 21:27:07.18 ID:???
プログラムがめんどいからこうするってのはないな
やっぱり速度が一番重要ジャマイカ
速いけどリソース食いすぎの場合は別途考える
323NAME IS NULL:2012/12/07(金) 22:04:47.89 ID:???
速いとその分システムへの負荷が軽い(多分)
324NAME IS NULL:2012/12/07(金) 23:53:54.50 ID:BCru92G9
>>321-323
ありがとうございます。
なんと言うか、320に書いた例だと、left joinを使ってやった場合返り値が$retだとして
$diary_title = $ret[0]['diary_title'];
みたいな形になるわけで、なんだか頭が悪そうというか美しくないというか他にやりようないのか
という気になっています

selectを3回実行すればクエリのエラーの確率も返り値のチェックの手間も3倍になるなどと
考えてしまうんですが、テーブル1つが対象のwhere以下の条件が3つ程度の単純なselect文が失敗する可能性なんて
考えるのは非現実的でしょうか?
325NAME IS NULL:2012/12/08(土) 08:35:36.62 ID:PTDEWr+G
select文が失敗…?
デッドロックが激しすぎる状態とか?
326NAME IS NULL:2012/12/08(土) 09:57:20.59 ID:???
テーブル名が途中で書き換えられるとか?
327NAME IS NULL:2012/12/08(土) 13:15:59.94 ID:???
まあ複数回取得される同一の値のデータ量が多ければ
二回に分けるかな そんなに遅くならないよね?ね?と自分を安心させて
328NAME IS NULL:2012/12/08(土) 13:55:56.24 ID:???
>>325,326
ですよね!普通ならありえないですよね
>>327
>まあ複数回取得される同一の値のデータ量が多ければ
そうなんです、「確かに一度でとれるけど、joinすればするほど何度も同じデータ引き出して無駄じゃないのか」
って気分でモヤモヤしてました
安心しました、ありがとうございました
329NAME IS NULL:2012/12/08(土) 18:06:02.35 ID:???
>>324
カラムの数にもよるけどunion使って
3つのテーブルのデータを取得してくる方法も
ありかもね
330NAME IS NULL:2012/12/08(土) 18:30:17.61 ID:???
>>325
ネットワークエラーとか。
331NAME IS NULL:2012/12/12(水) 21:40:37.07 ID:DsyuUF3/
table a のaaa カラムを、
table b のbbbカラムで更新したい場合どのように書けばいいのでしょうか?

table a と table b の結びつきはこんな感じとします。

table a.aaaaaaa = table b. bbbbbbb




配列の作成 (select * from table_a order by aaa)

while( 配列がなくなるまで ){

table_a[].aaa = [ select bbb from table_b where table_a.aaaaaaa = table_b.bbbbbbb ]

}
update table_a



こんな感じで作れるのでしょうか?
具体的に、このようなサンプルはありますでしょうか?
332NAME IS NULL:2012/12/12(水) 22:41:45.65 ID:???
table b. bbbbbbbの値が一意に決まるなら、これでどう?

update table_a set aaa = (select bbb from table_b where table_a.aaaaaaa=table_b.bbbbbbb);
333NAME IS NULL:2012/12/12(水) 23:31:04.99 ID:???
>>332
最初それ書こうと思ったけど、
それだとサブクエリ側がtable_aのaaaとtable_bのbbbが等しいレコードが全部結果として出力されるから2レコード以上あったらエラーにならね?
例えばtable_aのaaaが1、2、3、5ってレコードがあって、table_bのbbbが1、2、4、5ってレコードがあったとすれば、
select bbb from table_b where table_a.aaaaaaa=table_b.bbbbbbb
このサブクエリの部分の結果は1、2、5になるからエラーになる気がするし、
仮に1レコードだけだったとしてもtable_aの全てのレコードのaaaカラムがその出力されたbbbに更新される気がする
実際試してないから分からんけど
334NAME IS NULL:2012/12/12(水) 23:33:09.15 ID:???
table_a.aaaaaaa = table_b.bbbbbbb で取得する値が複数あったら、
一体どれでupdateすればいいの?
335NAME IS NULL:2012/12/13(木) 00:53:10.76 ID:b/7p0Yp8
>332-334
回答ありがとうございます。
使っているシステムが、SOQLという擬似SQL言語のようで、
update 〜 set 〜という文をサポートしていませんでした。

1度PCにエクスポートして、mysqlで整形後uploadすることにします。

>>334
bbbbbbb というのは記述ミスでした。
条件式の中も選択するのも bbb なので、
limit 1 というのを最後に付加すれば、1:1になると思ってます。

失礼いたしました。
336NAME IS NULL:2012/12/13(木) 18:07:33.04 ID:???
>>332
その方法でうまくいきました。
ありがとうございました。
337NAME IS NULL:2012/12/13(木) 20:33:49.63 ID:???
該当レコードがあればupdate、なければinsertというのはSQLではどうやるんでしょうか。

-- もしデータがあれば
update foobar set val = :val where date = :date;
-- そうでなければ
insert into foobar (date, val) values (:date, :val);

やりたいことは、過去のデータを日単位で集計して、それをテーブルに入れておくことです。

環境: PostgreSQL 9.1
338NAME IS NULL:2012/12/13(木) 20:51:04.64 ID:???
mysqlだったら
insert into on duplicate key update か replace into で出来るけど
Postgreの方は知らない
339NAME IS NULL:2012/12/13(木) 21:28:10.52 ID:???
>>337
やりたいことをみる感じだと、それ以外の解決方法がありそう。

ともあれ、あればupdate、なければinsertについては下記参照
http://lets.postgresql.jp/documents/technical/9.1/1
340NAME IS NULL:2012/12/14(金) 11:25:45.92 ID:xa+Xo9C8
PKで select してレコードがあれば update なければ insert 以外に何かあんの?
341NAME IS NULL:2012/12/14(金) 11:55:11.71 ID:???
あるかないかで言えばある
342NAME IS NULL:2012/12/14(金) 13:46:33.92 ID:???
>>339
これのどこを読めばいいの?
343NAME IS NULL:2012/12/14(金) 21:06:55.95 ID:???
>>342
日本語読めない人じゃないならそんぐらい読んで欲しい。
ついでに目に入ったキーワードはあとで役立つこともあるのだから。
344NAME IS NULL:2012/12/15(土) 10:40:04.17 ID:???
>>337
MERGEは?Postgreでサポートしているか知らないけど。

それか、過去のデータ消してないなら
foobarテーブルを全レコード削除してINSERTだけにしたら?
345NAME IS NULL:2012/12/15(土) 11:43:41.53 ID:???
>>343
いや、ざっと読んだうえで、どこに書いてあるのかわからないんだが。
これって9.1のリリースノートだよね?SQLの新機能にそんなのがあるのかと思ったけど、別にかいてなかった。
346NAME IS NULL:2012/12/15(土) 12:39:24.88 ID:???
どうでもいいけど Postgres な
347NAME IS NULL:2012/12/15(土) 12:45:07.77 ID:???
俺的にはPosgre
348NAME IS NULL:2012/12/15(土) 13:22:12.12 ID:???
Oracle8、SQL plusを使って、外部ファイルを読み込ませて
INSERTを行いたいのですが、上手くいきません。
ファイルには、↓のようなINSERT文が500くらいあります。
---------------------------------------------------------------------------------
begin
INSERT INTO HOGE (ID, TITLE, HONBUN) VALUES (1, '連絡用', '○○様
お世話になっております。
○○です。

ご連絡頂いた○○ですが・・・・

以上');
INSERT INTO HOGE (ID, TITLE, HONBUN) VALUES (2, '確認用', '○○様
お世話になっております。
○○です。

○○のご確認の為・・・・

以上');



end;/
---------------------------------------------------------------------------------
このファイルを実行すると
SQL>@hoge_insertsql.txt
567
568
569
570



という感じで数字が出てきてenterを押すと
数字がどんどん増えるだけで、何も登録されていません。
1行だけにして実行しても、数字の数が減っただけでINSERTされませんでした。
begin〜end;/は、改行のある文章を含む場合は必要、という事でつけています。
commonSQLからなら、問題なくINSERTできるので、SQL自体には問題がないのは確認済みです。
OracleもSQL plusも、さらに言うならTera Term自体使ったことがないので
原因がわかりません。
INSERTする方法をご教授して頂ければと思います。
349NAME IS NULL:2012/12/15(土) 14:23:04.35 ID:???
/ はそれでひとつのコマンドなので単独で入力する必要があるはず

てか begin end; も / もいらなくね?
手元にOracle8がないから試せないけど

てかSQLの質問じゃないな
350NAME IS NULL:2012/12/15(土) 14:59:07.54 ID:???
'か)の数があってないんだろ。
351NAME IS NULL:2012/12/15(土) 15:36:25.75 ID:???
自民創価連立政権だけは絶対に阻止しまよう
対立候補に投票しましょう
352NAME IS NULL:2012/12/15(土) 20:15:28.49 ID:???
>>349
ではOracle質問スレの方で聞いてみます。
353NAME IS NULL:2012/12/15(土) 21:25:30.02 ID:???
>>348
改行するのでなく、
commitと入力して改行したらどうなる?
354NAME IS NULL:2012/12/15(土) 21:53:36.17 ID:???
>>353
そういう問題じゃないよ。
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。
355NAME IS NULL:2012/12/15(土) 21:55:29.13 ID:???
あ、まさか、/を;の直後に置いてるのか???
そんなアホはおらんよな。
356NAME IS NULL:2012/12/15(土) 22:01:15.58 ID:???
まさかも何も、>>348にそう書いてあるじゃん
357NAME IS NULL:2012/12/15(土) 22:23:28.53 ID:???
あほすぐる
358NAME IS NULL:2012/12/15(土) 22:29:11.65 ID:???
つか特定のツールの話はよそでやれ
359NAME IS NULL:2012/12/16(日) 10:51:59.92 ID:???
>>354
INSERT文の最後を「;」じゃなく「/」にしろという事でしょうか?
360NAME IS NULL:2012/12/16(日) 11:06:14.58 ID:???
もう、アホすぎて返事ができないわ。
361NAME IS NULL:2012/12/16(日) 12:16:35.69 ID:???
通りすがりに15秒みてレスするけど、、、


end;
/

こうでねーの?
SQL*Plusとか知らんけど
362NAME IS NULL:2012/12/16(日) 12:54:41.24 ID:???
>>361
「/」を最後に1行だけにする。
という事ですか。
363NAME IS NULL:2012/12/16(日) 13:04:45.69 ID:HevFQp2W
>>362
>>354
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。

って書いてるやん
364NAME IS NULL:2012/12/16(日) 13:42:35.96 ID:???
>>363
なるほど!

質問に答えてくれた皆さんありがとうございました。
365NAME IS NULL:2012/12/18(火) 11:11:47.81 ID:???
複数の異なるSQLをまとめて送信し、結果もまとめて受け取ることはできますか。
やりたいことはDBサーバとの通信回数を削減することです。
たとえば
select * from AAA where id = ?;
select * from BBB where value = ?;
select * from CCC order by created_at desc limit 5;
みたいな、互いに関連のないSQLをまとめて送受信することで、通信回数を3回ではなくて1回ですませたいです。

環境はPostgreSQLですが他のDBでできるのであれば教えてください。
366NAME IS NULL:2012/12/18(火) 11:25:49.93 ID:???
そっちのが無駄な気が、、、
同じパターンが多いならView作っちゃえば?
367NAME IS NULL:2012/12/18(火) 11:56:32.49 ID:???
あと通信で時間かかるのは接続だから
つないだまま3つ発行すればいいだけのような
368NAME IS NULL:2012/12/18(火) 13:53:05.93 ID:???
適当なパフォチュー情報を見つけて、さらにその断片を曲解して変な事をやりだすやつがたまにいるな
369NAME IS NULL:2012/12/18(火) 16:20:11.08 ID:???
まあ、できるかどうかはミドルウェアによるし
SQL関係ないからよそで聞いてくれ
370NAME IS NULL:2012/12/18(火) 19:12:33.98 ID:???
>>365
JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
マニュアル読め。
371NAME IS NULL:2012/12/18(火) 19:22:29.14 ID:???
ストアドプロシージャの初歩的な例でそういうのが載ってたりするけど違うのか
372NAME IS NULL:2012/12/18(火) 19:36:31.28 ID:???
>>370
>JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
なんという名前の機能でしょうか。教えてください。
キーワードがわかればぐぐります。
373NAME IS NULL:2012/12/18(火) 19:49:38.69 ID:???
1本のSQLにまとめてしまったら?w
374NAME IS NULL:2012/12/18(火) 20:24:26.03 ID:???
>>367
コネクションプーリングはしています。そのうえで通信回数を減らしたいという要求です。

>>373
たがいに関連のないSQLを1つにまとめることができるなら、教えてください。
375NAME IS NULL:2012/12/18(火) 20:42:01.21 ID:???
a のコラムがitem,val で、bのコラムがid,col1,col2,col3 だとして

select null as id,null as col1,null as col2,null as col3,item,val from a
union
select id,col1,col2,col3,null as item,null as val from b;
376NAME IS NULL:2012/12/18(火) 21:45:05.10 ID:???
>>375
おお、無理やり結果セットを揃えることで、unionを利用可能にしてるんですね。なるほど。
試してみます。ありがとうございます。

>>370
で、その機能はなんという名前なんでしょうか。
377NAME IS NULL:2012/12/18(火) 21:53:57.55 ID:???
自分で調べられないなら必要ない機能だよ。
378NAME IS NULL:2012/12/19(水) 03:10:11.31 ID:???
SQLの問題じゃなくてミドルウェアの問題だって言ってるだろ
スレチだからとっとと引っ込め
379NAME IS NULL:2012/12/19(水) 10:14:28.29 ID:???
UNIONなんて誰でも思いつくのにあえて言わないのは何でだかわかるかw
380NAME IS NULL:2012/12/19(水) 14:27:25.61 ID:???
そっとしておいてやれよ
381NAME IS NULL:2012/12/19(水) 15:00:37.21 ID:???
>>377
>自分で調べられないなら必要ない機能だよ。
機能の名称を教えていただければ、あとは自分で調べます。

>>379
unionは要素の型が同じである集合に対する演算なので、まったく異なる種類のselect文に対して使う発想はなかったです。
これって「誰でも思いつく」ようなものだったんですね。知りませんでした。
382NAME IS NULL:2012/12/19(水) 16:50:15.64 ID:???
カーソル動かして結果をフェッチするのに要する通信回数は考えないのか。
クエリを投げる通信回数を減らすのにどれほどの意義があるのかよく分からん。
383NAME IS NULL:2012/12/19(水) 17:08:26.96 ID:???
通信するたびに電話かけてダイヤルアップするんだろ
384NAME IS NULL:2012/12/20(木) 22:27:02.37 ID:???
話中だと待つのか?
385NAME IS NULL:2012/12/20(木) 23:02:41.14 ID:???
>>381
>>370にマニュアル嫁って書いてあっただろ?
ちゃんと読んだか?
読んでないだろ?
マニュアルを全部読んだらバカでもわかる。
マニュアルも読まずにここで質問するな!
386NAME IS NULL:2012/12/20(木) 23:03:56.67 ID:???
>>384
その通り。
387NAME IS NULL:2012/12/20(木) 23:25:13.07 ID:???
ヒント句指定しても思ったように索引が利用されないんだけど
考えられる原因て表を別名で指定してんのにヒントの中では元の表の名前で入れてしまってる他に
何かある?
388NAME IS NULL:2012/12/20(木) 23:54:10.33 ID:???
ヒント句が働いてない
ヒント句の使用方法が間違ってる
389NAME IS NULL:2012/12/21(金) 00:46:56.43 ID:???
HINTの文法間違いか、テーブルやインデックスの名前の書き間違い。
ほぼ100%このどちらか。

VIEWの場合は実表を指定するんだったかな。
390NAME IS NULL:2012/12/21(金) 02:02:29.95 ID:???
やっぱそうだよね
もう1回見直してみるわ
391NAME IS NULL:2012/12/21(金) 18:45:30.72 ID:???
実装に強く依存する質問をDBMS名も書かずにここで質問とかもう
しかも実際のSQLも書いてないし
392NAME IS NULL:2012/12/21(金) 20:30:09.30 ID:???
ヒントが上手く動作しない原因なんて、どのDBでも大差ないよ。
393NAME IS NULL:2012/12/22(土) 16:22:44.99 ID:???
データベース作成のスクリプトってどうやってデバッグすればいいのでしょうか? 
途中でエラーが出て、それを直しても再実行するとそこまでに出来てたものが重複で
エラーが出ます。 

全部ドロップするスクリプトを書こうとしたら、出来てないものは削除出来ないと
途中でとまります。 

効率の良い手法はないでしょうか? MS-SQLを使ってます。
394NAME IS NULL:2012/12/22(土) 16:59:30.68 ID:Wei1UoXa
データベース作成オプションに if exists とか if not exists とかってMS_SQLにはないん?
395NAME IS NULL:2012/12/22(土) 17:16:56.76 ID:???
何の言語でスクリプト書いてるのか知らんが、ドロップのエラーで
止まらんようにはできるだろ。
396NAME IS NULL:2012/12/22(土) 17:41:04.73 ID:???
>>393
ダンプしろよ。
397NAME IS NULL:2012/12/23(日) 17:13:16.69 ID:???
>>387
oracle10g以降を使用していて、
オプティマイザがコストベースでアプローチしているからではない?

>>393
PL/SQLだと、動的にテーブルを削除するとしたらこんな感じかな。
これをT-SQLで書いたら良いんじゃね?
declare
SQL_WORK VARCHAR(128);
cursor cur is
select table_name from user_tables;
begin
for cur_rec in cur loop
SQL_WORK := 'drop table ' || cur_rec.table_name;
execute immediate SQL_WORK;
end loop;
end;
/
398NAME IS NULL:2012/12/24(月) 09:08:31.18 ID:???
オプティマイザがコストベースでアプローチしちゃうのを防ぎたいがためのヒントなんじゃないの?
399397:2012/12/24(月) 12:44:54.89 ID:???
>>398
oracle10g以降ではルールベースのサポートをしていないから、
ヒント句を書いても実行計画を見るとコストベースになっているんじゃないかな。
>>387に関しては、統計情報取ったら改善されると思う。

違っていたらすみません。
400NAME IS NULL:2012/12/24(月) 15:34:04.04 ID:???
ORACLEの話はORACLEのスレでやれよ
元質問者はDBMS明記してないし
401NAME IS NULL:2012/12/24(月) 15:38:39.79 ID:???
そうなんだサンクス
ヒント句って実行計画を無理やり捻じ曲げるようなものだと勘違いしてた
402NAME IS NULL:2012/12/26(水) 17:07:47.25 ID:???
A列 B列
001 002
004 009
007 005

こういうテーブルのA列 B列から、

001
002
004
009
007
005

と交互に抜き出す方法はありませんか?
403402:2012/12/26(水) 17:11:37.48 ID:???
UNIONでできました
解決しました
404NAME IS NULL:2012/12/26(水) 19:18:20.57 ID:???
なんでunionでできたのかわからんな
unionでも何でもorder byをつけないと順序は保証されないが
405NAME IS NULL:2012/12/26(水) 19:25:59.97 ID:???
>>402
参考までにそのSQL教えて下さい
406NAME IS NULL:2012/12/26(水) 20:16:57.11 ID:???
>>404
order byじゃ無理だろ。
>>402を良く読め。
407NAME IS NULL:2012/12/26(水) 20:44:31.34 ID:???
>>406
おまえこそ>>404の真意をよく読め。
408NAME IS NULL:2012/12/26(水) 20:57:58.74 ID:???
ORDER BY でどうやって1, 2, 4, 9, 7, 5って並べるのよ?
1, 2, 4, 5, 7, 9じゃないんだぜ。
409NAME IS NULL:2012/12/26(水) 21:22:18.52 ID:???
select val from
(
select to_char(ROWID)+'1' as num, A as val from table
union
select to_char(ROWID)+'2' as num, B as val from table
)
order by num;

でどうだ
410NAME IS NULL:2012/12/26(水) 21:27:40.93 ID:???
>>409
Oracle前提で言うと、ROWIDじゃなくて、ROWNUMだろ。
ROWNUM*2+0とROWNUM*2+1をunion allしてsortだ。
411NAME IS NULL:2012/12/26(水) 21:33:09.94 ID:???
>>408
order byつけなければ順序が保証されないうえ、
order byでは解決できない内容なのに、
unionでできたのが何でかわからん
って話でしょ?
412NAME IS NULL:2012/12/26(水) 21:35:34.97 ID:???
実は「交互に」は大して重要な要件じゃなくて
単にA列とB列を列挙したかっただけのような気がしなくもない
413NAME IS NULL:2012/12/26(水) 21:40:22.88 ID:???
>>412
俺もそう思う。
なのでorder byじゃなくてunionで正解だと思う。
414NAME IS NULL:2012/12/26(水) 21:50:33.15 ID:???
>>408
空気脳は日本語も理解できないのかよ?w
415NAME IS NULL:2012/12/27(木) 00:18:19.10 ID:???
>こういうテーブルのA列 B列から、

table名をXXとして、mysqlで
select right(concat('00',A*x+B*y),3) from XX,(select 1 as x,0 as y union select 0 as x,1 as y) as d;
416NAME IS NULL:2012/12/27(木) 14:24:04.49 ID:???
select if(x=1,A,B) from XX,(select 1 as x union select 0 as x) as d;
417NAME IS NULL:2012/12/27(木) 17:41:15.16 ID:???
>>415
数字しか通用しない上に順序も保障されないんだが?無駄に複雑にしてるだけだな
>>416
それも順序が保証されない
やってみて上手くいってるように見えるかもしれないが、それはたまたま

XXとDの直積のテーブル結合の方法をヒントとかで制御できるなら
望みの順番で出力されるかな?どっちにしろ保障外だが
418NAME IS NULL:2012/12/27(木) 18:03:44.51 ID:???
列Aがユニークかつ元の表が列Aの順で出力されているって前提なら
汎用的なSQLで書くなら
select data from
(select A as key1,0 as key2,A as data from table
&nbsp;union all
&nbsp;select A as key1,1 as key2,B as data from table
) as t
order by key1,key2
で行けるんじゃね?
それ以外だともうちょい条件付けないと汎用的なSQLでは厳しいんじゃないかな
ROW_NUMBERは標準SQLらしいけど使えないDB結構ありそうだし
419NAME IS NULL:2012/12/27(木) 21:35:38.19 ID:IOSEO7j3
INSERT INTO テーブル
SELECT
あ,
い,
う,
え,

FROM テーブル
WHERE EXISTS (SELECT * FROM テーブル WHERE 条件)



ここで「お」の値を、AND EXISTS (SELECT * FROM テーブル WHERE 条件)の条件が成立する場合は特定の値(仮に定数)に、
そうでない場合はNULLにするには、どうすればいいのでしょうか?

DBはSQL Serverです
420NAME IS NULL:2012/12/27(木) 22:42:17.24 ID:???
>>419
CASE使えとかそう言う事?
421NAME IS NULL:2012/12/28(金) 12:35:12.17 ID:ClRuT7DF
>>420
CASEでもなんでもいいです

とにかくおを条件文で変える方法が知りたいです
422NAME IS NULL:2012/12/28(金) 13:20:55.23 ID:???
MS SQL SERVER2012です。

"121228"で検索して
ハイフン以下の数字で
一番大きいもの'121228-12'を求めたいです。

列1
121221-1
121228-1
121228-9
121228-10
121228-11
121228-12

求めたい結果:121228-12

以下の式だと"121228-9"になってしまいます。
WHERE 列1 LIKE ('122428%')
ORDER BY 列1 DESC

どうすればいいでしょうか。
よろしくお願いします。
423NAME IS NULL:2012/12/28(金) 13:43:21.12 ID:???
>>421
だからCASE使えよ

>>422
明らかに設計が間違ってるが、マイナスを考慮しないなら
-を小数点に変換して数字として扱えば行けるんじゃね
424NAME IS NULL:2012/12/28(金) 13:48:56.73 ID:???
create table tttt
(id varchar(10));
insert into tttt values
('121221-1'),
('121228-1'),
('121228-9'),
('121228-10');

select id , max(cast(mid(id,locate('-',id)+1,2) as SIGNED)) as hfn from tttt;
+----------+-----+
| id | hfn |
+----------+-----+
| 121221-1 | 10 |
+----------+-----+
1 row in set

locateで'-'以降の文字列を取り出してcastで数値に変換した上でmax関数で
取り出し

sqlserverに上記の関数があるかどうかしらんけど
425NAME IS NULL:2012/12/28(金) 13:53:27.29 ID:???
>>424は忘れてくだちぃぃ^^;
426NAME IS NULL:2012/12/28(金) 15:27:31.17 ID:???
>>422ですが
レス有難うございます。
CastやMidというものを知ることが出来たので
以下のようにやって並び順は求めるものが出来ました。

SELECT 列1,CAST(SUBSTRING(列1,8,2) AS INT) AS 列2
FROM データベース
WHERE 列1 LIKE('121228%')
ORDER BY 列2 DESC

これで並び順は
121228-10が先頭に来たのですが
列1        列2
121228-10     10
上記のように列2が邪魔です。
どうにかなりますでしょうか?
427NAME IS NULL:2012/12/28(金) 16:50:56.38 ID:???
order byのところに式は使えないんだっけ?
けどいらんのだったらつかわなきゃ良いだけの話では?
428NAME IS NULL:2012/12/28(金) 18:08:54.76 ID:???
つかorder byに別名指定できるのか?
2012から仕様変わったか?
429NAME IS NULL:2012/12/28(金) 21:10:50.20 ID:???
>>426
これじゃだめか?

SELECT 列1 FROM データベース WHERE SUBSTRING(列1,8,2) = (SELECT MAX(CAST(SUBSTRING(列1,8,2) AS INT)) FROM データベース);
430NAME IS NULL:2012/12/29(土) 07:25:46.42 ID:???
>>422です。
色々有難うございました。
>>429 
ウチのデータベースの形が悪いせいだと思うのですが
上手くいかなかったので、邪魔な列はそのままで使おうと思います。
431NAME IS NULL:2012/12/29(土) 19:30:46.57 ID:xudNrque
UPDATE list SET target=1 WHERE id=1
というので更新をかけたいのですが、id=1が複数あります。
どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか?
最後に「LIMIT 1」とつけたら
SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが
こういったことが可能であれば構文的にご指摘いただけないでしょうか。
432NAME IS NULL:2012/12/29(土) 20:10:59.23 ID:???
他に行を区別できる項目が無ければ基本的に無理
DBMSによってはそう言う列や関数があるかもしれん
433NAME IS NULL:2012/12/30(日) 03:25:55.33 ID:???
update list
set target=1
where ユニークキー = (select ユニークキー from list where id=1 limit1)
ユニークキーも設定してないゴミテーブルなら知らん
434NAME IS NULL:2012/12/30(日) 06:22:37.55 ID:???
>>433
id=1 and ユニークキー=aaa
435NAME IS NULL:2012/12/30(日) 15:15:17.33 ID:???
>>431
id=1が複数あるなら、
全レコードをいったん取得してから削除し、
必要なデータだけ修正して、
全レコードインサートする

なんてするのかな?
436NAME IS NULL:2012/12/30(日) 21:28:40.63 ID:???
そもそもidが複数あるのがよくわからないが。
437NAME IS NULL:2012/12/30(日) 21:43:19.48 ID:???
>>431
何をしたいのかわからないけど、↓で>>431は満たすと思う。
update list SET target=1 WHERE rowid =(select max(rowid) from list where id = 1);
438NAME IS NULL:2012/12/30(日) 22:26:14.69 ID:???
DBの種類も書いてないのになぜrowidが使えると思うのか。
limitが使えないってことは少なくともmysqlじゃなさそうだが。
439NAME IS NULL:2012/12/30(日) 22:53:38.86 ID:???
>>434
頭大丈夫?
440NAME IS NULL:2012/12/31(月) 00:19:18.83 ID:???
汎用的に行くなら

UPDATE list T
SET target=1
WHERE id=1
AND NOT EXISTS (
SELECT * FROM list
WHERE 主キー<T.主キー
AND id=1
)

かな。
主キーが複合キーならそれなりに書き換えて。
441NAME IS NULL:2012/12/31(月) 00:25:37.76 ID:???
>>440
それ複数行書き換えるだろ
442NAME IS NULL:2012/12/31(月) 09:15:44.56 ID:???
こうだな。
update list
SET target=1
WHERE ユニークキー =(select max(ユニークキー) from list where id = 1);
443NAME IS NULL:2012/12/31(月) 09:26:22.22 ID:???
>>441
いや、複数行にはならんだろ
444NAME IS NULL:2012/12/31(月) 12:58:27.55 ID:???
ユニークキーが設定してないようだと、カーソルを使うしかないかなぁ。

begin;
declare c cursor for select * from list where id=1;
fetch c;
update list set target=1 where current of c;
commit;
445NAME IS NULL:2012/12/31(月) 19:53:59.62 ID:???
>>440
>>442
キーがあるなら>>433で十分だろ
446NAME IS NULL:2012/12/31(月) 20:58:52.07 ID:???
limitが使えるDBMSの場合は、な。
447NAME IS NULL:2012/12/31(月) 23:48:19.21 ID:???
エラーメッセージから見て >>431 は、MySQL だろ。
448NAME IS NULL:2013/01/01(火) 19:29:09.67 ID:???
>>440,443
UPDATEのテーブル名に別名付けれるのは汎用的じゃないと思うぞ
449NAME IS NULL:2013/01/02(水) 06:17:14.32 ID:kX4zlPod
  ●●●ケネディ大統領は何故、死なねばならなかったのか?●●●
  http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1226114724/53

  ¥¥¥¥¥¥¥『万有サロン』書き込み大賞・総額100万円¥¥¥¥¥¥¥¥¥¥¥¥

  この掲示板に優秀な書き込みをして、総額100万円の賞金をゲットしよう!(*^^)v
    万有サロン
      http://jbbs.livedoor.jp/study/3729/
    書き込み大賞の詳細
      http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1069922074/78-
    書き込み大賞の詳細(資料倉庫内)
      http://www2.tba.t-com.ne.jp/a-z/omake/banyu/taisho.htm

  また、あらゆる疑問に関する質問を、携帯電話やメールでも受け付けています。
    電話番号 080-4437-4187
    メール  [email protected]

  ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
450NAME IS NULL:2013/01/02(水) 13:38:43.87 ID:gqHbCqyn
現在、ゲームのフィールドとそれに対応する出現モンスターのデータベースを作っています。
折角なのでいろんなゲームに対応できるようにしたいと思ったのですが、最大登場数がいくつになるかがわかりません。

カラム数が決まっていない場合、どういう風にデータベースを作るのが良いでしょうか

ID | GameID | Map      | Monster1 | Monster2
--+-------+-----------+---------+-----
1 | 123    | Forest    |
2 | 456    | Grassland  |
3 |・・・

現在、テーブルのイメージはこんなかんじです
Monsterをあらかじめ大量に作っておくしかないでしょうか
他にいい方法はありますか?
451NAME IS NULL:2013/01/02(水) 13:41:41.32 ID:???
正規化を勉強するのがいいと思う。
SQL関係無いからこの辺で、、、
452NAME IS NULL:2013/01/02(水) 13:54:21.28 ID:gqHbCqyn
ありがとうございます。スレ違いすいませんでした。
453NAME IS NULL:2013/01/02(水) 15:09:09.64 ID:???
ゲームじゃないけど、
ここでいうモンスターみたいなのが1カラムにカンマ区切りで入ってるデータベースを知ってる
454NAME IS NULL:2013/01/02(水) 15:46:28.18 ID:???
正規化を見て理解しました。
フィールドごとのテーブルを作れば解決だったんですね。ありがとうございました。
455NAME IS NULL:2013/01/02(水) 17:16:19.67 ID:???
>>454
それだとそのテーブル名をどこから引いてくるかという問題が発生する。
456NAME IS NULL:2013/01/03(木) 19:05:00.07 ID:2T2n9/75
mysql-slow.logにくっそ重いSQLが記録されております。
mysql Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

SELECT *
FROM `imgcache`

WHERE ( `rank` >= 0 ) AND ( id IN (SELECT MAX(id) FROM `imgcache` GROUP BY size, md5, mime) ) ;

topでみるとcpuがほぼ100%に貼り付いており
4717 rows in set (1 min 14.98 sec)
です。

負荷を軽くする方法はないでしょうか?
457NAME IS NULL:2013/01/03(木) 20:13:30.19 ID:???
group by や max を使わないで済むようにテーブル構造変えればいいじゃない。
458NAME IS NULL:2013/01/03(木) 21:01:56.26 ID:???
>>456
実行計画みてみないと何とも言えないが
一般的にはrankか、size,md5,mimeにインデックス張る
INをやめて相関問い合わせで=にしてみたら早くなるかもしれん

それ以上はRDBMS実装に大きく依存するからmysqlのスレで聞け
459NAME IS NULL:2013/01/03(木) 21:14:11.16 ID:2T2n9/75
ヒントをありがとうございます。
ググりながら回答をフォローしております。

mysql> DESCRIBE imgcache;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uri | varchar(255) | YES | MUL | NULL | |
| host | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| size | int(11) | NO | MUL | NULL | |
| md5 | char(32) | NO | | NULL | |
| width | smallint(6) | NO | | NULL | |
| height | smallint(6) | NO | | NULL | |
| mime | varchar(50) | NO | | NULL | |
| time | int(11) | NO | MUL | NULL | |
| rank | smallint(6) | NO | | 0 | |
| memo | text | YES | | NULL | |
+--------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

maxを使わない→インデックスを作る?
mysql> CREATE INDEX idx_id on imgcache(id);
あまり変わらず。

group byの解決策→まだわかりません。

ただ、解決策の載ったブログがヒットすることはわかりました。
数日かけてそうしたブログを理解していこうと思います。
460NAME IS NULL:2013/01/03(木) 21:15:27.93 ID:2T2n9/75
>>458
ありがとうございます。
学習が進んだら、mysqlスレでも聞いてみます。
461NAME IS NULL:2013/01/03(木) 22:43:38.18 ID:???
idは主キーなんだから、たぶんシステムが勝手にインデックス張ってるだろ
rankと(size, md5, mime)にインデックス張れよ
462NAME IS NULL:2013/01/04(金) 02:39:33.48 ID:???
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| data | int(11) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
のとき、id=1とid=2が共通して持ってるdataのrowを取得するSQLってmysqlで書けますか?
insert into table values(1,100);
insert into table values(1,200);
insert into table values(1,300);
insert into table values(2,200);
みたいなデータのときは
+------------+--------------+
| id | data |
+------------+--------------+
| 1 | 200 |
| 2 | 200 |
+------------+--------------+
といった感じです
463NAME IS NULL:2013/01/04(金) 04:21:42.20 ID:???
条件がたりないからこれだけじゃ駄目だとは思うけど、

select id,data from table where data in (select data from table group by data having count(data) > 1) order by data;

こんなのとか
464462:2013/01/04(金) 05:41:56.30 ID:???
>>463
例えで示したデータが悪かったです
insert into table values(1,100);
insert into table values(1,200);
insert into table values(1,300);
insert into table values(2,200);
insert into table values(2,400);
insert into table values(3,200);
insert into table values(3,300);
みたいなときもid=1とid=2の人で
+------------+--------------+
| id | data |
+------------+--------------+
| 1 | 200 |
| 2 | 200 |
+------------+--------------+
という結果が出てくる、という意味でした。あくまで指定した二人のデータに注目します
>>463さんのsqlだと上のinsertでやった場合id=3の人のも出てきてしまうので・・。
僕も考えていますが単純なselect文しか使ってこなかった分際なので苦戦しておりますw
465NAME IS NULL:2013/01/04(金) 07:24:37.51 ID:???
統計情報
ってググっても統計情報を取得して〜とか統計情報を利用して〜
とかそんなようなことしか書いてないんだけど
具体的に説明すると何なん?
データの格納情報とかそういう意味?
466NAME IS NULL:2013/01/04(金) 08:15:40.39 ID:???
>>454
正規化とかいうならば、

GameTable
---------------
GameID | Game

MapTable
------------------------
MapID | GameID | Map

MonsterTable
-----------------------------
MonsterID | MapID | Monster

ではないかな。
467NAME IS NULL:2013/01/04(金) 09:01:28.15 ID:???
>>464
たとえばこんなんとか
select T1.id,
    T1.data
from  TableName T1
    inner join
    TableName T2
    on T1.data = T2.data
where  T1.id in (1, 2)
and   T2.id in (1, 2)
and   T1.id <> T2.id
;

>>465
データのサイズ(レコード数、レコード長など)と
カーディナリティ(データのばらけ具合)が基本
DBMSによってはさらに詳細な情報をとったりするし
とるかどうか選べたりもする
468NAME IS NULL:2013/01/04(金) 09:21:04.26 ID:BAIPs7Pp
  ●●●ケネディ大統領は何故、死なねばならなかったのか?●●●
  http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1226114724/53

  ¥¥¥¥¥¥¥『万有サロン』書き込み大賞・総額100万円¥¥¥¥¥¥¥¥¥¥¥¥

  この掲示板に優秀な書き込みをして、総額100万円の賞金をゲットしよう!(*^^)v
    万有サロン
      http://jbbs.livedoor.jp/study/3729/
    書き込み大賞の詳細
      http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1069922074/78-
    書き込み大賞の詳細(資料倉庫内)
      http://www2.tba.t-com.ne.jp/a-z/omake/banyu/taisho.htm

  また、あらゆる疑問に関する質問を、携帯電話やメールでも受け付けています。
    電話番号 080-4437-4187
    メール  [email protected]

  ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
469462:2013/01/04(金) 15:40:47.93 ID:???
>>467
ありがとうございます、解決しました
TableNameとT1,T2の意味がわかりませんでしたが参考にして少し編集し、fromにサブクエリで
id=1の表(T1)inner join id=2の表(T2) on T1.data=T2.dataでwhere句は何も書かずにできました
出てくるデータの形が望んでいた形式じゃありませんでしたがプログラム側で簡単です。
470NAME IS NULL:2013/01/06(日) 22:40:55.67 ID:???
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。

これを一括で
Taro, Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。
471NAME IS NULL:2013/01/06(日) 22:43:00.56 ID:???
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。

これを一括で
Taro Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。
472NAME IS NULL:2013/01/06(日) 22:45:23.52 ID:???
substr使えよ。
多分mysqlにもあるだろう。
473NAME IS NULL:2013/01/06(日) 22:52:23.08 ID:???
>>472
substr使いこなせてません。。
474NAME IS NULL:2013/01/06(日) 23:35:49.79 ID:???
t-sqlでselectで時間のかかる処理を
一定時間でエラーさせたいのですが
どうすればいいのでしょうか?
475NAME IS NULL:2013/01/07(月) 05:20:28.57 ID:???
3割はhanako, yamadaで入っているのか?
476NAME IS NULL:2013/01/07(月) 09:47:58.77 ID:???
Taro という苗字が無いなどと
どうして言えるんだ
477NAME IS NULL:2013/01/07(月) 10:12:19.71 ID:???
カンマが入ってるものは全て逆順、ということなの?
478NAME IS NULL:2013/01/07(月) 18:27:41.00 ID:???
MySQL5.1
・テーブルデータ
table1
name value
--------------------
aaa a
aaa b
aaa c
bbb b
bbb c
ccc a
ccc c

・欲しい結果
bbb

table1から、valueにaが無いnameを抽出したいです。
お願いします。
479NAME IS NULL:2013/01/07(月) 19:25:18.06 ID:???
select name from table1
where name not in (select distinct name from table1 where value='a');
480NAME IS NULL:2013/01/07(月) 19:28:23.37 ID:???
>>479
ありがとうございます!
481NAME IS NULL:2013/01/09(水) 17:15:28.84 ID:??? BE:724294962-2BP(0)
幾つかフィールドを持つ検索UI作ってるんだけど、各々のフィールドに入れた値によって他のポップアップに出てくる値を絞りたいんだけど、
そう言うのって普通どうしてますか?
482NAME IS NULL:2013/01/09(水) 17:41:48.60 ID:???
何の話?
何とかSQL、とかの製品名の話なら専用スレでどうぞ。
483NAME IS NULL:2013/01/09(水) 18:48:20.55 ID:???
っていうかアプリ側の話だろうに。
484NAME IS NULL:2013/01/09(水) 21:41:17.50 ID:???
>>481
全部持ってきて随時ゴリゴリするか、データ構造を工夫するか、毎回持ってくるか状況によるけど
次からスレ違いしないでね
485481:2013/01/10(木) 11:01:05.94 ID:??? BE:2112526875-2BP(0)
ありがとさんです。
sqlでwhereなしに全部持ってきて、後は配列操作で何とかするのが王道ですか。
検索フィールドの項目を選択する毎にwhereで条件追加とかするのかと思ってました。
486NAME IS NULL:2013/01/10(木) 17:14:29.95 ID:???
話通じてないし
487NAME IS NULL:2013/01/10(木) 17:15:29.42 ID:???
ワロタ
488NAME IS NULL:2013/01/14(月) 15:21:55.19 ID:2FyNVYyH
パワハラ犯罪にたいする刑事罰(※本投稿のコピペ歓迎です)
人事原則
1 現行法では、社員が仕事を怠けたり、能力不足、就業規則違反、目標を達成できなくても解雇をしたり叱責することは違法です。どんな駄目社員、嘘つき社員、怠け者も定年まで解雇が違法なのが現行の正社員制度です。
2 パワハラは社風にあわない社員、成績の振るわない社員を自主退職に追い込む言わば人事的措置として用いられることが多い。
※違法な解雇の和解金相場は、労働審判で3ヶ月、通常裁判で1年以上の報酬、さらに社員が和解を拒めば復職が可能です。弁護士への着手金は12〜15万円+20%の和解金、和解拒否なら20〜50万円程度。

人事部・ホットライン・御用組合へ直訴
メリット: 一時的緩和や人事異動
デメリット: 役員へ情報筒抜け、危険分子の烙印(情報漏洩がホットライン直訴者に多いのは人事部の常識)、パワハラ放置で自主退職に追い込まれる

民事訴訟・調停(労働審判)
メリット: 損害賠償
デメリット: 裁判費用、解雇措置、民事不介入で刑事事案化を阻止、長期係争、パワハラ上司の継続雇用

刑事告訴
メリット: 1パワハラ上司の解雇・懲戒、または2多額の和解金、1と2どちらでも被害者の雇用は維持
デメリット: 人事異動(出世コースから外れる)
◎録音は一方の当事者が取る限り合法です。※加害者に録音の同意を求める必要はありません。
◎告訴受理後の和解金は加害者の資産・収入に応じて変えてください。犯罪者の昨年の年収の半額程度×最大懲役年数が妥当です。
◎パワハラの被害についての告訴は1侮辱罪2脅迫罪3強要罪4威力業務妨害罪5傷害罪の順序で行ってください。警察・検察の協力(犯罪者の自宅・職場の強制捜査、留置所勾留)により罪の立証が楽になります。
◎刑事告訴した社員を解雇したり処遇面で著しい差別を行うことはないでしょうが、出世や管理職以上の昇進の可能性はあきらめるべきでしょう。
◎刑事告訴は民事訴訟と違って裁判による被害者への2次被害にありません。検察庁が被害者に代わって訴えをおこすので、無料で、時間と手間も告訴状をかくことと音声録音を残すだけです。
◎和解契約(公正証書・即決和解)では告訴した事実は秘匿事項となります。犯罪者が秘密保持契約を違反した場合の損害賠償金は、最低5000万円〜にしましょう。
489NAME IS NULL:2013/01/14(月) 18:52:14.16 ID:???
>>488
どういう処理がしたいのか書いてくれ
490NAME IS NULL:2013/01/14(月) 21:48:48.88 ID:???
SQL SERVER2012です。

列1をaとbで検索して
新しく列2,列3を作成。
列2にaの値を
列3にbの値を表示することが
可能ならばやり方を教えてもらえませんでしょうか。

列1
a
b
a
b
c

求めたい結果
列2 列3
a b
a b

宜しくお願いします。
491NAME IS NULL:2013/01/14(月) 22:02:59.52 ID:???
>>490
別の行のデータを同じ行に表示したいなら
どの行とどの行をどういう条件で同じ行にするのか
を決める必要がある
492NAME IS NULL:2013/01/14(月) 22:45:15.23 ID:???
>>491
どういう条件で同じ行にするのか決めるとは

こんな感じでしょうか。
元のデータに列0を追加

列0 列1
1 a
2 b
2 a
1 b
2 c

求めたい結果
列0 列2 列3
1 a b
2 a b
493NAME IS NULL:2013/01/14(月) 22:58:13.13 ID:???
>>492
じゃあさらにこういうデータだったらどういう結果がほしいのか

列0 列1
1 a
2 b
2 a
1 b
2 c
1 a
3 a
494NAME IS NULL:2013/01/14(月) 23:19:58.45 ID:???
ついでに、以下ならどういう結果がほしいんだ?

列0 列1
1 a
2 a
1 b
2 c
495NAME IS NULL:2013/01/15(火) 03:32:54.87 ID:???
何がしたいか全くわからん
aとかbとかってのは、実際には何らかの値が入ってるのか?
だったらaとかbで検索って、検索する値はどっからもってくるんだ?

この説明だと select a,b で良いんじゃねえのかと思うぞ
496NAME IS NULL:2013/01/15(火) 07:55:17.47 ID:???
>>491-495
色々すみません。
おっしゃる通り質問の仕方が変でした。

元のデータ
登録年月
2011/04
2011/04
2011/05
2011/05
2012/04
2012/05
2012/05

自分のできるやり方
SELECT
登録年月,COUNT(1) AS 件数
FROM DB
WHERE 登録年月 IN ('2011/04','2011/05','2012/04','2012/05')
GROUP BY 登録年月

↑から求められる結果
登録年度件数
2011/04 2
2011/05 2
2012/04 1
2012/05 2

実際に求めたい結果は
月度  2011年度  2012年度
04月  2      1
05月  2      2
何度も済みませんがよろしくお願いします。
497NAME IS NULL:2013/01/15(火) 08:03:09.59 ID:???
498NAME IS NULL:2013/01/15(火) 09:41:42.48 ID:???
>>497 ありがとうございます。
>>5 見てませんでしたすみません。

SQL文
SELECT 登録年月,
SUM(CASE WHEN 登録年月 > '2012/03' AND 登録年月 < '2012/05' THEN 1 END) AS '12年度',
SUM(CASE WHEN 登録年月 > '2011/03' AND 登録年月 < '2011/05' THEN 1 END) AS '11年度'
FROM DB
GROUP BY 登録年月
ORDER BY 登録年月

得られた結果
年度12年度11年度
2011/04NULL2
2011/05NULL1
2012/041NULL
2012/052NULL

これをSQLで、下のようにまとめることは可能でしょうか。
月度  2011年度  2012年度
04月  2      1
05月  2      2

年で別れてしまっている行を
月だけでまとめたいのですが。
499NAME IS NULL:2013/01/15(火) 10:43:31.48 ID:???
500NAME IS NULL:2013/01/16(水) 22:08:12.22 ID:7bZDmpX4
>>498
取り出すための単純なデータに分解する事が大事

SELECT
SUBSTRING(INS_YM,1,4) as INS_Y,
SUBSTRING(INS_YM,6,2) as INS_M
FROM
INS_YM_TABLE

これをもとに月別の年の集計をすればいいわけだから

SELECT
INS_M,
SUM(CASE WHEN INS_Y = '2011' THEN 1 ELSE 0 END) as SUM_2011,
SUM(CASE WHEN INS_Y = '2012' THEN 1 ELSE 0 END) as SUM_2012
FROM
(
SELECT
SUBSTRING(INS_YM,1,4) as INS_Y,
SUBSTRING(INS_YM,6,2) as INS_M
FROM
INS_YM_TABLE
) as SUM_TABLE
GROUP BY
INS_M
ORDER BY
INS_M

でいいのでは
501NAME IS NULL:2013/01/16(水) 22:08:48.39 ID:7bZDmpX4
年月が別の型ならそれをふまえてね
502NAME IS NULL:2013/01/17(木) 05:43:23.12 ID:???
■DBMS
SQL Server 2012

■テーブル構造
TABLE A
項目1 項目2 項目3 項目4 商品コード 金額

TABLE B
商品コード 分類
(TABLE AとBは商品コードでJOIN)

■欲しい結果
TABLE Bにある分類毎の、TABLE Aの金額とTABLE Aの件数
ただし、件数は項目1、項目2、項目3の重複を除いたもの
(金額は単純合計でいいが、件数は項目1〜3が同じレコードは1件としてカウントしたい)


金額だけであれば分類でGROUP BYすればいいだけですが、
同時に上記の条件で件数を出そうとするとどうしたらいいか分かりません。
よろしくお願いします
503NAME IS NULL:2013/01/17(木) 07:56:53.99 ID:???
>>502
まずテーブルAのgroupbyで金額のsumと件数1を返すクエリを作って、それとテーブルBを結合すればいいのでは
504NAME IS NULL:2013/01/17(木) 12:01:41.50 ID:???
>>500
すごい勉強になりました。
有難うございました。
505NAME IS NULL:2013/01/17(木) 15:53:02.51 ID:???
>>504
即レスしてくれた>>499はスルーなのね。
506NAME IS NULL:2013/01/17(木) 19:28:00.65 ID:???
>>502
多分こんな感じで
WITH
AB AS (SELECT A.*,B.分類 FROM A JOIN B ON A.商品コード=B.商品コード),
BS AS (SELECT DISTINCT 分類,項目1,項目2,項目3 FROM AB)
SELECT DISTINCT
分類,
(SELECT SUM(金額) FROM AB WHERE 分類=B.分類) AS 金額合計,
(SELECT COUNT(*) FROM BS WHERE 分類=B.分類) AS 件数
FROM B
507NAME IS NULL:2013/01/17(木) 19:55:25.20 ID:Q5aJSjp6
>>505
質問の答えじゃなくヒント程度なんだから
そこから答えが導けないならスルーされてもしょうがないんでは
レスが欲しいなら欲しいなりの回答したほうがいいかと
508NAME IS NULL:2013/01/17(木) 19:59:38.38 ID:EwS78HY0
パワハラ犯罪にたいする刑事罰(※本投稿のコピペ歓迎です)
人事原則
1 現行法では、社員が仕事を怠けたり、能力不足、就業規則違反、目標を達成できなくても解雇をしたり叱責することは違法です。どんな駄目社員、嘘つき社員、怠け者も定年まで解雇が違法なのが現行の正社員制度です。
2 パワハラは社風にあわない社員、成績の振るわない社員を自主退職に追い込む言わば人事的措置として用いられることが多い。
※違法な解雇の和解金相場は、労働審判で3ヶ月、通常裁判で1年以上の報酬、さらに社員が和解を拒めば復職が可能です。弁護士への着手金は12〜15万円、和解拒否なら20〜50万円程度。

人事部・ホットライン・御用組合へ直訴
メリット: 一時的緩和や人事異動
デメリット: 役員へ情報筒抜け、危険分子の烙印(情報漏洩がホットライン直訴者に多いのは人事部の常識)、パワハラ放置で自主退職に追い込まれる

民事訴訟・調停・労働審判
メリット: 損害賠償
デメリット: 裁判費用、解雇措置、民事不介入で刑事事案化を阻止、長期係争、パワハラ上司の継続雇用

刑事告訴
メリット: 1パワハラ上司の解雇・懲戒、または2多額の和解金、1と2どちらでも被害者の雇用は維持
デメリット: 人事異動(出世コースから外れる)
◎録音は一方の当事者が取る限り合法です。※加害者に録音の同意を求める必要はありません。
◎告訴受理後の和解金は加害者の資産・収入に応じて変えてください。犯罪者の昨年の年収の半額程度×最大懲役年数が妥当です。
◎パワハラの被害についての告訴は1侮辱罪2脅迫罪3強要罪4威力業務妨害罪5傷害罪の順序で行ってください。警察・検察の協力(犯罪者の自宅・職場の強制捜査、留置所勾留)により罪の立証が楽になります。
◎刑事告訴した社員を解雇したり処遇面で著しい差別を行うことはないでしょうが、出世や管理職以上の昇進の可能性はあきらめるべきでしょう。
◎刑事告訴は民事訴訟と違って裁判による被害者への2次被害にありません。検察庁が被害者に代わって訴えをおこすので、無料で、時間と手間も告訴状をかくことと音声録音を残すだけです。
◎和解契約(公正証書・即決和解)では告訴した事実は秘匿事項となります。犯罪者が秘密保持契約を違反した場合の損害賠償金は、最低5000万円〜にしましょう。
509NAME IS NULL:2013/01/17(木) 21:09:44.32 ID:Q5aJSjp6
>>502
こんな結果か?

SELECT
テーブルB.分類,
SUM(テーブルA2.金額合計1) as 金額合計2,
SUM(テーブルA2.件数1) as 件数2
FROM
テーブルB
INNER JOIN
(
SELECT
項目1,
項目2,
項目3,
商品コード,
SUM(金額) as 金額合計1,
1 as 件数1
FROM
テーブルA
GROUP BY
項目1,
項目2,
項目3,
商品コード
) as テーブルA2
ONテーブルA2.商品コード = テーブルB.商品コード
GROUP BY
テーブルB.分類
ORDER BY
テーブルB.分類
510NAME IS NULL:2013/01/17(木) 22:37:18.46 ID:IiOhCqTn
T-Sql使ってます
複数の会社へ順番に接続して
DOSバッチからクエリ動かして結果を収集してるのですが
通信や処理が重くて、時間かかる所があります
一分ぐらいで取得不可なら次の会社へとするようにする方法は無いでしょうか?
511NAME IS NULL:2013/01/17(木) 22:42:22.62 ID:???
1分で取得不可なら飛ばしていいようなどんな情報を収集しているのか聞かないと
答える気にもならない
512NAME IS NULL:2013/01/17(木) 22:49:45.29 ID:???
スレ違い。
513NAME IS NULL:2013/01/17(木) 23:19:18.45 ID:???
>>511
会社の売り上げとかです
大きなデータではないです
一分は例えばの話です
514NAME IS NULL:2013/01/17(木) 23:27:11.81 ID:???
>>510
接続タイムアウトクエリタイムアウト通信タイムアウトあたりの設定を見直せばいいんじゃないかな。
515NAME IS NULL:2013/01/18(金) 06:28:12.47 ID:???
SQLと関係あるのか?w
516502:2013/01/18(金) 07:01:14.79 ID:???
>>503,506,509
ありがとうございます。
急な出張に出ることになってしまい
実際にクエリをまわせるのが週末になってしまいそうですが
確認でき次第、再度ご報告しますね
517NAME IS NULL:2013/01/18(金) 10:18:01.01 ID:???
>>515
ついでに誘導してあげたらいいのに
518NAME IS NULL:2013/01/19(土) 00:53:28.66 ID:???
報告とかいらんから。スレ違いなんで、↓に行け。

Microsoft SQL Server 総合スレ 9
http://toro.2ch.net/test/read.cgi/db/1310645522/
519NAME IS NULL:2013/01/22(火) 12:15:36.71 ID:AhVjLGTW
DB MySQL5.1

classテーブル
id gakunen class
1 1 1
2 2 2
3 2 1
4 1 2

seitoテーブル
id class_id namae tokuten
1 1 tanaka 90
2 2 maeda 95
3 3 aoki 70
4 4 suzuki 65
5 4 ikeda 70
6 3 furuta 65
7 2 katou 85
8 1 kimura 95
9 3 satou 60

gakunen class namae tokuten
1 1 kimura 95
1 2 ikeda 70
2 1 aoki 70
2 2 maeda 95
1 1 tanaka 90
1 2 suzuki 65
2 1 furuta 65
2 2 katou 85
2 1 satou 60

クラステーブルと生徒テーブルがあって
1年1組の得点1位、1年2組の得点1位、2年1組の得点1位、2年2組の得点1位、
1年1組の得点2位、1年2組の得点2位、2年1組の得点2位、2年2組の得点2位、
1年1組の得点3位・・・
というふうに学年クラス順に順位の高い生徒を並べ替えたいです
よろしくお願いします
520NAME IS NULL:2013/01/22(火) 14:25:24.79 ID:???
漠然とした一般的な話なんですが、インデックスに関して教えて下さい
例として販売データテーブルがあったとします。
そして、PKが商品コード、販売日、担当者コードとして、この時、商品コード単体で
検索をする時に商品コードだけにインデックスを設定すれば、その効果が
ある…と考えて良いんですか?
521NAME IS NULL:2013/01/22(火) 14:50:24.72 ID:???
>>519
MySQLだと一旦クラス内での順位をつけてから自己結合かなぁ。
あと、別に縦を横にしたいわけじゃないよね?

>>520
よく分からない。インデックスを作成しなければインデックスの効果は得られないよ。
商品コードを含んでいるPKがインデックスの代替になるかということであれば、RDBMS次第
522NAME IS NULL:2013/01/22(火) 15:06:51.32 ID:???
520です。
>>521さん、ありがと。
もう少し勉強しますm(__)m
523NAME IS NULL:2013/01/22(火) 16:23:50.05 ID:???
>>519
ずいぶん不思議なテーブル設計してるな。
正規化したつもりになって出来てない感じか?

・ なぜ namae と tokuten が2か所出てくるんだ?
・ 生徒テーブルに得点入れるのは違わないか?
・ 他に教科テーブル、得点テーブルが必要になるんじゃないか?
 → 名無しのテーブルは得点テーブルなのか?
・ tokuten は学年に関係なく同じ尺度で測れるものなのか?
 → でないとしたら、classテーブルで学年をごちゃまぜにする必然性はない。

というか学校の宿題かなにかか?
写し間違いじゃないとしたらこんなちんけな問題作る講師に文句を言ってやれ。
写し間違いだったら正確に書き直してみな。気のりしたら相手してやる。
実用品として考えてるとしたら、顔を洗って出直せレベルだな。
その場合でもそう書いてくれれば、気のりしたら相手してやる。

とりあえず、テーブル名が書いてない最後のテーブルだけあれば抽出できる。

SELECT
(SELECT count(*)+1 FROM 名前不明のテーブル AS t11l WHERE t11l.tokuten>t11.tokuten ) AS jyuni,
gakunen, class, namae, tokuten FROM 名前不明のテーブル AS t11
WHERE gakunen=1 AND class=1 ORDER BY tokuten;

※ t11 は 1-1のテーブルの意味で仮につけた名前。 t11lはローカル(内部だけ)で使うヤツの意味

単にクラス毎を縦に並べるだけなら、UNIONで全クラス分並べればいい。

順位でJOINすればおまいさんの書いた表(?)の様に出せるが、クラスの人数が不揃いだとまともに出ないだろう。
最大クラス人数導いて、その分順位番号並べるクエリ用意して、それに LEFT JOIN させりゃインジャネ?
524NAME IS NULL:2013/01/22(火) 18:28:28.70 ID:???
>>523
ツッコミまち?

3つめは彼なりに結合抽出した結果だと思うんだけどな。

> ・ なぜ namae と tokuten が2か所出てくるんだ?
→元テーブルと抽出結果なので。
> ・ 生徒テーブルに得点入れるのは違わないか?
→現仕様では十分正規化されたものかもしれない。
> ・ 他に教科テーブル、得点テーブルが必要になるんじゃないか?
→上に同じ。
>  → 名無しのテーブルは得点テーブルなのか?
→結合結果に見える。
> ・ tokuten は学年に関係なく同じ尺度で測れるものなのか?
→求めたい結果は学年、クラスごとに1位から順番に表示。尺度が学年に関係するかどうかは結論に影響しない。
>  → でないとしたら、classテーブルで学年をごちゃまぜにする必然性はない。
→サロゲートキーが欲しかった(または練習した)だけかもしれない。

> 気のりしたら相手してやる。
→気のりしたら他にもつっこんでやる。
525524:2013/01/22(火) 18:30:15.67 ID:???
ああ恥ずかしい。
結合抽出した結果じゃなくて、単に求める結果だな。ごめんごめん。
526NAME IS NULL:2013/01/22(火) 19:08:42.47 ID:???
求める結果の割に得点順にもクラス順にもなってないのはなぜ?
527519:2013/01/22(火) 20:09:13.55 ID:???
書き方が悪く伝わらなかったみたいですみません。
524さんの言うとおり一番下のテーブルみたいなのはテーブルじゃなくほしい結果です。

クラステーブルがごちゃ混ぜになってるのは
今似たようなのに困ってて
学校として簡素化?して仮に作ってみたからです。

実際困ってるのはclassテーブルが5000行くらいあってseitoテーブルが10万行くらいあります。
現状自分も523さんみたいに生徒の順位をふっていってるんですが重くなりすぎてまともに動かなくなってきたので
質問しました。

よろしければお願いします。
528NAME IS NULL:2013/01/22(火) 20:40:21.61 ID:???
やりたいことは分かるがなんでこれが必要なのかがわからん
それと例えば1-1が3行あって1-2が4行あったら1-1の学年4位の行はどうなるんだ?NULLで補完されないと駄目なのか?
529NAME IS NULL:2013/01/22(火) 20:58:51.29 ID:???
SQLの中だけでやろうとすると大変だけど、
外部のプログラムに渡してソートさせたらどうだろう?
530NAME IS NULL:2013/01/22(火) 21:15:07.50 ID:???
>>527
1回で扱うデータ量が多いから遅くなる。

生徒テーブルをクラスIDで切り分けたVIEWを作って、それを元にSQL書いてみ。

それ以上の高速化をする場合はDBエンジンのチューニングとか・・・。
531NAME IS NULL:2013/01/22(火) 21:15:28.34 ID:???
>>527
select
gakunen, class, namae, tokuten,
(select count(*) + 1 from seito as seito_sub where seito_main.class_id = seito_sub.class_id and seito_sub.tokuten > seito_main.tokuten) as rank
from seito as seito_main join class on (seito_main.class_id = class.id)
order by rank, gakunen, class;

同点の生徒がいたときの回避はしてない。

遅いなら、抽出時に毎回算出するのではなくて、
定期的にバッチで順位をつけるようにはできない?

>>528
縦を横にする必要はないみたいだよ。
532NAME IS NULL:2013/01/22(火) 21:38:57.25 ID:???
お前らselect文よく思いつくね
俺は有名どころからコピペしてきて改変作業しかしないから
1から作ることが出来ない
533NAME IS NULL:2013/01/22(火) 21:47:04.34 ID:???
普通の手続き型言語とは思考方法がちょっと違うからね

select句にサブクエリ書いてるような人は手続き型言語の思考から
抜け出せてないんだろうなあと思う
534NAME IS NULL:2013/01/22(火) 21:48:04.67 ID:???
考える前に検索して終わらす病だな
それを続けてるといつかDCや客先の隔離施設で自分の無能を痛感することになる
535NAME IS NULL:2013/01/22(火) 21:57:26.86 ID:???
>>533
抜け出すとどんな感じに書くようになるのか書かないなら>>523にも劣るぜ
536NAME IS NULL:2013/01/22(火) 22:29:45.51 ID:???
>>527
同じクラスに同点の生徒がいたらその場合の規則は?
それによってみんなのSQLなんて全部だめだろ

そもそもこんなデータ構造をむりやり1回のSQLで
問い合わせても満足な速度はむりだと思うぞ
その辺は気にしないのか?
537NAME IS NULL:2013/01/23(水) 02:10:25.39 ID:???
SQLite 3.7.7.1 を PDO で操作しています。
以下ようなテーブルがあった場合にそれぞれのarticle_idのcomment_idをカウントするのはどのようなSQLを書いたら良いのでしょうか。

article_idを指定して一件だけ取り出す場合は、SELECT文にCOUNT(comments.comment_id) as comment_countのようにしてWHERE句でarticle_idを指定すれば取得できたのですが、全件の取得する場合が思うような結果が得られず困っております。。

■ このような結果が欲しいです
article_id   comment_count
---------------------------
1       1
2       0
3       2
4       0
5       2

■ articles
article_id   content
---------------------------
1       hoge
2       hoge
3       hoge
4       hoge
5       hoge

■ comments
comment_id   article_id
---------------------------
1       5
2       3
3       3
4       1
5       5
538NAME IS NULL:2013/01/23(水) 02:24:25.65 ID:???
>>537
select article_id, count(*) as comment_count
from articles left join comments on (articles.article_id = comments.article_id)
group by articles.article_id;
539NAME IS NULL:2013/01/23(水) 02:35:49.85 ID:???
>>538
ありがとうございます!いけました!
GROUP BYを使うのですね・・基礎的なことがごっそり抜けていることが分かりました。
もっと勉強せねば。
本当にありがとうございました!
540527:2013/01/23(水) 09:25:09.52 ID:CISRUOZX
色々回答ありがとうございます。
設計が間違ってたんですかね。
バッチで順位付けやビューですが、生徒テーブルには男女や親の年収やら補導歴やらいろんなのがついてて
WHERE 男で親の年収500万以上で補導歴なしみたいなことにもなるので無理なんです。
設計からやり直してみます。
541NAME IS NULL:2013/01/23(水) 11:03:11.67 ID:???
>>540
得点にインデックスをつける
クラス毎のビューを用意する(5000行あるなら、スクリプトか何かでやるしかないだろうなぁ)
並べ替えはSQLでやるけど、順位の番号は読みだしてから手続き言語でやる

でやってみれば構造を大幅に変えることなく動作がマシになると思われ。

そもそも学校に例えてるのがおまいさんの思い込みであって実際のモデルとかけ離れてる気がしないでもない。
実際の学校だとしたら、5000クラスもないし、生徒テーブルに得点入れたりしないだろうし。
542NAME IS NULL:2013/01/23(水) 15:52:32.88 ID:???
作るメリットがまるでないビューを5000個作れとか拷問だろ。

>>540
なんか改善できそうな気はするけどね。
>>531のクエリは運用に耐えられる速度じゃなかったってことかな。
543NAME IS NULL:2013/01/23(水) 17:50:52.56 ID:???
>>527によると、>>523と同じような方法(多分>>531みたいな方法)で遅すぎて使えないと言ってるんだろ?
MySQLはVIEWをキャッシュしてくれるはずだから、

CREATE OR REPLACE VIEW view_seito11 AS
SELECT class_local.gakunen, class_local.class, seito_local.name, seito_local.tokuten
FROM seito AS seito_local INNER JOIN
(SELECT * FROM class WHERE gakunen=1 AND class=1) AS class_local
ON (seito_local.class_id = class_local.class_id);

SELECT gakunen, class,
(SELECT COUNT(*)+1 FROM view_seito11 AS vseito_local WHERE vseito_global.tokuten < vseito_local.tokuten) AS juni
name, tokuten
FROM view_seito11 AS vseito_global
ORDER BY juni;

これでやると、
・ソートやナンバリングの対象になるレコード数が1クラス分に限定される
 (単純に10万÷5000とは行かないだろうけど、10万件全部を相手にするよりは...)
・順位用サブクエリとメインのクエリのFROMで同じ処理を2回やる必要がなくなる
 (キャッシュされるから両方で同じ結果が使われる)
で高速化されるはず。
ビュー切らずにFROMにサブクエリで書くことも出来るけど、キャッシュされるかどうか不明。

・集計・ソートは対象をブロックに分けた方が動作が速い。
・複数回使う絞り込み条件はDBエンジンにキャッシュさせると動作が速い。
ビューは必要な時に外部スクリプトから作ればいいんだし、何の問題もないと思うが。
(view名の部分と gakunen= と class= を外部スクリプトで書き換えて実行。)
544NAME IS NULL:2013/01/23(水) 19:20:48.60 ID:???
1クラスずつやるのなら、クラスごとのインデックスが効けば大差ないと思うが
質問者はまずちゃんとインデックス張ってるのかから確認せんといかんレベルだろ
545NAME IS NULL:2013/01/23(水) 20:14:20.76 ID:XLyIL2Lt
>>541
得点にインデックスなんて無駄
そんなインデックスつけても要件を満たしていない
546NAME IS NULL:2013/01/23(水) 20:19:41.83 ID:???
>>543
SELECT class_local.gakunen, class_local.class, seito_local.name, seito_local.tokuten
FROM seito AS seito_local INNER JOIN
(SELECT * FROM class WHERE gakunen=1 AND class=1) AS class_local
ON (seito_local.class_id = class_local.class_id);
って
select gakunen, class, name, tokuten
from seito join class using (class_id)
where gakunen=1 and class=1;
よりもいいの?

サブクエリの結果が絞られてJOINのコストが、とか言い出したら末期だけど、
他の理由があるのなら知りたい。
547NAME IS NULL:2013/01/23(水) 20:58:01.08 ID:???
>>546
ほかのDBエンジンに移植した時に動くようにじゃね?
SQLSERVERとかJETじゃ動かないんだったと思うけど。<using
548NAME IS NULL:2013/01/23(水) 21:13:59.85 ID:???
>>527
ちなみにだけど、速度要件はどれくらい?
postgresqlで申し訳ないんだけど、初期core i7環境で試したら30秒くらいだった。

>>547
mysqlでusingは使えるようだよ。
というか、問題視したのはそこじゃなかったんだけど余計なことしちゃったな。
549NAME IS NULL:2013/01/23(水) 21:57:17.02 ID:???
>>548
何が(どのSQL)が30秒なの?
550NAME IS NULL:2013/01/23(水) 22:58:49.24 ID:???
最終的に10万行全部を出力するんだよね?
551527:2013/01/24(木) 05:27:12.91 ID:???
学校に例えたのが悪かったみたいですね

それとVIEWを勘違いしてました
元テーブルが更新されるとビューも更新されるんですね
とりあえずクラスと生徒を結合したVIEWでやってみます

速度要件ですが特にないです
昔は速かったのがだんだん遅くなってきたのでどうにかしたいと思ってました

あと表示件数ですがマックス50件でページングしてます。

色々ありがとうございました
552527:2013/01/24(木) 05:39:01.92 ID:???
あと同一順位は無視して現状は
SET @N=0,@S=0;
SELECT
gakunen,class,namae,tokuten,number
FROM
(SELECT
@N:=IF(@S=seito.class_id,@N+1,1) AS number
,@S:=seito.class_id
,seito.tokuten
,class.gakunen
,class.class
,seito.namae
FROM
(SELECT seito2.namae,seito2.class_id,seito2.tokuten FROM seito seito2 ORDER BY tokuten DESC) AS seito,class
WHERE
seito.class_id = class.id
) AS tmp
ORDER BY
number,gakunen,class

こんな風に書いてます。
553NAME IS NULL:2013/01/24(木) 05:47:13.37 ID:???
今時のマシンで10万件程度で30秒もかかるかと思って、ちょっとSQLServerで実験してみたが
>>531のSQLとか、Core2Duoのマシンでも2秒で終わるぞ
まあ実際のレコードサイズとか学年とかクラスのばらけ具合で多少の差は出るかもしれんが
それより10万件のテストデータつくる時間が超暇だったぜ
554NAME IS NULL:2013/01/24(木) 05:57:32.68 ID:???
>>552
こういうのみると、MySQLはRDBMS名乗るなと思いたくなるな
555NAME IS NULL:2013/01/24(木) 15:00:43.68 ID:???
>>553
連番生成してくれる機能がないRDBMSの場合は連番テーブルを作っとくと何かと便利かもね
(>>8が関連するかも)
556NAME IS NULL:2013/01/24(木) 21:38:09.56 ID:07BNynAu
途中でレスしてるのを見てのると実際は「条件が実際は複雑」「結合してるものがもっとある」
「取り出してる情報が多い」ってのがあれば遅くなるってのも普通だろ
あそこまでいっていればSQLだけでなく、他の部分も含めての改良をしない限りは
改善できないと思うね

まあ10万件を2秒で終わるのはすげーと思ったわ
描画なり、出力なりでもそんな訳ないんじゃねと
557NAME IS NULL:2013/01/24(木) 23:50:59.97 ID:???
一画面分だけ処理して表示してるのを終わったと思ってるの鴨。
558NAME IS NULL:2013/01/25(金) 01:53:21.21 ID:???
10万件ったって、1レコード10バイトなら1メガバイトだからな
>>548がどんな風にやったか知らんが、与えられた条件(>>519のレイアウトで
>>531のSQL)で30秒はかかりすぎだと思っただけだ
559NAME IS NULL:2013/01/25(金) 04:08:06.06 ID:???
質問主が現状かかっている時間を書かないのはなんでなんだろね。
速度要件は特にない、遅いから改善したいだけじゃ状況もつかめない
560NAME IS NULL:2013/01/25(金) 05:57:13.72 ID:???
自分はあのシステムは価格比較みたいな情報を
とりたいSQLなんだと思うわ
商品別の安い順で店名と価格とかね
まあどっちにしろSQLの質問であれば
上で回答してるSQLが正解だろうけど
それ以上の改善を求めるなら情報を
もっと出すしかないし、だせないなら
これで終わりな話題でしょ
561NAME IS NULL:2013/01/25(金) 07:58:32.06 ID:???
10万件=100K件なんで、1件が何バイトかにもよるけど、たいした量ではないと思うんだが。
562NAME IS NULL:2013/01/25(金) 10:59:10.72 ID:jbelRchB
t_all
 id/groupType/userId
t_groupA
 id/c1/c2/c3
t_groupB
 id/c1/c2/c3

以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか
かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています

この状況で、t_all.idしかわかっていない時に最短で
t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを
取得するにはどういうクエリ文を書いたら良いでしょうか?

select t_all.groupType, t_all.userId from t_all where t_all.id = $id;
として、その返り値のgroupTypeとuserIdを元にif文で分けてもう一度グループのテーブルにselectをするしかないですか?
よろしくお願いします。環境はmysql5.5です
563NAME IS NULL:2013/01/25(金) 12:13:59.87 ID:???
三つのテーブルを外部結合していっぺんに取ってきて
null の方は捨てる
564NAME IS NULL:2013/01/25(金) 15:56:01.99 ID:???
t_groupA.id と t_groupB.id が重複しない(一意)を前提だとすると・・・
select t_dist.groupType, t_dist.userId , t_groupAB.c1, t_groupAB.c2, t_groupAB.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id ) as t_dist
inner join
(select id, c1, c2, c3 from t_groupA
union
select id, c1, c2, c3 from t_groupB) as t_groupAB
on t_dist.userId = t_groupAB.id;

t_groupA.id と t_groupB.id が重複する場合・・・
select t_dist.groupType, t_dist.userId , t_group.c1, t_group.c2, t_group.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id AND t_all.groupType ='groupA') as t_dist
inner join t_groupA as t_group on t_dist.userId = t_group.id
union
select t_dist.groupType, t_dist.userId , t_group.c1, t_group.c2, t_group.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id AND t_all.groupType ='groupB') as t_dist
inner join t_groupB as t_group on t_dist.userId = t_group.id;

テストはしてないから細かいデバグはお任せする。
MySQL限定な書き方ならもっとヘンタイな最短があるかもしらん。
565NAME IS NULL:2013/01/25(金) 17:35:16.77 ID:???
>>564
一般にunionはコストの高い操作(使うならunion allの方がいい)
それにjoinしてもインデックスは効かないだろうからさらにコストが高い
その方法でやるなら、joinしたものをunion allした方が多分早いから
重複してようがしてまいが下のSQLだけでいいんじゃね
566NAME IS NULL:2013/01/25(金) 17:38:53.74 ID:???
>>562

>>564は慎重な書き方かな。t_groupAとBのレイアウトが同じであるならこんな感じでいいとおもう。
t_distを作るのは、フィルタ条件がサブクエリに閉じた形で見えるのがメリットかな。
select t_all.groupType, t_all.userId, t_groupAB.*
from t_all join
(select * from t_groupA union all select * from t_groupB) as t_groupAB on t_all.userId = t_groupAB.id
where t_all.id = $id

あとこういう方法もあるかなと。
select t_all.groupType, t_all.userId, t_groupA.* from t_all join t_groupA on t_all.userId = t_groupA.id where t_all.id = $id
union all
select t_all.groupType, t_all.userId, t_groupB.* from t_all join t_groupB on t_all.userId = t_groupB.id where t_all.id = $id

これに>>564の後半の懸念を盛り込むとこう
select t_all.groupType, t_all.userId, t_groupA.* from t_all join t_groupA on t_all.userId = t_groupA.id where t_all.groupType = 'groupA' and t_all.id = $id
union all
select t_all.groupType, t_all.userId, t_groupB.* from t_all join t_groupB on t_all.userId = t_groupB.id where t_all.groupType = 'groupB' and t_all.id = $id

>>563のやり方はgroupから取得するカラムが少ない場合に向いていると思う。
クエリはこんな感じ
select t_all.groupType, t_all.userId
, coalesce(t_groupA.c1, t_groupB.c1)
, coalesce(t_groupA.c1, t_groupB.c2)
from t_all join t_groupA on (t_all.userId = t_groupA.id) join t_groupB on (t_all.userId = t_groupB.id)
where t_all.id = $id
567NAME IS NULL:2013/01/25(金) 17:41:55.61 ID:???
ああ、あとfromにサブクエリ書くと、オプティマイザが貧弱なら遅くなるかもしれん
ということで俺がやるならこうかな。試してないけど
select
t_all.*,
t_groupA.*
from
t_all join t_groupA on t_all.userId=t_groupA.id
where t_all.id=$id and t_all.groupType ='groupA'
union all
select
t_all.*,
t_groupB.*
from
t_all join t_groupB on t_all.userId=t_groupB.id
where t_all.id=$id and t_all.groupType ='groupB'

t_allの(id,groupType)に(ユニーク)インデックス張って
t_groupXのidに(ユニーク)インデックス張る
t_all.idの該当件数が少ないならこれが最良だとおもうが
568566:2013/01/25(金) 17:50:22.40 ID:???
>>567
同じクエリ :)
569NAME IS NULL:2013/01/25(金) 18:04:31.80 ID:???
>>567
そのインデックスに効果はなさそうに思う。
570565=567:2013/01/25(金) 18:11:04.06 ID:???
>>568
リロード大事だな
まああれだから、いちゃもんレベルの指摘しとこう
whereで絞る順序はカーディナリ高い奴からってのが基本
まあいまどき順番通りにしかインデックス使えないようなオプティマイザじゃないだろうし
どうせidは主キーだろうから実際はあんまり関係ないんだけど

俺ならこのレイアウトなら(id,groupType)でt_allの主キーにするけど
idのみ主キーなら、groupTypeの検索はwhereじゃなくてonのとこに書く方が好み
571NAME IS NULL:2013/01/25(金) 21:41:47.43 ID:5gQwGGS8
SELECT
T.ID,
T.GROUPTYPE,
T.USERID,
TA.*,
TB.*
FROM
T_ALL as T
LEFT OUTER JOIN T_GROUPA as TA
ONTA.ID = T.USERID AND T.GROUPTYPE = 'A'
LEFT OUTER JOIN T_GROUPB as TB
ONTB.ID = T.USERID AND T.GROUPTYPE = 'B'
WHERE
T.ID = ?


こうじゃねーの?
572571:2013/01/25(金) 22:08:59.00 ID:5gQwGGS8
これでGROUPTYPEみて参照するカラムを分けりゃいいだろ
何か難しくしたいの?
573562:2013/01/25(金) 22:50:25.17 ID:???
素晴らしい方法の数々ありがとうございました
自分の頭の固さや基礎知識の乏しさを痛感しました
勉強してみます、ありがとうございました
574NAME IS NULL:2013/01/25(金) 23:52:13.21 ID:???
>>572
>>566の最後がそんな感じ。
テーブル構成的にgrouptypeを見る必要はないだろうし、そうなってくると、
そもそもcoalesceがいらないよねってことで>>567みたいになる。

別にクエリの複雑さがほとんど変わらない状態で、
>>571のいうようにロジックでループしてもいいんだけどさ。

>>573
がんばれー
575NAME IS NULL:2013/01/26(土) 00:17:11.63 ID:DthSOaAQ
>>574
UNION ALLやサブクエリなんて使う必要ないほど簡単なSQLで可能なのに
なんでそんなことするの?
つか>>566の最後はコピペミスだろうけどjoinじゃ同じ結果にならんだろ

それとgrouptypeなんてデータの分布を考えたらインデックス貼るなんてありえないんじゃね
576NAME IS NULL:2013/01/26(土) 01:05:04.57 ID:???
>>575
groupType単体にインデックス張る効果は多分ほとんどないだろうけど、誰もそうしろとは言ってないだろ

(id,groupType)でインデックスはるとidとgroupType で検索するときに
実データ読まないでインデックスだけで行の有無を判断できるメリットがある
(joinも実データ参照しないでjoinできる)
まあ最終的に戻される行が少ないからあんまり差はでないだろうけど
idがユニークだとは明示されてないし、大量に同じidがあったりしたらまあそれなりの差がでるかも

まあ最短でって希望なんで一般的にもっとも早くなるように色々考えてるけど
実際にはどうでもいいレベルの話
MySQLでどこまで思った通りに動くかもしらんしな
577NAME IS NULL:2013/01/26(土) 02:07:56.85 ID:???
俺の経験ではこんなSQLでUNION使いたがる奴は大抵馬鹿
今回はもとになるテーブルの条件が単一ならば
UNIONを使う必要はまったくないし
サブクエリでUNIONとかありえないレベル
でもこういうSQLを考える奴が多いんだよな世の中w
578NAME IS NULL:2013/01/26(土) 02:39:50.14 ID:???
>>577
どれくらいコストに差がありましたか?
579NAME IS NULL:2013/01/26(土) 06:34:35.86 ID:???
>>578
聞くまでも無く2倍以上の差があるだろ。
UNION使うということは、2回SELECTした上で、その2つの結果をSORTしてるんだぞ。
580NAME IS NULL:2013/01/26(土) 10:04:15.41 ID:???
581NAME IS NULL:2013/01/26(土) 11:09:18.03 ID:vF4LejwG
テーブルAのカラム1が○○またはカラム2が××のデータを取り出すような場合、
どちらかのカラムはインデックスが効かない分遅くなる可能性がある
そういった場合にUNION ALLするのは効果があるだろうが
今回のようなケースではそんな事しても意味がない
UNION信者は悪いやり方を広めないほうがいい
582NAME IS NULL:2013/01/26(土) 11:44:39.64 ID:???
なんだ。エンタープライズ病のオラクル厨か。
583NAME IS NULL:2013/01/26(土) 12:58:30.10 ID:vF4LejwG
俺が今開発で使ってるのはORACLEじゃないが
数十件程度のSQLですぐ結果があるからこれでいいだろみたいなクズは
ORACLEとか使って大量データをこなすSQLは作れないだろうな
全然駄目なSQL作る奴ほど「インデックスが必要です(キリッ)」
「正規化がおかしいんじゃないでしょうか」「データが大量過ぎる;;」とか言い出すわ

そもそもORACLE厨なんてこんなスレにこないだろw
MYSQLみたいなDB使うシステムしかやれない低級PGばかりだと思うが
584NAME IS NULL:2013/01/26(土) 13:06:21.50 ID:???
釣りだよね
585NAME IS NULL:2013/01/26(土) 16:18:50.35 ID:???
割りとマジなんじゃね?

俺なら SQL で自慢とか恥ずかしくてありえないが。
586NAME IS NULL:2013/01/26(土) 16:38:29.03 ID:???
>>571-572
明示されてない要件を自分の都合の良い方に決めれるならそれで良いな
587NAME IS NULL:2013/01/26(土) 20:41:08.28 ID:???
>>583
なんとなく同意。
588NAME IS NULL:2013/01/26(土) 21:45:52.61 ID:V1xUhZOt
>>586
@テーブルは3つ
At_all.groupTypeの値はgroupAまたはgroupBのいずれか
Bt_all.userId は t_groupA.id または t_groupB.id のいずれか
Ct_groupAの全カラムまたはt_groupBの全カラムを取得
Dt_all.idしかわかっていない時(WHEREに指定される条件はt_all.id)

→Aよりt_all.groupTypeの値でt_groupA.id または t_groupB.id のいずれかとJOIN
 (JOINする際にt_all.groupTypeを付与する事で間違ったテーブルと結合させない※無理にやらなくても可)
→Cより欲しい情報はt_groupAの全カラムまたはt_groupB

これから求められるSQLは>>571-572で問題ないんじゃないか
質問者の要件以外に自分勝手に決めた要件があるかい?
589NAME IS NULL:2013/01/26(土) 22:35:42.50 ID:???
明示されていない要件っていってるのに、明示されてる要件だけ上げてどうするんだ

たとえば、取得するのはAまたはBとある
AもBも出して良いのか、AかBのいずれかしか出してはいけないのかは明示されていない
ホストアプリ側でAが該当したのかBが該当したのか関知したくない場合は、両方出して
ホストアプリで判断する仕様にする事が妥当だと言えるか?
そう考えると勝手に両方だして自分で判断しろってのは要件を勝手に決めてるだろ
590NAME IS NULL:2013/01/26(土) 23:08:58.94 ID:???
質問スレで何言っちゃってるんだろ、この人…
591562:2013/01/27(日) 00:36:50.92 ID:???
すみません、あいまいな質問したばかりに
3つのテーブルのidはそれぞれauto_incrementを設定した主キーです
今さらですみません
592NAME IS NULL:2013/01/27(日) 02:15:17.02 ID:???
>>588
>>571-572のクエリだと、ロジックで分岐しなければならないんだけどそこは無視していいの?
>>589が書いてるのもたぶん同じ。

>>566の最後のを直すとこうなるとおもうけど、これならロジックで分岐はしなくていいよね。
select t_all.groupType, t_all.userId
, coalesce(t_groupA.c1, t_groupB.c1)
, coalesce(t_groupB.c1, t_groupB.c2)
from t_all left join t_groupA on (t_all.userId = t_groupA.id) left join t_groupB on (t_all.userId = t_groupB.id)
where t_all.id = $id

で、groupA Bのカラムがたとえば100カラムあったら面倒だし、coalesceのコストがカラム数分増えるよね。

>>567のやりかただと、いらないよね。

まぁ、このレスもt_groupA t_groupBが同じレイアウトであるという前提があるんだけど。
unionを否定している向きもこの前提については疑問を持っていないから、それでいいのかなとおもいつつ。

>>562
わざわざどうも、いろいろ試してみるといいよ
593NAME IS NULL:2013/01/27(日) 04:03:14.46 ID:???
まあ実際のとこ詳しい事は>>562にしかわからん
>>562>>563方式(>>571のSQL)でいいならそれでいいんじゃないか
unionするよりは確かに早いだろう
(それでも2倍も差はでないだろうけど)
594NAME IS NULL:2013/02/02(土) 17:51:27.98 ID:xdgMUmqf
※本投稿の拡散お願い致します。
◯外国労働者を海外から日本の企業での作業(物理的に日本にいる必要はない)に従事させる場合、海外の受注者は派遣業者として登録し派遣法に準拠しなければならない。違反すれば職安法違反となる。

◯事前面接時の会話、テレビ会議、国際電話を通じた日本からの指揮命令・技術指導はICレコーダー・スマホで録音してください。

◯中国・インド・ベトナム・韓国でのアウトソースを標榜しても派遣とみなす作業があれば労働基準法、職業安定法の責任は雇用主=発注者にあります。

◯雇用主とは外注している元請けと下請けを含みます

◯中国人、ベトナム人、インド人、韓国人の方で偽装請負、偽装出向、多重派遣の被害を受けた方は日本の検察に刑事告訴をしてください。

◯国境が違っても顧客=発注者が日本にいれば、日本の法律を適用できますので是非ご活用ください。

◯刑事告訴は無料です。元請けの各役員報酬は数千万円はゆうに超えているでしょうから、
総額で4000万円〜程度の和解金となるでしょう。
和解金の相場は日本の相場に準拠しますので、皆様の国の平均生涯年収を超えることは間違いないでしょう。
595NAME IS NULL:2013/02/02(土) 18:10:25.14 ID:???
民事じゃあるまいし、和解金などあるわけない
596NAME IS NULL:2013/02/02(土) 21:47:17.92 ID:???
ニホンゴデカカレテモワッカリマセーン
597NAME IS NULL:2013/02/03(日) 00:34:45.61 ID:???
You fool HA-HA-HA!
598NAME IS NULL:2013/02/05(火) 15:04:11.07 ID:???
mysql 5.5

テーブル master
tcode
tname
lastdate


daily_data
select tcode,max(tdate) as maxdate
from daily_date
group by tcode;

このdaily_dateから得られるmaxdateを使って
masterのtcodeの対応するlastdateに入れたいのですが、
どのようにupdateを書けば良いのでしょうか?
599NAME IS NULL:2013/02/05(火) 16:06:19.58 ID:???
update master
set lastdate = (
select max(tdate)
from daily_date
where tcode = master.tcode)
じゃね?
mysql知らないけど
600NAME IS NULL:2013/02/05(火) 16:07:23.60 ID:???
上げちった・・・すまん
601598:2013/02/05(火) 16:38:47.29 ID:???
>>599

感謝です!!

一旦
select tcode,max(tdate) as maxdate
from daily_date
group by tcode;
で出したのをループでやっていくかぁと思ってたとこでした^^;
602NAME IS NULL:2013/02/06(水) 15:34:24.97 ID:???
SQL SERVER 2012です。

データベース
番号列1列2
No153
No243


各番号の列1と列2の差を求め

番号差異
No12
No21

得られた差異の平均を求めたい
式:(2+1)/2=1.5

求めたい結果
結果
1.5
この1.5の値を求めたいです。

よろしくお願いします。
603NAME IS NULL:2013/02/06(水) 15:41:50.85 ID:???
select sum(列1)/sum(列2) from TBL;
604NAME IS NULL:2013/02/06(水) 15:44:11.54 ID:???
ごめん よく読んでナカタ

select (sum(列1)-sum(列2))/count(*) from TBL;
605NAME IS NULL:2013/02/06(水) 15:48:52.99 ID:???
>>604
sumの場所間違ってるだろ。

あと、俺は普段Oracle使ってるからSQLServerは詳しくないが、
SQLServerは平均の関数無いのか?

SELECT AVG(ABS(COL1-COL2)) FROM TBL;

ABSも入れといてやったぜ。
606NAME IS NULL:2013/02/06(水) 16:26:43.71 ID:???
素直に
select avg(列1 - 列2) from データベース
で良い気が
607NAME IS NULL:2013/02/06(水) 16:41:28.02 ID:???
「差異」の平均だから、理系の奴はABSを付けるだろうし、
そうじゃない奴はABS無しで済ますんだろうな。
608NAME IS NULL:2013/02/06(水) 16:45:35.29 ID:???
>>605
俺は>>604ではないが
差異が列1と列2の差としか書いてないからなぁ
絶対値とる必要があるなら>>604はちゃんと動かないけど
そうじゃないなら行けるのは行けるんじゃね
sum(a-b)=sum(a)-sum(b)だと思う

問題はNULL絡んだらどうなるかってのがあるけどな
609NAME IS NULL:2013/02/06(水) 16:51:56.73 ID:???
>>607
理系のやつは絶対値とれって明示されてないのでやりませんよ
言外の意味を解釈しないのが理系です
610NAME IS NULL:2013/02/06(水) 18:51:30.80 ID:???
>各番号の列1と列2の差を求め
と書いてあるから、差異は必ずプラスだろ。
各番号の列1から列2を引いた値と書いてあったなら単純にマイナスで良いと思うが。
611NAME IS NULL:2013/02/06(水) 19:48:34.31 ID:???
なんで正の値が保証されるの?
612NAME IS NULL:2013/02/06(水) 20:42:38.67 ID:???
>>611
保障されないから絶対値取れって話だろ
まあ、それはどうしたいか>>602が言えばすむ
それよりNULLがあるのかどうかの方が大事
613NAME IS NULL:2013/02/07(木) 08:06:54.17 ID:???
>>603-612
ありがとうございます。
列1と列2の値はMAXとMINで取ろうと思ってました。
NULLはないので教えていただいた方法で行けそうです。
ありがとうございました。
614NAME IS NULL:2013/02/13(水) 08:34:38.70 ID:???
温かいスレだ
615NAME IS NULL:2013/02/15(金) 01:42:06.05 ID:iKm/GczF
group byの動作が良くわかりません

id| type | num
--+------+--------
1 | a | 100
2 | a | 150
3 | b | 200
4 | b | 90
5 | b | 150

SELECT type, max(num) FROM tbl GROUP BY type HAVING num > 100;

このようなSQLを発行した時、
1. type=aのレコードの集合とtype=bのレコード集合に分割
2. type=aの集合のからhaving句を満たすレコードを抽出
3. type=bの集合のからhaving句を満たすレコードを抽出
4. 2.のレコード集合からselect句を満たす列を選択
という流れで処理が行われていると推測したのですが、これで合っているのでしょうか?

また、from句に指定したテーブルまたはインラインビューによって取得したレコードの集合と
group byで分割されたレコードの集合(上の1.のそれぞれ)は同じものと理解して問題ないのでしょうか?
616NAME IS NULL:2013/02/15(金) 18:19:51.37 ID:???
動くの?
617NAME IS NULL:2013/02/15(金) 18:50:11.67 ID:???
>>615
ヒント:
 SQLの評価順は
 FROM→WHERE→GROUP BY→HAVING→SELECT→UNION→ORDER BY
618NAME IS NULL:2013/02/15(金) 18:54:51.86 ID:???
もう少しヒント:
 GROUP BYの段階で集計(SUMとかMAXとか)が行われる
619NAME IS NULL:2013/02/15(金) 20:07:46.23 ID:???
>>615
まずそのSQLは普通はエラーになるはず
HAVINGに集約関係ない式は指定できない

一般論としては
もし実際の内部の処理がどうやって行われたか知りたいなら
実行計画を見ないとダメ
同じSQLでも同じように実行されるとは限らない

論理的な話なら>>617

あとgroup byで分割されたレコードの集合なんてない(内部的にワークとして作ってるかもしれんが)
分割にしても集約にしても操作されたものと操作前のものが同一だとする理由が解らん
620NAME IS NULL:2013/02/16(土) 08:39:06.29 ID:???
>>615
宣言的記述であるSELECT文に関して処理の流れや順序を問うことにあまり意味は無い。

仕様で定められているのは・・・という手順で処理した結果と「同じ結果を返す」という
ことだけであって、同じ結果を返すのであれば仕様と異なる手順で処理するのも許される。

実際は実行計画を出力させて処理の順番を確認することもあるけれども、それは基本的には
パフォーマンスチューニングのためであって、結果の正しさや処理手順を問うためではない。

ちなみに仕様に書かれている手順に興味があるのであればSQL92の仕様書のSELECT文の
Semanticsの項を読んで下さい、と書こうとしたのだけれども、あれの邦訳ってどこに
転がっているのだろう。丸善Date本やアジソンウェスレイの標準SQLガイドのSELECT文の
項にはちゃんと仕様で定められた評価順序が書いてあるのだけれども。
621NAME IS NULL:2013/02/16(土) 13:21:32.12 ID:/IbyUisN
データベーススペシャリストの勉強本でいいのない?
622615:2013/02/17(日) 02:42:10.75 ID:???
たくさんの解答ありがとうございます

mysqlでSQLを学んでいるため
select key_b from tbl group by key_a;
みたいなSQLでもエラーにならなかったためgroup byの挙動がわからずに困っていたことと、
whereとhavingの違いがいまいち分からなかったのですが
http://www.geocities.jp/mickindex/database/db_gb_pb.html
ここの記事などを読んでgroup byがレコードの集合を作るのであれば
havingはレコード集合に対して使う抽出操作みたいなものではないのかと勝手に推測していました。
その推測がいまいち確証がなかったため聞いてみたいのですが、かなり的外れだったみたいですね…

またよく分からなくなってきたので、ちょっとexplainなどで各実装での処理順序を調べてみようと思います。

ちなみに、whereとhavingの違いは
http://blog.livedoor.jp/akf0/archives/51054564.html
ここに書いてあるようなテーブルの項目に対する条件と集計関数の結果に対する条件という違いという理解であっているのでしょうか?
623NAME IS NULL:2013/02/17(日) 03:29:11.64 ID:???
>>622
>ここの記事などを読んでgroup byがレコードの集合を作るのであれば
そのページの解説も、

>havingはレコード集合に対して使う抽出操作みたいなものではないのかと
この理解も極めて正しいよ。むしろ

>>619
>あとgroup byで分割されたレコードの集合なんてない

てのがおかしい。
624NAME IS NULL:2013/02/17(日) 03:46:12.48 ID:???
>>622
もちっと書いておくと、GROUP BYはFROM - WHEREの評価結果のテーブルをGROUP BYで
指定された列について同じ値を持つ行のグループに分割したグールプ表(grouped table)を作る。
なので>>615の1の理解は正しい。

次にHAVING句は、各グループに対してHAVING句に書かれた条件を評価して、それがTrueと
なる「グループを」抽出する。グループ単位で結果に残したり落としたりするので、レコード
単位の処理ではないという意味で2.3はちょっと違う。

よってHAVINGに書ける条件式に関しては「それぞれのグループごとに一つの値を持つ」もの
に限られるという制約がついている。そのため各グループで値を集約して一つの値を出力する
集約関数がHAVING句ではよく使われるわけだけれども

SELECT type, MAX(num) FROM tbl GROUP BY type HAVING MIN(num) > 100

「グールプで一つの値」を持てば良いのでGROUP BYに指定された列も使うことが出来る。

SELECT type, MAX(num) FROM tbl GROUP BY type HAVING type = `a`

最後にSELECT列を評価してグループ毎に集約等を行いグループ表から普通の表を生成する。
で、SELECT分は上記のような手続きで評価した結果と同じ結果を出す事になっている。

また>>615のクエリは本来エラーになるはず。きっちりSQLを学びたいならPostgreSQLがマシ。
625NAME IS NULL:2013/02/17(日) 03:54:46.88 ID:???
またMySQLか、こんなでたらめSQL通すのは
626NAME IS NULL:2013/02/17(日) 03:56:19.02 ID:???
>>622
>ちなみに、whereとhavingの違いは
そのブログの解説はイマイチ。グループ化の前の各行に対する制約か、グループ化後の
各グループに対する制約か、という評価されるタイミングの違いがまず大切。なので、

SELECT type, MAX(num) FROM tbl WHERE num > 100 GROUP BY type HAVING COUNT(id) > 1

というSELECT分の場合、WHEREが無い場合はtypeとしてa、b両方が結果に含まれる
けれども、WHEREをつけるとaが結果から無くなる。HAVINGが評価されるより以前に
WHEREの評価でid=1の行が取り除かれるため、HAVINGに到達した時点でtype=aの
グループは1行だけになってしまうのでこういう結果になる。
「テーブルの項目に対する条件と集計関数の結果に対する条件」だけだとこの例のような
事例を理解するにはちょっとイマイチだと思う。
627NAME IS NULL:2013/02/17(日) 11:33:33.65 ID:???
>>621
「情報処理教科書 データベーススペシャリスト」
スレチだけど、これ1冊読んでおけば十分。
628NAME IS NULL:2013/02/20(水) 00:23:24.32 ID:8bcgMjBw
t_guest、t_address、t_friend という3つのテーブルがあって、
t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています

SELECT g.namae, c.prefecture, f.namae
FROM t_guest AS g
LEFT JOIN t_address AS a
 ON g.id = a.guestId
LEFT JOIN t_friend AS f
 ON g.id = f.guestId
WHERE g.age = 20;

こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするには
どうしたら良いんでしょうか
それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのか
わかりません
629628:2013/02/20(水) 00:24:56.07 ID:???
すみません、書き間違いがありました

t_guest、t_address、t_friend という3つのテーブルがあって、
t_guestを基本にして、left joinをt_addressとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています

SELECT g.namae, a.prefecture, f.namae
FROM t_guest AS g
LEFT JOIN t_address AS a
 ON g.id = a.guestId
LEFT JOIN t_friend AS f
 ON g.id = f.guestId
WHERE g.age = 20;

でした
630NAME IS NULL:2013/02/20(水) 01:02:52.59 ID:???
>>628
>t_addressに住所を登録していないguestのユーザー
がt_addressに登録されていないならt_addressを内部結合にすれば良いし、
guestIdが登録されていて住所項目がnullなのであれば、
抽出条件にt_address.住所項目 is not null加えればいいのでは?
631NAME IS NULL:2013/02/20(水) 01:05:01.97 ID:???
>>628
>「登録していない状況」をどう表現したら良いのかわかりません
それを説明しないと他人にはどうしていいかわかりませんが

t_addressに住所を登録していない の意味が
t_addressに該当レコードが無い なら、outer joinやめてinner joinにするだけ
そうじゃないなら、その条件をwhereに書くだけ
たとえばwhere a.prefecture is null とか
(外部結合で該当なければどうせNULLだから場合によってはこれだけでもいいけど)
632628:2013/02/20(水) 01:39:25.92 ID:???
>>630-631
ありがとうございました
なんとなくわかってきました
633NAME IS NULL:2013/02/22(金) 19:55:44.90 ID:???
なんとなくで大丈夫か?
634NAME IS NULL:2013/02/23(土) 09:07:59.21 ID:???
色々やってりゃそのうちわかるさ。

何回か痛い目に会うかもしれないけど。
635NAME IS NULL:2013/02/25(月) 23:11:43.99 ID:8BczK/hd
質問です、お願いします
id|col1|col2 という構成のテーブルがあります

これに対して、以下のような条件と動作を実現したいと思います
1)更新できるのはcol2が0の場合のみ
2)更新できた場合、'updated'を返す
3)もし、col2が0以外の場合、'update_fail' という値を返す

どんなクエリ文を書いたら良いんでしょうか
(利用してるDBはmysql5です)
636635:2013/02/25(月) 23:15:58.95 ID:8BczK/hd
あいまいだったので補足します
上記の条件での更新処理を実現するクエリ文を教えて欲しい、ということです
通常の更新条件としてはidをユニークキーとして想定しています
637NAME IS NULL:2013/02/26(火) 00:27:10.35 ID:???
>>636
id範囲指定による更新や、col1を指定しての更新はないと。
638NAME IS NULL:2013/02/26(火) 00:35:10.85 ID:ljDtJ7sG
>>637
そうです、通常の更新では
where Id =123 という形で更新できるんですが、
そこにcol2が0か1かによって、更新の可否や帰り値まで決定できるような
クエリが作れないかと思いました

一発では無理で、複数のクエリに分けるしかないんでしょうか
自分では思いつきません
639NAME IS NULL:2013/02/26(火) 00:44:44.52 ID:???
case式は?
640NAME IS NULL:2013/02/26(火) 00:58:59.25 ID:???
更新できるかどうかの確認だけで実際に更新処理するわけではないよね?
641NAME IS NULL:2013/02/26(火) 03:08:07.91 ID:???
select for updateかなぁ
642NAME IS NULL:2013/02/26(火) 08:04:38.39 ID:???
>>638
idを指定して更新するという文言がどこかに必要でしたね。
643NAME IS NULL:2013/02/26(火) 20:07:51.86 ID:???
それを1文でやる必要性がわからん
644NAME IS NULL:2013/02/26(火) 20:22:01.60 ID:???
mysql5のupdateって、更新した行数戻したりしないのか?
id指定するなら0か1なんだから、戻り見たらわかるだろ
645NAME IS NULL:2013/02/26(火) 20:26:10.86 ID:???
update HOGEHOGE set HEMOHEMO=MOKEMOKE
where id=PIYOPIYO and col2=0;

とでもして、戻り値で更新された行数を取得するとか
646NAME IS NULL:2013/02/26(火) 20:35:12.37 ID:???
affectedrowsは要件を満たさないと思ってそっとしといたのに
647NAME IS NULL:2013/02/28(木) 21:10:39.57 ID:3Nk6dQry
mysqlはよくわからんけど
select for updateでロックして
あればupdateして
updatedを返す
なければupdate_fail'かえすSQLブロックかけばいいんじゃね
それぐらいできるだろ
648NAME IS NULL:2013/02/28(木) 23:35:29.18 ID:???
update文では文字列返さないからselect文使うしかないかと
それじゃだめなの?
649NAME IS NULL:2013/02/28(木) 23:38:35.38 ID:???
>>628
a.id is not null をwhere句に追加かな
650NAME IS NULL:2013/02/28(木) 23:41:53.32 ID:???
>>621
sqlならプログラマのためのSQLがおすすめ
あとは翔泳社読んどけばいいよ
651NAME IS NULL:2013/03/05(火) 11:31:52.05 ID:uG1h7J7w
2010年度の月毎の件数をまとめたデータですが
累計を求めたいです。

月 2010年度
01 1
02 2
03 1
04 3
05 2
06 2
07 2
08 1
09 2
10 2
11 2
12 1

求めたい結果
月 2010年度累計
04 3
05 5
06 7
07 9
08 10
09 12
10 14
11 16
12 17
01 18
02 20
03 21

これだけのデータから
スタートを4月にして累計を求める方法は
ありますでしょうか?
よろしくお願いします。
652NAME IS NULL:2013/03/05(火) 11:50:46.82 ID:???
思いっきり簡略化してこうなったのかな、、まあいいかw

ORDER BY 月 < 4, 月

をつけるとか。BOOL値でソートしてから月でソート
653NAME IS NULL:2013/03/05(火) 12:15:19.25 ID:???
>>651
テーブル名:TBL
int month 月
int val   2010年度の値
とする

select t1.MONTH,
(select sum(t2.VAL) from
 (select case when (MONTH<4) then concat('20110',MONTH) else
 case when (MONTH<10) then concat('20100',MONTH) else concat('2010',MONTH) end end as YEARMONTH, MONTH, VAL from TBL) t2
 where t2.YEARMONTH<=t1.YEARMONTH)
from
(select case when (MONTH<4) then concat('20110',MONTH) else
 case when (MONTH<10) then concat('20100',MONTH) ELSE concat('2010',MONTH) END END as YEARMONTH, MONTH, VAL from TBL) t1
order by t1.YEARMONTH;
654NAME IS NULL:2013/03/05(火) 12:17:44.75 ID:???
>>651
2010年度の月っていうことは
01月は2011年01月という事?
データに年が入ってないの?
655NAME IS NULL:2013/03/05(火) 12:18:09.30 ID:???
>>652-653
ありがとうござます。
ご回答頂いた内容が難しいので
しばらく考えてみます。
ありがとうございました。
656NAME IS NULL:2013/03/05(火) 12:44:09.32 ID:???
>>653補足

テーブル名:TBL
int NO  番号
int VAL 値

というテーブルに

NO VAL
1 10
2 30
3 20

というデータがあった場合に、NO の昇順で累計を求めるSQLは

select t1.NO, (select sum(t2.VAL) from TBL t2 where t2.NO<=t1.NO) from TBL t1 order by t1.NO;

となる

※MySQLスレと間違えて>>653はMySQLで書いてしもた
 関数がなければ適宜読み替えてくれ
657NAME IS NULL:2013/03/05(火) 12:54:35.36 ID:???
>>654
はい、その通りです。
最終的にそういう形になりました。
658NAME IS NULL:2013/03/05(火) 13:26:09.59 ID:???
>>652-654,656
ありがとうございました。
おかげで、理想の形にすることが出来ました。
659NAME IS NULL:2013/03/05(火) 23:09:12.28 ID:???
A_table

ID | title | keyword
-------------------
1 | いうえ | あいうえお
2 | きくけ | かきくけこ
3 | しすせ | さしすせそ

select * from A_table where "あいうえお" like "%titel%"

結果を
ID 1 の "いうえ" を結果としてだしたいのですが、
WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。

MYSQLですが、、なかなかいい方法がわからなくて・・・
660NAME IS NULL:2013/03/05(火) 23:10:44.21 ID:???
>>659
別にkeyword 消し忘れてました  keywordは忘れてください。
661NAME IS NULL:2013/03/05(火) 23:45:54.55 ID:???
こういうこと?
select * from A_table where 'あいうえお' like '%' || title || '%'

|| は文字列連結演算子
MySQLではconcat関数なのかな?
そしてMySQLでこういう方法が使えるかどうかは知らない
662NAME IS NULL:2013/03/06(水) 11:11:21.41 ID:???
1つのupdate文に set と条件 の組を複数指定できませんか。
update table_foo
set x = new1 where x = old1,
set y = new2 where y = old2,
set z = new3 where y = old3
みたいなことがしたい。
663NAME IS NULL:2013/03/06(水) 12:11:04.60 ID:???
SET x = (CASE WHEN x = old1 THEN new1 ELSE x END),
y = (CASE・・・
とかつなげればできるけど、、、全行アップデートになる。
664NAME IS NULL:2013/03/06(水) 13:21:32.05 ID:???
素直に3行書けよ。
仮に1行にまとめられたとしても、実行計画は同じになるだろ。
665NAME IS NULL:2013/03/06(水) 13:46:42.58 ID:???
まあこの場合、new2とold3が同値だった場合3度に分けるとややこしいことに
なるかもだけど、そもそも元がタイプミスな気がしないでもないw
666NAME IS NULL:2013/03/06(水) 15:47:33.33 ID:???
>>659
すみません。WEBで入力した文字列というのは
どこにあるのですか?
667NAME IS NULL:2013/03/06(水) 16:01:40.19 ID:???
それくらい脳内補完が出来ないと
エスパー回答者にはなれない
668NAME IS NULL:2013/03/06(水) 16:55:18.81 ID:???
SQLインジェクションのほうに話を進めるのかと思ったw
669NAME IS NULL:2013/03/07(木) 08:52:33.92 ID:x/bLWl8/
oracleなんですが、次の表に

日付 数
1/1 5
1/2 2
1/3 -8
1/4 6
1/5 8

残と繰越を計算して↓のようにしたいのですが
どのようなSQLにすればいいでしょうか?><

日付 残 数 繰越
1/1 0 5 5 ←初日の残はゼロ、繰越=残+数
1/2 5 2 7 ←残=前日の繰越
1/3 7 -8 -1
1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに
1/5 6 8 14
670NAME IS NULL:2013/03/07(木) 10:38:33.61 ID:???
SQLだけでやろうとしてるのはそう言う理由があるの?
671NAME IS NULL:2013/03/07(木) 10:52:52.49 ID:???
せめてテーブル名くらい指定してください。
672NAME IS NULL:2013/03/07(木) 11:15:33.21 ID:???
mySQL 5.5.27

年  季節 記号
2008 Spring CS
2008 Fall MTH
2008 Fall MTH
2009 Spring CS
2014 Winter CS
2014 Summer MTH
2014 Spring CS
2014 Fall CS

このテーブルの季節部分をSpring, Summer,Fall,Winterの順に並べかえたいのですが、どのようにクエリーを書けばよいでしょうか?よろしくお願いいたします。
673669:2013/03/07(木) 11:17:37.56 ID:x/bLWl8/
>670
SQLだけじゃぁ無理でしょうか?(ノω・、)
ストアドプログラム?とかでも大丈夫です

>671
"TBL"ってテーブル名にします

よろしくお願いします!
674NAME IS NULL:2013/03/07(木) 11:52:24.93 ID:???
>>672
数字にして名称と数値のテーブル別に作った方がいい気もするが
MySQLなら、
ORDER BY field(季節,'Spring', 'Summer', 'Fall', 'Winter')
でいけるかな?
675NAME IS NULL:2013/03/07(木) 16:31:03.49 ID:???
>>673
> ←前日の繰越がマイナスなら残はゼロに
これさえなきゃ単純にSQLでかけると思うんだけどね。
676NAME IS NULL:2013/03/07(木) 18:17:46.60 ID:???
>>663
なるほど。case式は頑張って書くとしても、全行アップデートはいやですね。

>>664
3行で書くと3回通信しなきゃいけないので、それを1回にしたいです。

>>665
すみません、タイプミスです ;(
677NAME IS NULL:2013/03/07(木) 18:31:39.11 ID:???
全行アップデートはまあパフォーマンスとかは気にならんかもだけど
トリガとかあると面倒かな。
678NAME IS NULL:2013/03/07(木) 18:32:28.24 ID:???
>>676
3回通信?ストアドがーとか考える前に基礎知識を充実させたほうがいい
679NAME IS NULL:2013/03/07(木) 20:09:55.59 ID:???
>>678
もとの質問では書いてませんが、更新件数を知りたいので、一文ごとに実行するしかないかなと思っています。
3つの文をまとめてDBに投げて、それらの更新件数もきちんと取得できるなら、そうしたいです。できるのであれば、ですが。
680NAME IS NULL:2013/03/07(木) 22:55:24.05 ID:???
>>679
どれくらい遅くなっちゃいそう?
681NAME IS NULL:2013/03/08(金) 01:58:29.69 ID:???
>>676=679
>>678>>679も書いてるけど、素直に3回SQL発行しなされ。
で、ちゃんとしたベンチマークして、1回と3回でどれだけ違うか測定してみて、
耐えられない程遅いなら考えればいい。

(1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。
682NAME IS NULL:2013/03/08(金) 14:42:51.75 ID:???
>>681
>>676じゃないけど
> (1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。
これどういうこと?
683672:2013/03/08(金) 16:58:17.66 ID:???
>>674
MySQLだとOrder側でそのように書けるのですね、
他のDBでもOrderにCase式で並べ替えれそうですね、回答ありがとうございました。
684NAME IS NULL:2013/03/18(月) 15:28:14.51 ID:???
・DBMS名とバージョン
Oracle 10g
・テーブルデーた
create table aaa (
id number(5,0) primary key, -- 主キー
nendo char(4), -- 年度
tsuki char(2) -- 月
);
insert into aaa values (1, '2012', '01');
insert into aaa values (2, '2012', '02');
insert into aaa values (3, '2012', '03');
insert into aaa values (4, '2012', '04');
insert into aaa values (5, '2012', '05');
・欲しい結果
id, nendo, tsuki
--------------------
4, '2012', '04'
5, '2012', '05,
1, '2012', '01'
2, '2012', '02'
3, '2012', '03'

・説明
年度/月の昇順に並べたいです。
2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。
685NAME IS NULL:2013/03/18(月) 15:30:25.79 ID:dL6PwHp0
追記です、Oracle独自の関数を使わないやり方でお願いします。
686NAME IS NULL:2013/03/18(月) 15:39:25.18 ID:???
oracle知らないけど、
case when tsuki > '03' then nendo else to_char(to_number(nendo) + 1) end
みたいなのでいけるんじゃ。
687NAME IS NULL:2013/03/18(月) 15:41:12.43 ID:???
このくらいなら、手抜きでこんなんでもいいかも
ORDER BY nendo, TO_NUMBER(tsuki, '99') < 4, tsuki
688NAME IS NULL:2013/03/18(月) 16:09:06.32 ID:???
to_charとto_numberってOracle独自な(というかSQL標準関数ではない)気もしないではない。
689NAME IS NULL:2013/03/18(月) 16:19:26.58 ID:???
あれ、CAST避けてTO_NUMBERにしたんだけど逆だったか?
普段はPostgreSQLなんで、::INTなんだよな、、、
690684:2013/03/18(月) 16:37:10.95 ID:???
ありがとうございます。下記で想定通り取れました。
select id, nendo, tsuki
from aaa
order by
case
when tsuki in ('01', '02', '03') then to_number(nendo) + 1
else to_number(nendo)
end asc, tsuki asc;

to_numberは他のDBにもあるのでOKとしてもらうようお願いしてみます。
691NAME IS NULL:2013/03/19(火) 01:12:02.75 ID:8ksoLJZ9
mysql 4.0で一つのテーブルに大量のインサートかますプログラム書いてるんだが、
誰か速くしてくれ〜〜〜〜

レコード数が一千万ほどあって、もう激重い。

・Optimize table
こいつが一番効果あったが、オフラインな時間が長すぎる

・Analyze table
こいつは割りと早かった

・Alter tableやdisable keys → enable keys
こいつらも結構重い。。

他に最適化する方法、ないかな・・・orz
692NAME IS NULL:2013/03/19(火) 06:45:23.39 ID:???
>>691
そういうのは

MySQL 総合 Part23
http://toro.2ch.net/test/read.cgi/db/1343294198/l50

に行きなさいって

後、バルクインサートは?
693NAME IS NULL:2013/03/19(火) 15:02:06.96 ID:J+pHkNJH
突然の質問にて失礼いたします。
wordpressでSQLを利用しているのですが、
・記事のフィールド名「wp_posts」で利用したカスタムフィールド名「wp_postmeta」に、
 特定のmeta_key(price)の値meta_value(100,200,300)を含む記事「wp_posts」とフィールド名「wp_postmeta」を全削除
する方法が分からずに悩んでいます。

以下の記述で試したところ、値meta_valueのみが消えただけで、
該当の記事wp_postsとフィールド名wp_postmetaを削除することはできませんでした。

SELECT * FROM `wp_postmeta`,`wp_posts` WHERE `meta_key`='price' &amp;&amp; `meta_value` IN ('100','200',300')

どなたか上記の手法をご存知の方がおりましたら、ご教示くださいませm(_ _)m
694NAME IS NULL:2013/03/19(火) 15:54:45.60 ID:???
読めば読むほどわからなくなる内容だな。
レコード消すならDELETE FROMじゃないのか?
695NAME IS NULL:2013/03/19(火) 15:58:33.86 ID:J+pHkNJH
>>694
申し訳ないです、間違いました。
DELETE FROM `wp_postmeta` WHERE `meta_key`='price' &amp;&amp; `meta_value` IN ('100','200',300')
で試しました。
この条件にかかる`wp_posts`の消し方も不明でした。
知識不足でお伝えするのが難しいです・・・
696NAME IS NULL:2013/03/19(火) 16:03:47.51 ID:???
こういうこと?

DELETE FROM wp_posts
WHERE id IN (
SELECT post_id
FROM wp_postmeta
WHERE meta_key = 'price' AND meta_value IN ('100','200',300)
);

DELETE wp_postmeta WHERE meta_key = 'price' AND meta_value IN ('100','200',300);
697NAME IS NULL:2013/03/19(火) 16:09:32.35 ID:J+pHkNJH
>>696
ありがとうございます!!
おかげさまでやりたい事が実行できそうです。
自分の知識では到底たどり着けなそうな内容でした^^;

心よりお礼いたします。
698NAME IS NULL:2013/03/21(木) 12:09:12.51 ID:???
MySQLにて

select * from books left join (
select * from reserves where book_cd
not in (select book_cd from reserves where user_cd = 19)
)on books.book_cd=reserves.book_cd;

というふうに outer join に selectで絞り込みをかけた表を指定したいんですけど
ERROR 1248 (42000): Every derived table must have its own alias
と怒られます。
outer joinにselectの結果を指定することはできないのでしょうか?
699NAME IS NULL:2013/03/21(木) 12:40:54.28 ID:???
>>698
ちゃんとみてないけど
on の前にテーブル別名指定してonの条件は別名でやってみ
700NAME IS NULL:2013/03/21(木) 13:03:53.16 ID:???
>>698
サブクエリ必要か?
SELECT bk.* FROM books bk
 LEFT OUTER JOIN reserves res ON (
  bk.book_cd = res.book_cd
  AND res.user_cd <> '19'
 );
これで取れそうな気がするが
701700:2013/03/21(木) 13:08:21.34 ID:???
すまん、最初のbk.*は*の間違いだ
702NAME IS NULL:2013/03/21(木) 18:21:38.99 ID:???
テーブルの定義にもよるけどユーザIDに関連するフィルタ近辺で意味が変わる可能性があるよ。
一番外のサブクエリははずせると思うけども
703NAME IS NULL:2013/03/21(木) 20:53:59.76 ID:???
お前らかっこいい
704NAME IS NULL:2013/03/21(木) 22:30:24.25 ID:???
禿がいいのか。
705NAME IS NULL:2013/03/22(金) 10:34:03.47 ID:???
SQL SERVER 2010ですが
TOP 2を求めて残りをその他として合計表示したいです。
よろしくお願いします。

元のデータ
列1
A
A
A
B
B
C
D

求めたい結果
A 3
B 2
その他 2
706NAME IS NULL:2013/03/22(金) 11:04:25.28 ID:???
>>705
UNIONじゃダメ?
707NAME IS NULL:2013/03/22(金) 11:29:30.02 ID:???
>705
SELECT NAME, SUM(CNT1) CNT FROM(
SELECT NAME=CASE ID
WHEN 1 THEN NAME
WHEN 2 THEN NAME
ELSE 'OTHER'
END,
CNT1 FROM (
SELECT ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) ID,NAME,COUNT(*) CNT1
FROM TBL1
GROUP BY NAME
) A
) B
GROUP BY NAME
708NAME IS NULL:2013/03/22(金) 12:07:44.69 ID:???
>>705
1-2行しかない時どうしようとか。
709NAME IS NULL:2013/03/22(金) 13:24:03.19 ID:???
>>706-708 ありがとうございます。
>>707様のやり方でできました。
710NAME IS NULL:2013/03/24(日) 14:16:59.11 ID:LtAoLu+W
mysqlを使用しています
descを使うとカラムの名前などがわかるのですが
sql分の結果でカラムの名前だけを知りたい場合はどのようにすればいいか教えて頂けないでしょうか?
711NAME IS NULL:2013/03/24(日) 14:58:12.82 ID:???
カラム名を知らないDBにアクセスする状況がまったく思い当たらないんだが

show columns from TBL;

とか

select column_name from information_schema.columns where table_schema="SCHEMA" and table_name='TBL';

でどうだろうか
712NAME IS NULL:2013/03/24(日) 15:09:57.15 ID:LtAoLu+W
ありがとうございます
zaikoというテーブルがあって
desc zaikoを実行すると
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| B508 | varchar(50) | YES | |NULL | |
| C895 | varchar(50) | YES | |NULL | |
| d786 | varchar(50) | YES | |NULL | |
と出てくるのですが

Fieldの部分だけを表示したいと思っております
Type | Null | Key | Default | Extra |の項目は非表示にしたい
713NAME IS NULL:2013/03/24(日) 16:55:58.43 ID:???
ADOで
For i = 1 To wkRs.Fields.Count
 Write #num, wkRs.Fields(i - 1).Name
Next

とやって列名取出してんのはやってるけど、Fieldの部分だけ出すのってSQLだけで出来るの?
714NAME IS NULL:2013/03/24(日) 17:10:30.90 ID:???
まだよくわからん
Fieldの部分だけを見たいのはプログラム?人間?

どっちにしても>>711の後者のSQLで表示はできるが
715NAME IS NULL:2013/03/24(日) 17:58:05.22 ID:???
>>713
ほとんどのDBMSでシステムが持ってるカタログを参照することで可能
いちおうinformation_schemaってのが標準SQLで決められてたはずだが
実装されてるかどうかはそのDBMS次第
確実な方法は各DBMSのスレで聞いてください

ということで>>712はmysqlのスレへ行ってください
716NAME IS NULL:2013/03/27(水) 10:30:51.11 ID:???
テーブルを5つJOINしてselectで、グループ名、ホスト名、データ名、データ取得時刻、データ値を表示しようとしています。
しかし、データ型が整数の場合と、浮動小数の場合で、データ取得時刻とデータ値が格納されているテーブル(trendsとtrends_uint)が異なっている。
つまり二つのテーブル(trendsとtrends_uint)から片方で検索してNULLならもう片方のデータ値、時刻を取得したいのですが、どうしたらよいでしょうか。

現在、下のようなSQLだと全てのデータ値、時刻がNULLになってしまいます。

SET NAMES UTF8;
SELECT groups.name,hosts.host,items.name,from_unixtime(trends.clock|trends_uint.
clock),(trends.value_min|trends_uint.value_min)\
FROM hosts \
RIGHT JOIN items ON items.hostid = hosts.hostid \
LEFT JOIN trends ON items.itemid = trends.itemid \
LEFT JOIN trends_uint ON items.itemid = trends_uint.itemid \
RIGHT JOIN hosts_groups ON hosts_groups.hostid = hosts.hostid \
RIGHT JOIN groups ON hosts_groups.groupid = groups.groupid \
WHERE hosts_groups.groupid = 14 \
;
717NAME IS NULL:2013/03/27(水) 10:38:03.77 ID:???
COALESCE 使う
718NAME IS NULL:2013/03/27(水) 10:45:10.12 ID:???
>>717
簡潔にして素早いレスありがと。これでいけたっぽい。

SET NAMES UTF8;
SELECT groups.name,hosts.host,items.name,from_unixtime(COALESCE(trends.clock,trends_uint.clock)),COALESCE(trends.value_min,trends_uint.value_min)\
FROM hosts \
RIGHT JOIN items ON items.hostid = hosts.hostid \
LEFT JOIN trends ON items.itemid = trends.itemid \
LEFT JOIN trends_uint ON items.itemid = trends_uint.itemid \
RIGHT JOIN hosts_groups ON hosts_groups.hostid = hosts.hostid \
RIGHT JOIN groups ON hosts_groups.groupid = groups.groupid \
WHERE hosts_groups.groupid = 14 \
719NAME IS NULL:2013/03/27(水) 10:55:57.18 ID:???
読み方はコウアレス
720NAME IS NULL:2013/03/27(水) 13:38:43.11 ID:???
しかし、コアレスセと心の中で発音しながらタイプする
721NAME IS NULL:2013/03/27(水) 13:43:35.45 ID:???
やっぱりみんな、読み方と綴りに苦労してるんだなw
722NAME IS NULL:2013/03/27(水) 16:20:32.36 ID:???
コアリーズだとばかり思ってたw
723NAME IS NULL:2013/03/28(木) 14:53:31.97 ID:???
コアレス
724NAME IS NULL:2013/03/28(木) 15:56:48.82 ID:???
シングルコア→マルチコア→メニーコア→ついにコアレスへ
725NAME IS NULL:2013/03/28(木) 19:15:34.91 ID:qyRM7UsI
726NAME IS NULL:2013/03/29(金) 00:17:42.48 ID:???
727NAME IS NULL:2013/03/29(金) 10:13:08.70 ID:???
アクセントはレにあるのか
やべー今まで間違えてたぜ
728NAME IS NULL:2013/03/29(金) 13:15:53.49 ID:???
日本人相手ならカタカナ棒読みで大丈夫だ。
729NAME IS NULL:2013/03/30(土) 09:00:29.80 ID:???
mysql 5.5.9
master
code
last_tradingdate

data_tbl
code
data1
tradingdate

で、data_tblにはcode毎に取引日が入っています
それでmasterのlast_tradingdateにcode毎の入力最新日をセット
したいのですが、どう書けばいいんでしょうか。
730NAME IS NULL:2013/03/30(土) 10:44:46.72 ID:aVENNsvE
お知らせ

市原警察署の生活安全課の帰化人創価警官の指導の元、
入学式から2週間ほど、在日の創価学会員を主体とした自称防犯パトロールが、
2週間ほど行われることになりました

生活安全課の指導であることと、パトロールであることは、
絶対に公言してはいけないとの指導も、帰化人創価警官より出ています

期間中は2人組の在日の創価学会員が、頻繁に創価批判者の自宅周辺を、
うろつき回ると思われます
日本人の方は、充分に注意してください
731NAME IS NULL:2013/03/30(土) 12:48:52.45 ID:???
coalesce 使うと遅くなる?
732NAME IS NULL:2013/03/30(土) 13:27:00.55 ID:???
>>729
UPDATEはDBMSで結構差があるからなぁ
mysqlよく知らないが

update master set last_tradingdate =
(select max(tradingdate) from data_tbl where code=master.code)

とかで出来ないか?
masterに別名付けないとダメかもしれんが
733NAME IS NULL:2013/03/30(土) 16:53:52.38 ID:???
>>732
729です。感謝です!セット出来ましたm(__)m
734NAME IS NULL:2013/03/31(日) 02:54:12.01 ID:???
>>731
遅くなるよ
735NAME IS NULL:2013/04/07(日) 13:20:22.35 ID:XikuI4eK
日記のテーブル(tD)
id,title,main_text
日記の写真のテーブル(tF)
id,diaryId,file_path,is_deleted,is_finished

以上のようなテーブルがあり、tD.id = tD.diaryIdの関係です
この状況で、日記のタイトル・文章とその日記に属する写真情報のセットを取得したいとき
left joinで on tD.id = tD.diaryId としてクエリしたら良いと思いますが
以下の条件がついた時にどうしたら良いかわかりません

条件1:tFのデータは、一つの日記に対して複数のデータを持ち、そのうちis_finishedが1かつis_deletedが0のモノだけを取得
条件2:条件1を満たせる写真情報がなければ、写真情報は必要ない。日記のテキスト情報だけを取得する。
条件3:写真情報をもたないテキスト情報も存在する。

条件1はwhereに tF.is_finished = 1 AND tF.is_deleted =0 として書けば満たせますが、
こう書いてしまうと条件2と3を満たせなくなります(写真情報のない日記を抜き出せなくなる)
どうしたら良いんでしょうか、すみませんがよろしくお願いします
736735:2013/04/07(日) 13:33:53.21 ID:???
すみません、解決しました
joinの条件としてonで指定できるんですね
お邪魔しました
737NAME IS NULL:2013/04/07(日) 18:35:36.99 ID:???
onの条件じゃなくて、inner join かouter joinかって話だと思うが
left joinとか何も分からず使ってるのか
738NAME IS NULL:2013/04/09(火) 15:38:37.27 ID:???
>>736
亀だけど、
select * from tD left join tF on (tD.id = tF.diaryId)
where
tF.id is null -- tFと結合できなかったもの
or
is_finished = 1 and is_deleted = 0 -- tFと結合できた場合の条件
739NAME IS NULL:2013/04/09(火) 20:27:39.28 ID:???
>>738
それだとis_finished=0の写真しかもたない日記が選択されないぞ
条件2の日記のテキスト情報だけを取得する、に反してる

あと俺なら結合できた場合の条件の方は括弧で囲んどく
andとorの優先順位に絶対の自信があるなら無くても良いのかもしれんが
740NAME IS NULL:2013/04/10(水) 03:21:02.69 ID:???
おおほんとだ。ありがとう。
tFを事前にフィルタしてそれと結合がいっか。

select * from tD
left join (select * from tF where is_finished = 1 and is_deleted = 0) tF_filtered
on (tD.id = tF_filtered.diaryId)

>>736のonでやるってのはどうにも解決に結びつかないと思いつつ
741NAME IS NULL:2013/04/10(水) 03:25:44.10 ID:???
と、作ったものの、select句に入れるのとどっちがいいんだろね。
select *
, (select file_path from tF where tD.id = diaryId and is_finished = 1 and is_deleted = 0) as file_path
from tD

以前セレクト句でサブクエリ使うのはワカッテナイ人だみたいな事言われてちょっと悩んでる。
ほしい列がひとつであることとか、抽出されるのが高々1件である前提はつくんだけど、
existsとかが許されて、こっちは許されないってのは納得いかないようにも。
742NAME IS NULL:2013/04/10(水) 10:46:57.89 ID:???
>>741
たぶん、ワカッテナイ人が無暗に使うからでしょ。
結局は、それも一つの道具じゃんね。
743NAME IS NULL:2013/04/10(水) 11:15:23.22 ID:???
>>742
System R 時代からの基本中の基本じゃない。
744NAME IS NULL:2013/04/10(水) 23:01:40.61 ID:???
>>741
それは条件1:一つの日記に対して複数のデータを持ち
に反する

>セレクト句でサブクエリ使うのはワカッテナイ人だみたいな
お前がわかってないだけで、ちゃんと使ってる人はわかってる
745NAME IS NULL:2013/04/10(水) 23:38:00.30 ID:???
そんじゃ>>740でいいのか
って書いたらその書き方じゃだめだっていわれるのかなぁ…
746NAME IS NULL:2013/04/10(水) 23:58:42.95 ID:???
onの条件で解決したって書いてんだから
select * from tD left join tF on tD.id = tF.diaryId and is_finished = 1 and is_deleted = 0
だろうがJK
747NAME IS NULL:2013/04/11(木) 18:26:57.82 ID:5zVK9FJ/
MySQL 5.5.29

┏━┳━━┳━━┓
┃no┃.date┃名前┃
┣━╋━━╋━━┫
┃.1 ┃12-3┃榊  ┃
┣━╋━━╋━━┫
┃.2 ┃12-3┃山下┃
┣━╋━━╋━━┫
┃.3 ┃12-3┃斎藤┃
┣━╋━━╋━━┫
┃.4 ┃12-4┃山下┃
┣━╋━━╋━━┫
┃.5 ┃12-4┃斎藤┃
┗━┻━━┻━━┛

result:
no:1
名前:榊

このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。
当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。
宜しくお願いします。
748NAME IS NULL:2013/04/11(木) 18:57:35.88 ID:???
やりたいことがよくわかんないけど
実際に削除せずに削除フラグ(削除日)の列を追加すればいいんじゃないの?
749NAME IS NULL:2013/04/11(木) 19:04:40.74 ID:5zVK9FJ/
>>748
毎日別の場所から全データデータをinsertしており、削除しているわけではありません。
750NAME IS NULL:2013/04/11(木) 19:17:01.34 ID:???
前日で絞り込んだものと当日で絞り込んだものを外部結合して、当日のレコードがないものがそれだとおもうよ

にしても処理の遅さってのが気になるなぁ。
PHPのコードが下手なんじゃないだろうか。もしくはレコードが10万件ぐらいあるか
751NAME IS NULL:2013/04/11(木) 22:01:35.96 ID:Rj/wVQTL
遅くなりました。
PHPのコードが非効率的なのもあると思います。ただ、レコード数が2万件/day近くあり、出来ればデータベース内で処理したいなと思ったのです。

SELECT t1.no,t1.name FROM test as t1 LEFT OUTER JOIN test AS t2 on t2.date='2012-12-03'
WHERE NOT EXISTS(SELECT * FROM test WHERE name = t2.name AND date='2012-12-04') AND t1.no=t2.no

これでなんとか取得出来ました。ありがとうございます。
752NAME IS NULL:2013/04/12(金) 01:04:55.22 ID:???
2万行でこのSQL走らせるとか…何もわかってねーな。
753NAME IS NULL:2013/04/12(金) 04:07:11.05 ID:???
なんだろうこのクエリ
とても読みにくい
>>750の説明の通りに書いたつもりの結果なのかな

2万件/dayが二つあって、PHPで4億回ループするコード書いてそうな気がする
754NAME IS NULL:2013/04/12(金) 05:59:19.07 ID:1iWE1m3w
会議室予約のようなシステムを作っています。

前提として、
Username,Email,Passwordなどのカラムを持つUserテーブルがあり、

さらに、それぞれのユーザーが

Aさん

10日月曜日 13:00-14:00
13日木曜日 15:00-16:00
14日金曜日 20:00-21:00



などのように時間の枠をいくつか指定して予約できるようにしたいです。

この場合、こうやった時間のデータをどのように保持するのが理想でしょうか

使用しているデータベースはmysqlです。
755NAME IS NULL:2013/04/12(金) 10:34:44.20 ID:???
>>754
最低でも>>1は読んでね。

情報がないので
表示する際にまとめて呼び出すべき内容だとか
仕様上の制限だとか色々なものとっぱらって中身だけとなるけど

Usernameがprimary keyだと仮定した場合

予約テーブル
Username
予約開始時刻 datetime
予約終了時刻 datetime
で、とりあえずでけるでそ。

曜日は、ホスト言語側で計算させるほうが大概はいい気がする。
756NAME IS NULL:2013/04/12(金) 16:00:24.21 ID:1iWE1m3w
>>755さん

失礼いたしました。

データをテンプレにそって書き直しました。

・DBMS名とバージョン
Mysql 5.5.27

・テーブルデータ

ユーザーテーブル

ID | Username| email
--+----------+-----
1 | taro | [email protected]
2 | jiro | [email protected]
3 | saburo | [email protected]
4 | shiro | [email protected]

・欲しい結果、説明

以上のようなテーブルの各ユーザーに

10日月曜日 13:00-14:00
13日木曜日 15:00-16:00
14日金曜日 20:00-21:00

と行ったような複数の予約データを
持たせたい(会議室予約のようなイメージです。)

--------------------
755さんの示していただいた解決策は、

予約テーブルを新たに作り(primaly keyはIDでした)

予約テーブル
ID |StartDatetime |EndDatetime
--+---------------------+-------------------
1 | 2013/10/03 13:00:00 |2013/10/03 14:00:00
1 | 2013/10/03 15:00:00 |2013/10/03 16:00:00
1 | 2013/10/03 20:00:00 |2013/10/03 21:00:00
2 | 2013/10/05 11:00:00 |2013/10/05 15:00:00
3 | 2013/10/06 13:00:00 |2013/10/06 14:00:00
3 | 2013/10/07 13:00:00 |2013/10/07 14:00:00
2 | 2013/10/08 13:00:00 |2013/10/08 14:00:00

このような意味合いになるでしょうか。
だとしたらすっきりいたしました。
ありがとうございます。これで実装をしてみます。
757NAME IS NULL:2013/04/12(金) 16:27:00.38 ID:???
>>756
うーむ、それで要件にマッチしてるというならそれでいいけど…。

まず、その予約テーブルのPKはIDじゃないよね?
それと、「会議室予約」をイメージするなら、こんな感じなのを想像するんだけど。

CREATE TABLE users (
user_id text, -- PK
user_name text
);

-- 会議が行われる場所
CREATE TABLE meeting_rooms (
room_id text, -- PK
rroom_name text
);

-- ある会議室で行われる会議
-- 別途、いろいろな制限をデータベースの制約かプログラムで実現する必要がある
CREATE TABLE meetings (
meeting_id text, -- PK
room_id text, -- FK: meeting_rooms.room_id
from_date datetime,
to_date datetime
);

-- 会議に参加する人達
CREATE TABLE participants (
meeting_id text,
user_id text,
);
758NAME IS NULL:2013/04/12(金) 16:42:47.88 ID:???
DB設計のところから話を始めたほうがよくね?
759NAME IS NULL:2013/04/12(金) 20:24:18.00 ID:WP7p6Bmy
>>752
>>753
実際に抜き出すデータは100件そこらなので、PHPの時には
2重foreachで回して、同一データが存在した場合両方を削除して最初からやり直しーといったコードを組んでおりました。

>>750さんの説明通りに書いてみたつもりなのですが、
もっと効率良く抽出出来るSQLがあるのでしたら、是非お教え願えませんでしょうか。
760NAME IS NULL:2013/04/12(金) 22:15:34.14 ID:???
>>759
効率よくという以前に、結合とはどういう処理なのか、考えたほうがよいかと。
761NAME IS NULL:2013/04/12(金) 22:17:06.04 ID:WP7p6Bmy
>>760
はい、実は結合を使ったのは今回が始めてでして・・・学びなおしてきます。
762NAME IS NULL:2013/04/13(土) 06:18:07.10 ID:???
>>761
1. 指定日付の集合 T1 を得る
2. 指定日付の前日の集合 T2 を得る
3. T1 のうち T2 に名前のないレコードを出力する
763NAME IS NULL:2013/04/13(土) 14:50:32.26 ID:???
>>761
まあ手続き型の言語ばっかりやってるとなかなか良いSQLは思い浮かばない
たとえば>>762を馬鹿正直(日付要件勘違いしてるのは訂正)に書くと
select T1.no,T1.name from
(select * from test where [date]='2012-12-03') T1
where name not in ( select name from
(select * from test where [date]='2012-12-04') T2)
まあ、これではいまいちなんで、これを外部結合でやってもうちょいスマートに
select T1.no,T1.name from
(select * from test where [date]='2012-12-03') T1
left join
(select * from test where [date]='2012-12-04') T2
on T1.name=T2.name
where T2.name is NULL
日付指定が2か所ででてるが、条件が指定日と前日で良いなら
select T1.no,T1.name from
test T1
left join
test T2
on T1.name=T2.name and T2.date=T1.date+1
where T2.name is NULL and T1.date='2012-12-03'
まあ、俺ならこう書く
764NAME IS NULL:2013/04/14(日) 04:10:11.60 ID:???
失礼します。

【質問テンプレ】
・DBMS名とバージョン
SQLiteバージョン3

・テーブルデータ
ドメインID,ドメイン名
------------
1,test1.co.jp
2,test2.co.jp

・欲しい結果
"server1.test1.co.jp"という入力に対し
"test1.co.jp"のドメインIDである1

・説明
自分のサイトへのアクセスを行うドメインを管理しています。
"server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。
それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。

以上、宜しくお願いします。
765NAME IS NULL:2013/04/14(日) 04:38:01.01 ID:???
SELECT * FROM テーブル WHERE 'server1.test1.co.jp' like '%'||ドメイン名
で行けるんじゃないかな
766NAME IS NULL:2013/04/14(日) 15:35:27.66 ID:???
ドメインの部分一致であればドットをちゃんと考慮しないとダメだよ。

SELECT * FROM テーブル WHERE '.server1.test1.co.jp' like '%.'||ドメイン名

パーセントの後のドットとserver1の前のドットに要注目。
単に後方一致だとserver1.latest1.co.jpがtest1.co.jpとマッチしてしまう。これは不味い。
なのでまず%の後にドットをつけて'%.test1.co.jp'というパターンを使う。

次にこれだとserver1.test1.co.jpはマッチしてもtest1.co.jpという完全一致文字列がマッチ
しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。
767NAME IS NULL:2013/04/14(日) 15:49:58.88 ID:???
>>766
いったいお前は何を言ってるんだ
768NAME IS NULL:2013/04/14(日) 15:56:09.11 ID:???
え、そんな難しいことは言ってないべ?
769NAME IS NULL:2013/04/14(日) 16:28:56.72 ID:???
test1.co.jp も許可してやれよ。
770NAME IS NULL:2013/04/14(日) 17:08:10.10 ID:???
PostgreSQL なんだから POSIX正規表現 使えよ
771NAME IS NULL:2013/04/14(日) 17:31:34.80 ID:???
>>769
許可してるじゃん。
トリックの解釈が難しいのかな?
772NAME IS NULL:2013/04/14(日) 17:46:52.91 ID:???
>>771
%.test1.co.jpじゃtest1.co.jpは引っ掛からないだろ。
773NAME IS NULL:2013/04/14(日) 17:54:20.75 ID:???
>>772
トリックわかってないんじゃん、、、やっぱり>>766って難しいこと書いてたのかな。
俺はすぐわかったけどなあ
774NAME IS NULL:2013/04/14(日) 18:14:26.71 ID:???
>>773
おれなら>>766のSQLはこう書く
SELECT * FROM テーブル WHERE '.'||'server1.test1.co.jp' like '%.'||ドメイン名

まあドメインの検索条件は要件次第だしよそでやってくれ
775NAME IS NULL:2013/04/14(日) 19:30:36.12 ID:???
766と大差無いやん。

この例の場合はあまり関係無いけど、ドメイン名に関してはレコード数が多くなった場合は
test1.co.jpではなくjp.co.test1のようなリバースオーダーで管理した方が扱いやすいことも多い。
776NAME IS NULL:2013/04/14(日) 19:48:35.77 ID:???
>>773
ごめん。
>>766のSQLをさらっとだけ見てたんだよ。
でも766の書き方じゃ変だろ。
'.server1.test1.co.jp' の左端に . があることなんて気が付かん方が多いだろうし、
. を付けるコードが入ってないじゃないか。
. を付けたいんだったら
SELECT * FROM テーブル WHERE '.'||'server1.test1.co.jp' like '%.'||ドメイン名
として検索したいデータである'server1.test1.co.jp'に'.'を付けてやらなきゃだめだろ。
777NAME IS NULL:2013/04/14(日) 22:29:19.74 ID:???
index効かないからドメインの抽出はホスト言語側でやれよ。
778NAME IS NULL:2013/04/14(日) 22:55:10.85 ID:???
index必要なほどたくさんのdomainをホストしているようには思えないな。
779NAME IS NULL:2013/04/15(月) 11:02:52.79 ID:???
>>761
結合が初めてでMySQLならば、まずInnoDBを指定してテーブル組んで
最初に出してたユーザテーブルと

予約ID int unsigned primary key auto_increment,
ユーザID int unsigned,
予約開始時刻 datetime
予約終了時刻 datetime
で組んだうえでこの予約テーブルとユーザテーブルのそれぞれのユーザIDを外部キーで繋いでみそれ。
ああ、ちなみに外部キーかけるときは、予約テーブル.ユーザIDにもINDEXが必要。

あんまり意味がある話じゃないんだけれども、結合を利用した多次元的な組み方をより早く理解できるんじゃないかと。
効率がいいものが欲しい場合、それらを利用してどんな出力を多用するかとかの話がないと無理ポ
780NAME IS NULL:2013/04/15(月) 13:15:05.62 ID:???
>>776
なもんでこれを書いてたんだと思うよ。
> 次にこれだとserver1.test1.co.jpはマッチしてもtest1.co.jpという完全一致文字列がマッチ
> しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。
実装時にはSQLでやるかロジックでやるか任せてみたんでないの
781NAME IS NULL:2013/04/15(月) 13:27:10.02 ID:???
質問です。
join は、where や order by より必ず先に実行されるのでしょうか。

たとえば

select *
from employees e
join departments d on e.department_id = d.id
where e.id in (1000, 10001, 10002)
order by e.name

というSQLがあったとして、この場合だと先に where や order by で対象行を
絞りこんでから join を実行したほうが、実行効率がよいと思われます。
しかし join のほうが先に実行されると、すべての行に対して join が実行
されてから、対象行が絞りこまれす。つまり、必要のない行にも join が
実行されてします。これは効率が悪いように思います。

というわけで、SQLのjoinは必要に応じてwhereやorder byよりあとに実行される
ことがありますか。それとも必ず先に実行されますか。
RDBMSごとに違う場合は、RDBMSごとに教えていただけるとさいわいです。
782NAME IS NULL:2013/04/15(月) 13:44:12.21 ID:???
>>781
「特集:基礎から理解するデータベースのしくみ」
http://itpro.nikkeibp.co.jp/article/COLUMN/20060127/228070/

をまず読みましょう。
783NAME IS NULL:2013/04/15(月) 14:28:41.49 ID:???
>>781
とりあえず自分の使ってるRDBMSでどういう風に処理されたか確認してごらん。
どういう順番で処理されたかを知る方法はあるから。
784NAME IS NULL:2013/04/15(月) 14:34:49.48 ID:???
FROM句に(SELECT 〜)置いてそれとjoinするとか
785NAME IS NULL:2013/04/15(月) 14:45:09.70 ID:???
>>782
その連載記事には、該当する回答は載ってないようです。
いちばん近いのは
http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227100/?ST=develop
この回ですけど、joinじゃなくて from table1, table2 where ... を使っているので、期待するのとは違いました。
786NAME IS NULL:2013/04/15(月) 14:52:23.94 ID:???
>>785
その記事で全てがカバーされてはいないが、
・実行計画とは何か
・実行計画にはどのようなものがあるのか
・実行計画はどのようにして決定されるのか
・自分が使っているRDBMSで実行計画を知るにはどうすれば良いのか

を、自分で調べろっつってんだよ、タコ
787NAME IS NULL:2013/04/15(月) 14:53:37.55 ID:???
あと、コストベースとかルールベースとかがその記事になければ、そこまで調べろアホ
788NAME IS NULL:2013/04/15(月) 14:56:29.05 ID:???
まぁまぁ。上の人が言いたいのは、

>>781
> というわけで、SQLのjoinは必要に応じてwhereやorder byよりあとに実行される
> ことがありますか。それとも必ず先に実行されますか。
> RDBMSごとに違う場合は、RDBMSごとに教えていただけるとさいわいです。

ケースバイケースとしか言えないから、自分で実行計画を読めるだけの知識を蓄えて、
自分で試しましょうってことだと思うよ。
789NAME IS NULL:2013/04/15(月) 15:55:40.34 ID:???
SQL文に ( ) 付ければ、( ) の中から順に処理してくれるよ。
(落とし穴があることは気がつかないだろうけど)。
790NAME IS NULL:2013/04/15(月) 16:05:52.62 ID:???
>>781
多分、君が効率良いだろうと思うこと(あるいはそれ以上)は、大抵のRDBMSはやってくれるよ。

まあ普通はまずemployeeをidでfilteringして、departmentsをhash joinすると思うけど。
ただ、行数とかidの散らばり具合とか(100万行のうち1000,10001,10002が95万行有るとか)によっては
filteringしない場合もあると思う。
791NAME IS NULL:2013/04/15(月) 17:34:01.95 ID:???
>>786
そんなに行数費やしてるのに答えが書いてないということは、知らないってことですね。
「知ってるけど教えてやらない」という態度を取る人は、実は知らないことが
バレてしまうのを恥ずかしがってるだけだからあまり追求してやるなと、
死んだじいちゃんが言ってました。

>>787
コストベースもルールベースも、その記事に書いてますよ。読んでないんですか?
792NAME IS NULL:2013/04/15(月) 18:04:49.42 ID:???
>>791
やっちゃったね…
793NAME IS NULL:2013/04/15(月) 18:13:11.70 ID:???
>>791
一生そう思っとけ糞が
794NAME IS NULL:2013/04/15(月) 18:20:21.59 ID:???
RDBMSごとに違うというよりもスキーマやクエリごとに違うというのが実際だからなぁ。
実行計画見てみなさいとしか答えようがないのでは。
795NAME IS NULL:2013/04/15(月) 18:27:41.26 ID:???
>>791
で、手元にあるRDBMSが出力する実行計画の内容は理解できたの?
796NAME IS NULL:2013/04/15(月) 18:31:59.06 ID:???
>>791
なりすますのは楽しい?

> 先に where や order by で対象行を絞りこんで
元はこのレベルなんだから釣るならもっと上手にお願い
797NAME IS NULL:2013/04/15(月) 19:02:07.56 ID:???
>>781
>join は、where や order by より必ず先に実行されるのでしょうか
答え:いいえ。実際の実行方法はRDBMSが判断して決定します


以上、この話題終了で
798NAME IS NULL:2013/04/15(月) 20:17:46.07 ID:???
春だよな。
おまけに月曜日だよな。
799NAME IS NULL:2013/04/15(月) 20:18:45.60 ID:???
給料もらってSQL書いてるなら、2chで質問せずに自分で調べて考えりゃいいのに。
800NAME IS NULL:2013/04/15(月) 21:28:00.15 ID:???
給料は、2chで回答してもらうため
801NAME IS NULL:2013/04/15(月) 22:21:16.42 ID:???
お勉強熱心なのは良いと思うけど、
それを知ったところで彼にどんなメリットがあるんだろうか。
802NAME IS NULL:2013/04/16(火) 00:33:50.26 ID:???
単純にSELECT文は宣言的であることを理解していないから出てきた質問だと思うよ。
803NAME IS NULL:2013/04/16(火) 00:38:33.12 ID:???
でも組むときは手続き的に考えないとパフォーマンスを考慮できないというSQLの問題
804NAME IS NULL:2013/04/16(火) 03:03:00.25 ID:???
http://mountainbigroad.jp/fc5/mysql_java.html
これの最後の[root@linux ~]# java DbTestでうまくいかないのです

[root@localhost /]# java DbTest
java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
〜〜〜

こちらのコマンドでは
[root@localhost /]# java -classpath $CLASSPATH:/usr/share/java/mysql-connector-java-5.1.24-bin.jar DbTest
SQL failed.
java.sql.SQLException: Access denied for user 'centos'@'localhost' (using password: YES)
〜〜〜

という感じです
スレ違いでしたら誘導お願いします
805NAME IS NULL:2013/04/16(火) 03:59:14.15 ID:???
スレチ。一応エスパーしておくとmysqlへのログインの失敗。
user: centos host: localhostというユーザがmysql上に存在するかちゃんと確認。

しかしrootでサンプルをコンパイルして実行したり/usr/shareにJar突っ込んで/etc/profileに
クラスパス追加したりと、色々な意味ですごい解説ページだね。
他のページも見たけど情報古いし(そもそもFC5だし)当時基準で考えても行儀の悪い手順が多い。
他所をあたるのが吉。
806NAME IS NULL:2013/04/16(火) 04:09:18.93 ID:???
>>805
ありがとう そうする
807NAME IS NULL:2013/04/16(火) 10:55:57.79 ID:???
>>788
>ケースバイケースとしか言えない
じゃあjoinされる順番は固定ではなく、必要に応じてwhereやorder byよりあとに実行されることがあるというわけですね。
それがわかれば充分です。ありがとうございます。

>>789
> SQL文に ( ) 付ければ、( ) の中から順に処理してくれるよ。
> (落とし穴があることは気がつかないだろうけど)。
こう書くってことでしょうか。
select * from
(select *
from employees
where id in (1000, 1001, 1002)
order by name) as e
join departments d on e.department_id = d.id
たしかにこのほうが、>>781より1割くらい高速なようです(PostgreSQLの場合)。
つまり、PostgreSQLの場合はjoinのほうを先にやってしまうということなんでしょう。効率悪いなあ。

>>790
> 多分、君が効率良いだろうと思うこと(あるいはそれ以上)は、大抵のRDBMSはやってくれるよ。
そうだといいんですが、上のようにjoinをあとにするよう手作業でSQLを書き換えた方が速い場合もあるので、なんとも。
808NAME IS NULL:2013/04/16(火) 12:04:04.88 ID:???
サブクエリのorder byは(特殊な条件のぞいて)意味が無いんだが
それはともかくとして、ポスグレのオプティマイザそんなに貧弱なのか?
809NAME IS NULL:2013/04/16(火) 12:48:53.98 ID:???
だからさ、まず実行計画の見方を勉強しようよ。
そしてRDBMSによっては、スロークエリーの検出機能があるから、その閾値を100msとかに設定して、
時間がかかるクエリの実行計画を見て、改善点があるかさがすとかしようよ。
810NAME IS NULL:2013/04/16(火) 14:32:45.26 ID:???
807と781は論理的に等価なSELECT文じゃないからね。
781はnameでソートされた結果が保証されるけど807に関してはそうではない。
(仮に807がソートされた結果を返してもそれは「たまたま」)

order by無しで比較するとどうなる?
811NAME IS NULL:2013/04/16(火) 15:05:39.15 ID:???
>>807
> PostgreSQLの場合はjoinのほうを先にやってしまうということなんでしょう
まだ推測ですすめるクセが残ってるね
812NAME IS NULL:2013/04/16(火) 15:07:37.11 ID:???
1割ってのもあいまいな話だし、脱初心者をしたと思っている初心者の状態なのかなぁ
813NAME IS NULL:2013/04/16(火) 18:24:01.55 ID:???
だから落とし穴があると書いといたのに。。。
新人君は駄目だな。
814NAME IS NULL:2013/04/16(火) 18:45:50.67 ID:???
Postgresのドキュメントみるかぎりカッコつけてネストしたクエリもまず一端展開する
みたいだけど。一般論としてはカッコ付けて実行計画を強制出来るかはSQLの仕様上は
無し、実際の動作は実装依存であまり考慮の対象になる方法ではないと思うなぁ。
815NAME IS NULL:2013/04/17(水) 10:05:39.36 ID:???
実行計画の見方がわからなかったので
推測に頼ることにした。
に一票
816NAME IS NULL:2013/04/17(水) 22:27:30.56 ID:???
(分散トランザクションとかリモート問い合わせはスレチ…??)
817NAME IS NULL:2013/04/17(水) 23:45:01.52 ID:???
基本的にSQL関係ないのはスレチ
というか、RDBMSの実装に強く依存するのはそれぞれのスレで聞けよ
818NAME IS NULL:2013/04/29(月) 02:30:05.84 ID:???
日本人の払った貴重な血税から
ゴキブリ在日朝鮮人に生活保護が支払われている

ゴキブリ在日朝鮮人の一家族で年間600万円である

ゴキブリ在日朝鮮人の2人に1人は生活保護だ

これより安い給料で働いている日本人が
少ない給料から支払った税金が
ゴキブリ在日朝鮮人の生活保護になっている

ゴキブリ在日朝鮮人は生活保護をもらって
毎日パチンコをして遊んで暮らしてる

ゴキブリ在日朝鮮人の犯罪者も非常に多い
ヤクザの2人に1人はゴキブリ在日朝鮮人だ

日本社会の寄生虫 ゴキブリ在日朝鮮人
日本から出て行け! ゴキブリ在日朝鮮人
819NAME IS NULL:2013/05/08(水) 23:03:49.24 ID:???
環境:アクセス2007

得点テーブル
日 科目 得点
1/1 英語 80
1/1 国語 50
1/1 数学 90

1/2 英語 70
1/2 国語 70

1/3 国語 60
1/3 数学 80

1/4 英語 60
1/4 国語 60
1/4 数学 60

このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが
どのようにすればよいでしょうか。

日 英語  国語  数学
1/1 80 50 90
1/2 70 70
1/3 60 80
1/4 60 60 60
820NAME IS NULL:2013/05/08(水) 23:07:44.04 ID:???
↑欲しい結果の表示がおかしいですが
こんな結果が欲しいです
日 英語  国語  数学
1/1 80 50 90
1/2 70 70 ""
1/3 "" 60 80
1/4 60 60 60
821NAME IS NULL:2013/05/08(水) 23:10:56.33 ID:???
>>819
>>5または>>7
822NAME IS NULL:2013/05/08(水) 23:25:30.47 ID:???
>>821
素早い回答ありがとうございます。
環境が会社にしかないので明日試してみます。
だめそうなら別の手を考えてみます。
823NAME IS NULL:2013/05/09(木) 00:02:30.05 ID:???
たとえば
1/3 "" "" ""
のような結果はそのままじゃ作れないよ、と。
こういう結果もほしい場合は >>8 も組み合わせてね
824NAME IS NULL:2013/05/09(木) 01:12:45.04 ID:???
標準SQLにはないけどアクセスにはクロス集計クエリーていう技があるから
それ使えばいいだけじゃ
825NAME IS NULL:2013/05/09(木) 01:16:07.10 ID:???
最終的にエクセルで処理するんならエクセル側でピボットテーブル使うという手もある
826NAME IS NULL:2013/05/09(木) 18:22:40.24 ID:3HjWO8Ji
助けてください><

新人から以下のような質問きたけど理由がわかりません。。。

「先生。SQLのavg関数はなぜwhere句で使用することができないのですか?」
827826:2013/05/09(木) 18:25:16.79 ID:3HjWO8Ji
質問者です。
あれ?理由って以下でおk?
WHERE句の条件は同一行に対して適用されるからです。
828NAME IS NULL:2013/05/09(木) 20:02:56.46 ID:???
正しい理由としては「SQLの文法がそう決めているから」。
厳密には入れ子クエリーの中のWHERE句では使える場合もあったりと、WHERE句の
中での集約関数の扱いの文法ルールは結構複雑。

informalな理解としては、集約関数はグループテーブル(grouped table)の中の
行グループに適用されるから、という説明が出来ると思う。

グループテーブルというのは元のテーブルを複数の行グループに分割したもので
GROUP BY句を評価した結果として得られる(GROUP BY句がない場合は全ての行を
含むただ一つの行グループからなる暗黙のグループテーブルとして扱う)。

で、SELECT文の評価順序はFROM -> WHERE -> GROUP BY -> HAVING -> SELECT
なので、グループ化される前のWHERE句では集約関数は使えないけれども
グループ化後のHAVINGやSELECTでは使えるという理屈です。
829826:2013/05/09(木) 20:44:45.42 ID:???
>>828
ふむ。。。
他の子はプログラムのメソッド理解してるけどその子はって何?ってレベルの子なので
教えてくれた内容を理解するのは難しいかも(´・ω・`)

教えてくれてありがとうございました
830NAME IS NULL:2013/05/09(木) 21:00:41.63 ID:???
ふむ。

ではエッセンスとしてSELECT文はFROM -> WHERE -> GROUP BY -> HAVING -> SELECT
の順番で評価する、ということだけ教えてはどうでしょうか。
SELECT文が返す結果がどう作られるのか理解するためにも大事な点なので。

そして集約関数はグループを作った後で使えるのでHAVINGとSELECTだけだと。

(厳密にはこの順番で評価した結果と「等価な結果」を返すとか暗黙のグループ
とか色々ツッコミどころはありますがその辺はとりあえず無視で)
831NAME IS NULL:2013/05/09(木) 23:25:42.14 ID:iWf63QvN
mysql5.5使用しております
テーブル結合をした後に最小値を求める勉強しています

テーブルA
uuid,name
1,"田中"
2,"鈴木"

テーブルB
uuid,date
1,"2013-04-04"
2,"2012-03-03"
があるとして
SELECT a.uuid,a.name,MIN( b.date ) FROM a, b WHERE a.uuid = b.uuid
を実行してみると
1,"田中","2012-03-03"というものがかえってきてきてしまいます
832NAME IS NULL:2013/05/09(木) 23:26:32.98 ID:iWf63QvN
申し訳ありません途中で送信してしまいました

1,"田中","2013-04-01"を返してもらう為のsql文を教えて頂けないでしょうか
よろしくお願い致します
833NAME IS NULL:2013/05/09(木) 23:43:22.68 ID:???
04/04 からどうやって 04/01 を導くんだよ? 月初、でいいんか?
834NAME IS NULL:2013/05/09(木) 23:46:43.73 ID:hRjieOLa
MIN( b.date )
これで13年4月を出すのはムリ
835NAME IS NULL:2013/05/09(木) 23:57:17.88 ID:iWf63QvN
申し訳ないです
2、”鈴木”,"2012-03-03" が欲しいと思っています

イメージとして テーブルAとBを結合して
uuid,name,dateになったところで min(date)で一番日付の若い人を見つけようと思っているのですが
うまく行かず
テーブルAの1,"田中"
テーブルBの2,"2012-03-03"
が結果として表示されてしまいます
836NAME IS NULL:2013/05/10(金) 00:03:14.62 ID:???
同じ日付があったら無理だけど、まず、テーブルBから最小の日付をもつレコードのuuidを求めて、
そのuuidでテーブルAと結合。
837NAME IS NULL:2013/05/10(金) 00:57:34.59 ID:H99FPAxg
ありがとうございます

SELECT a.uuid, a.name
FROM a,b
WHERE a.uuid in (select b.uuid,min(b.date) from b)

(select b.uuid,min(b.date) from b) の所をどうすればいいか
テーブルBから最小の日付をもつレコードのuuidを求める方法がわからないのですが
教えて頂けないでしょうか
838NAME IS NULL:2013/05/10(金) 01:08:46.71 ID:6pGPZ1aE
こんな感じでどうでしょうか?

SELECT a.uuid,a.name,b.date
FROM a
INNER JOIN b ON a.uuid=b.uuid
ORDER BY date limit 1
839NAME IS NULL:2013/05/10(金) 01:18:40.11 ID:H99FPAxg
>>838
ありがとうございます
できました!
SELECT a.uuid, a.name, MIN( b.date )
FROM a, b
WHERE a.uuid = ( SELECT b.uuid FROM b ORDER BY date LIMIT 1 )
で同じようなこともできました とても勉強になりました
840NAME IS NULL:2013/05/10(金) 01:25:08.80 ID:???
>>835
>>838で良いと思うが、別方法
>テーブルAとBを結合してuuid,name,dateになったところで min(date)で一番日付の若い人
を素直にSQLで書けば良いだけ
試してないけど
select a.uuid,a.name,b.date from a join b on a.uuid=b.uuid
where b.date=(select min(date) from b)
で行けるはず

mysqlは普通はエラーにならないとダメなSQLが通ったりするからSQLの勉強には向かないと思うぞ
841NAME IS NULL:2013/05/10(金) 01:27:47.76 ID:???
ISO標準に完全に沿って作られてるRDBMSなんてないでしょ
842NAME IS NULL:2013/05/10(金) 01:31:16.94 ID:???
完全にISO標準である必要なんてないけど
どう考えても結果が不定で実行できないSQLをエラーなしで通すのはなぁ

>>839みたいな、とんでもSQLで出来た気になってしまうのは問題だろ
843NAME IS NULL:2013/05/10(金) 01:35:27.33 ID:H99FPAxg
>>840
ありがとうございます
>>840でもで問題なくできました!

>>839
これだめですね
MIN( b.date )がついてたから正しく動いてるように思えただけでした
844NAME IS NULL:2013/05/10(金) 01:39:59.75 ID:???
別にとんでもSQLだとは思わないけど
aテーブルの内容を副問い合わせで表示して
その副問い合わせとは全く無関係なところでb.dateを出しちゃってるから
あんまり良いSQL文だとは言えないかもな
845NAME IS NULL:2013/05/15(水) 12:39:01.19 ID:???
すみません教えてください

【質問テンプレ】
・DB2 9.7

・テーブルデータ
load済。

・欲しい結果
loadしたテーブルを使うサマリ表がエラーとなった場合、
チェックペンディングを解除したい。

・説明
下記の処理を行いました
@テーブルAにデータをロード
Aチェックペンディングになっているのでimmediate checkdをかける
 →こっちは成功で、ステータスが「移動なし」に変わる
BテーブルAを使うサマリー表がチェックペンディング状態になる
Cサマリー表にimmediate checkdをかけたら算術オーバーフローで解除できず。

テーブルAのデータを確認したら集計後オーバーフローする値が入っていました
そこで、テーブルAのデータをupdateなどで操作した上で改めて更新したいのですが、
テーブルAの状態を「正常」に戻すにはどうすればよいでしょうか?
サマリー表に対して色々オプションをつけてset integrityしてみましたが、何が何でもリフレッシュしようとしてエラーになります。

イメージとしては、サマリー表をリフレッシュせずにペンディング解除することで、連鎖的にテーブルAも解除されると思っています
テーブルAだけ単独で解除してデータを更新後サマリー表のチェック解除ということもできるのでしょうか?
846NAME IS NULL:2013/05/15(水) 12:49:30.90 ID:???
IBM DB2 総合スレ2
http://toro.2ch.net/test/read.cgi/db/1166153254/

こっちいったほうがいいかも
847NAME IS NULL:2013/05/15(水) 13:01:09.37 ID:???
>>846
ありがとうございます、そちらに書いてみます。
848NAME IS NULL:2013/05/15(水) 20:46:46.85 ID:sLWZCJrM
UNIOの練習をしております
テーブルa
id,price
aaaa,500

テーブルb
id,price
bbbb,600
rrrr,300

テーブルc
id,price
cccc,700
dddd,1000
eeee,900
のデータが入ってるとして
各テーブルを合体させてその後priceの最小値のレコードを表示させたいと思っております

select id,price from a where price = (select max(price) from a)
union select id,price from b where price = (select max(price) from b)
union select id,price from c where price = (select max(price) from c)

だと各テーブルのpriceの最大値が1個ずつ表示され

select id,min(price) from (
select id,price from a
union select id,price from b
union select id,price from c
)
だと#1248 - Every derived table must have its own alias
と表示されてしまいます

合体させてその後priceの最大を持ってくるsql文を教えていただけないでしょうか
よろしくお願いいたします
849NAME IS NULL:2013/05/15(水) 20:50:21.63 ID:???
誤:min(price)
正:max(price)
でした
850NAME IS NULL:2013/05/15(水) 21:16:03.19 ID:???
エラーメッセージの通りだろ。別名使え。
851NAME IS NULL:2013/05/15(水) 21:25:40.58 ID:???
UNION以前に二つ目のクエリはGROUP BY無しでidとmax()がSELECTリストに並んでいる
のでエラーになるね。

SELECTリストからidを外すか、一つ目のクエリと同様に最大値だけ求めてから絞り込みを
する必要がある。
852NAME IS NULL:2013/05/15(水) 21:42:00.20 ID:???
>>850のとおり。
あと、union all の方がいいとおもうよ。

>>851
mysqlだとgroup byなしでできてしまうかもしれない。気持ち悪い。
853NAME IS NULL:2013/05/16(木) 02:14:12.46 ID:???
>>850
>>851
>>852
ありがとうございます
別名を使い思っていたことができました!
854845:2013/05/17(金) 09:01:16.91 ID:???
>>845
uncheckedすることで解除できました
算術オーバーフローはロードしたテーブルAのデータを修正してからrefreshをかけることで解決
あと、チェックペンディングになっていたのはサマリー表ではなく間にあるステージング表でした
お騒がせしました
855NAME IS NULL:2013/05/17(金) 19:07:27.79 ID:Fw65R92N
HTAアプリで、JavaScriptを使ってMySQLにアクセスしてみました
JSには当然ですがSQLエスケープ用の関数が用意されていないので、自前でしないといけないですが
単に文字列置換でシングルクオートをエスケープするだけでいいのでしょうか?
856NAME IS NULL:2013/05/17(金) 19:26:56.49 ID:boKr6IGa
htaアプリっていうの知らないんだけどjavascriptでアクセスって時点でセキュリティも何もないんじゃないの?
857NAME IS NULL:2013/05/17(金) 19:54:19.31 ID:???
スレ違い。
858NAME IS NULL:2013/05/17(金) 20:07:33.69 ID:???
自分しか使わないローカルなアプリなので、セキュリティのためというよりは、誤動作防止のためですね
859NAME IS NULL:2013/05/17(金) 21:01:40.09 ID:???
どっちにしろSQLの質問じゃねえ
860NAME IS NULL:2013/05/19(日) 08:59:29.04 ID:zWNrczk3
mysqlです
【authors】
--------------------
id   name
--------------------
1    hoge
〜   …
10   fuga

【books】
--------------------------------------
id   author_id  title
--------------------------------------
1     1      foo
…    …      …
10000  10      bar

ここからbookを検索したいのですが
select books.* from books join authors on authors.id = author_id where authors.name like '%word%' or books.title like '%word%';
だと重そうなので
select * from books where title like '%word%' or author_id in (select id from authors where name like '%word%');
な感じなのですがこういうときの定番なやり方ありますか?
861NAME IS NULL:2013/05/19(日) 13:47:02.42 ID:???
>>860
実行計画みたか?
862NAME IS NULL:2013/05/20(月) 00:23:39.38 ID:QJOCjzcl
ワイルドカードに該当する部分をクエリで参照したい場合、どういう方法がありますか?

update table set col0 = 'ワイルドカード部分' where col1 like '%hoge_hoge%'

のようなことをやりたいのです
863NAME IS NULL:2013/05/20(月) 00:24:39.06 ID:???
ワイルドカードが三箇所になってしまいました
hogeとhogeの間の一文字、ということです
864NAME IS NULL:2013/05/20(月) 09:01:16.41 ID:???
正規表現とかマッチした部分抜き出す機能があるdbmsならできるけど。
じゃなきゃ普通はアプリ側じゃないかな
865NAME IS NULL:2013/05/20(月) 09:11:42.59 ID:???
>>862
update table set col0 = col1 where col1 like 'hoge_hoge';
866NAME IS NULL:2013/05/20(月) 09:53:51.86 ID:???
hogeの部分を空文字列に置換すればいいな。
867NAME IS NULL:2013/05/20(月) 11:04:23.26 ID:???
hoge%と%hogeでANDで検索してsubstringとかでhoge消すのか
868NAME IS NULL:2013/05/20(月) 11:25:37.04 ID:???
>>862
これでどうかな
update table set col0 = replace(col1, 'hoge', '') where col1 like 'hoge_hoge';
869NAME IS NULL:2013/05/20(月) 11:39:59.58 ID:???
真ん中にhogeあったらそれも消えちゃうような
870NAME IS NULL:2013/05/20(月) 11:57:56.82 ID:???
汎用的なのは、SQLだけじゃ無理だろうな。
871NAME IS NULL:2013/05/20(月) 17:50:31.02 ID:???
>>869
_にhogeが入るって事?あったら驚きだね
872NAME IS NULL:2013/05/20(月) 22:02:14.82 ID:???
カラム/テーブルに日本語使っている人いますか?
873NAME IS NULL:2013/05/20(月) 22:30:00.97 ID:3Fvcp97C
使う理由がない
874NAME IS NULL:2013/05/20(月) 22:31:29.30 ID:???
続きの質問が気になってしょうがないけど、それはきっと杞憂で、これが本来の質問なんだろうな。
いるよ。
875NAME IS NULL:2013/05/20(月) 22:38:44.86 ID:???
特定の環境でしか作業しない人なら、
日本語のカラム名、テーブル名使う人いそうな気がする。
876NAME IS NULL:2013/05/20(月) 22:44:45.81 ID:3Fvcp97C
いやいや、SQLの質問スレなんだから「いればその方に聞きたいのですが・・・」と続くはず
>>872が気付くのを待ったほうがいい
877NAME IS NULL:2013/05/20(月) 23:21:17.38 ID:???
無理に英語使うより、税区分とかのほうがわかりやすいというのはある。
878872:2013/05/20(月) 23:32:40.01 ID:???
うちの会社で作っているソフトって、全部カラム・テーブルが日本語なんですね
そして、他の会社も同じく日本語を使っていたわけです。

なので、これは一般的なのかな?と疑問に思って質問しました
在庫管理のシステムなのですが、みなさんは英語でやってますか
879NAME IS NULL:2013/05/20(月) 23:40:29.66 ID:???
うちも在庫管理も含めて色んな業務アプリ作ってるけど、
日本語のテーブル名やカラム名なんてありえないよ。
ローマ字ですら少ない。
基本は英単語や短縮形。
Inventoryとか、Qtyとか、DueDateとか。
880NAME IS NULL:2013/05/21(火) 00:25:15.07 ID:???
人生いろいろ、sqlもいろいろ
881NAME IS NULL:2013/05/21(火) 03:13:04.17 ID:???
どこがSQLの質問なの?
882NAME IS NULL:2013/05/21(火) 04:17:28.23 ID:pYPcPelP!
今いる会社はそもそも日本の会社じゃないので当然全部英語だけれども、それ以外にも
専ら規約ベースのORMを使うのでテーブル名やカラム名をアプリのコード内で使われて
いるドメインクラス名やそのプロパティ名と可能な限り一致させているという事情もある。
クラス名やプロパティ名が英語なのでテーブルやカラムの名前も自動的に英語になる。

日本語での開発であっても例えばJavaだとHibernateなどJPA系のORMを使うのであれば
英語のテーブル名カラム名を使った方が断然楽だと思う。
さもなければ名前マッピングを全部書き下すか、開発者にクラス名等々に日本語を使えと
お願いすることになりそう(日本語のクラス名等でORMがきちんと動くかも謎)。
883NAME IS NULL:2013/05/21(火) 07:36:41.18 ID:???
スレ違いネタはいらないから。
884NAME IS NULL:2013/05/21(火) 15:27:26.22 ID:???
つか、専用のスレ立ってるじゃん。
そっち書けばいいじゃん。
じゃんじゃん。
885NAME IS NULL:2013/05/21(火) 19:22:19.07 ID:???
t1
ID    KEY    HOGE
-----------------------
1     a      5
1     b 7
2     a 5
2     b 8
3     a 4
3     b 4
4     b 9
4     d 2

t2
ID    KEY    PIYO
-----------------------
1     a 7
1     b 1
1     c 1
1     d 5
2     a 2
2     c 8
3     a 7
4     c 6

t3
ID    KEY    NYAN
-----------------------
1     d 5
2     a 5
2     d 7
3     b 4
3     c 3
3     d 2
4     d 7
5     b 1

こういう3つのテーブルから
t1で KEY a b を
t2で KEY c を
t3で KEY d且つNYAN 5以上を持っているID1と2のみを取り出したいのですがどうすればいいでしょうか
886NAME IS NULL:2013/05/21(火) 19:25:23.25 ID:???
なんだか崩れてしまいましたすみません
t1
ID    KEY    HOGE
-----------------------
1     a      5
1     b      7
2     a      5
2     b      8
3     a      4
3     b      4
4     b      9
4     d      2

t2
ID    KEY    PIYO
-----------------------
1     a      7
1     b      1
1     c      1
1     d      5
2     a      2
2     c      8
3     a      7
4     c      6

t3
ID    KEY    NYAN
-----------------------
1     d      5
2     a      5
2     d      7
3     b      4
3     c      3
3     d      2
4     d      7
5     b      1
887NAME IS NULL:2013/05/21(火) 19:28:20.59 ID:???
>>885-886
JOINすればいいよ。
888NAME IS NULL:2013/05/21(火) 19:58:43.08 ID:???
>>6してからJOINだな
889NAME IS NULL:2013/05/21(火) 20:12:30.14 ID:???
まぁJOINって何? なんだろうけど。
運が良ければ誰かがSQL書いてくれるかもしれないしな。
890NAME IS NULL:2013/05/21(火) 20:27:50.23 ID:4o/NXjFR
SQL書くのは楽なんだけどテスト用のデータベース作るのが面倒くさい
891NAME IS NULL:2013/05/21(火) 21:26:04.73 ID:???
テーブルの結合条件がわからん
最終的に欲しいデータもよくわからん
検索条件っぽいのもわからん
t1で KEY a b を どうなの?
t2で KEY c を どうしたいの?

t3で KEY d且つNYAN 5以上を持っているID1と2のみを取り出したい
select * from t3 where KEY=d and NYAN>5 and ID in (1,2)
892NAME IS NULL:2013/05/21(火) 21:29:34.50 ID:4o/NXjFR
IDがユニークじゃない…
893872:2013/05/22(水) 00:01:12.70 ID:???
英語だとこんな感じになりますか?

商品コード → ProduceCode
納入先住所1/2/3 → CustormZip1/2/3
在庫数(総バラ) → Piece
在庫数(ケース数) →Unit
----------------------------------------------
テーブル名
出庫依頼 → info_order_list
894NAME IS NULL:2013/05/22(水) 00:22:39.30 ID:???
>>893
スレ違い。
895NAME IS NULL:2013/05/22(水) 00:35:15.77 ID:???
oracle形式で明細テーブルのコード、区分をキーに、
コードマスタの名称を2種類を外部結合で取得したいです。
何か足りないようでエラーになります。宜しくお願いします。

select
親テーブル .親コード
子テーブル.コード
a.名称
b.名称
from
親テーブル
子テーブル
コードマスタ a
コードマスタ b
where 親テーブル.親コード =子テーブル.親コード
and 明細テーブル.コード =a.'ZZ'
and 明細テーブル.コード =a.コード (+)
and 明細テーブル.コード =b.'YY'
and 明細テーブル.コード =b.コード (+)
896NAME IS NULL:2013/05/22(水) 00:52:27.47 ID:???
897NAME IS NULL:2013/05/22(水) 01:49:55.42 ID:???
>>893
あまりにも違いすぎる。わざと間違えてるとしか考えられん。
商品はItem
納入先≠顧客=Customer≠Custorm
住所≠郵便番号=ZipCode
出庫依頼=ShippingOrder
PieceとUnitの使い方も変よ。
898NAME IS NULL:2013/05/22(水) 12:28:00.00 ID:???
で、いつまでスレ違い続けるの?
899NAME IS NULL:2013/05/22(水) 13:29:28.02 ID:SXOouUvj
お前がぶり返さなきゃ終わってたよ
900NAME IS NULL:2013/05/22(水) 18:24:07.93 ID:SXOouUvj
t1:
id data1 data2 data3
11 good bad  bad
12 bad  good bad
13 good bad  good

t2:
data score
good 100
bad  0

2つのテーブルがあり、t1にidに対する各データに対する評価
t2にはその評価に対する点数が入っています。
ここからテーブルを結合し、t1.idに対する、data1,data2,data3の点数を拾いたいと思っています。
その際、この場合は3回結合するしかないのでしょうか?
901NAME IS NULL:2013/05/22(水) 18:33:00.93 ID:???
>>899
くだらねー質問してんじゃねーよ
902NAME IS NULL:2013/05/22(水) 18:34:03.54 ID:SXOouUvj
やっちゃったな・・・ID
903NAME IS NULL:2013/05/22(水) 18:45:02.30 ID:???
基本的にはそうだろうけど、オプティマイザがうまいことやってくれそうな気がするな。
904NAME IS NULL:2013/05/22(水) 20:26:29.11 ID:???
>>6で逆にAもBもCも持っていない、ID:02と03を取り出すにはどうしたらいいんですか?
905NAME IS NULL:2013/05/22(水) 20:32:19.84 ID:???
間違えました
>>6と逆のパターンで

(問)
ID HOGE
01 B
01 E
02 A
02 F
03 C
03 G
04 D
04 F


ここからAもBもCも持っていない、ID:04を取り出すにはどうしたらいいんですか?
906NAME IS NULL:2013/05/22(水) 20:33:53.42 ID:???
Havingで3にならないやつ。
907NAME IS NULL:2013/05/22(水) 20:43:30.18 ID:???
Having 4以上なら当然無し
2ならA,B,Cの中からどれか2つを持っている値
1ならA,B,Cの中からどれか1つを持っている値になりますよね
Hving 0では当然駄目ですが
0でA,B,Cの中からどれか0個を持っている値を得られるならそれを得たいんです
よろしくお願いします
908NAME IS NULL:2013/05/22(水) 20:46:52.51 ID:???
not in でいいだろ。
909NAME IS NULL:2013/05/22(水) 21:34:31.02 ID:???
>>907
A,B,Cのどれかひとつでも持っているIDの一覧を取得し、
その一覧にないIDを選択
910NAME IS NULL:2013/05/22(水) 22:05:30.10 ID:???
NOT INでは無理です

>>909
直接得るの難しいですか
ありがとうございます
911NAME IS NULL:2013/05/22(水) 23:49:44.38 ID:???
>>910
こんな感じじゃないかな
SELECT distinct id
FROM TableName
WHERE id not in
(SELECT id
FROM TableName
WHERE hoge in ('A','B','C'));
912NAME IS NULL:2013/05/23(木) 16:03:38.70 ID:???
>>911
ありがとうございます
913NAME IS NULL:2013/05/23(木) 23:13:06.09 ID:???
SQL Serverでストアド書くときどのように書いてますか?
OracleだとPACKAGEがあるのでVBっぽく書けますが、SQL Serverはちょっとイメージがつかないです。
914NAME IS NULL:2013/05/24(金) 05:44:07.05 ID:???
ゆとりw
915NAME IS NULL:2013/05/24(金) 07:56:45.91 ID:???
春だからな。
916NAME IS NULL:2013/05/25(土) 01:29:45.90 ID:???
>>914
とりあえず、罵るならば教えて下さい
917NAME IS NULL:2013/05/25(土) 06:23:04.93 ID:???
馬鹿には無理
918NAME IS NULL:2013/05/25(土) 07:55:22.71 ID:???
馬鹿には無理さんてここにもいたのか
919NAME IS NULL:2013/05/25(土) 09:15:52.67 ID:???
スレ違い。
920NAME IS NULL:2013/05/26(日) 11:03:25.36 ID:???
Microsoft SQL Server 総合スレ 9
http://toro.2ch.net/test/read.cgi/db/1310645522/

SQLと名がつくもの持ってくるやつ多すぎる。>>1読むとか
自分が使ってるものをSQLと省略するのやめるとかしてくれ
921NAME IS NULL:2013/05/26(日) 11:51:41.78 ID:???
過疎ってるからなんでしょ。
922NAME IS NULL:2013/05/26(日) 14:38:03.09 ID:???
SQL Serverスレでスルーされてただけだろ
このスレでストアドが対象外だと思うならスルーしとけば
923NAME IS NULL:2013/05/26(日) 14:39:52.48 ID:???
スルーされるだけだから親切心で言ってるんだろ
924NAME IS NULL:2013/05/26(日) 14:46:44.55 ID:???
ストアドは対象外。
925NAME IS NULL:2013/05/27(月) 03:01:24.47 ID:qPx1TzON
MySQLでの並べ替えについてなのですが
score | address
200  おおさか
350  きょうと
180  ひょうご
100  おおさか
150  きょうと

↓↓
score | address
100  おおさか
200  おおさか
150  きょうと
350  きょうと
180  ひょうご

addressの中の最小値でソートして、最小値に続けて同じaddressの値をscore順に並べていくというソートを行いたいのですが、どのようなSQLが書けますか?
926NAME IS NULL:2013/05/27(月) 03:02:21.54 ID:qPx1TzON
> addressの中の最小値

訂正
同じaddressの中のscoreの最小値
927NAME IS NULL:2013/05/27(月) 06:30:16.13 ID:???
group by
928NAME IS NULL:2013/05/27(月) 06:54:55.87 ID:WSymPYad!
こんな感じかな。

SELECT T.score, T.adress
FROM T, (
 SELECT MIN(score) as minscore, adress
 FROM T
 GROUP BY T.address
) S
WHERE T.adress = S.adress
ORDER BY minscore, address, score

ORDER BYにaddressも入っている点がポイント。これが入っていないと
同じ最小値を持つadressが複数ある場合に期待したように動かない。
929NAME IS NULL:2013/05/27(月) 10:48:34.05 ID:???
なんだかクレージーな印象
930NAME IS NULL:2013/05/27(月) 11:43:00.42 ID:???
>>929
「最小値でソートして」という所が問題なんだろ。
931NAME IS NULL:2013/05/27(月) 17:47:12.66 ID:???
order by address desc,score desc
でダメなん?
932NAME IS NULL:2013/05/27(月) 19:26:45.44 ID:???
>>931
180  ひょうご ← 120だったら、きょうとの前にこないといけない
933NAME IS NULL:2013/05/28(火) 00:32:05.46 ID:???
>>932
?
934NAME IS NULL:2013/05/28(火) 00:41:47.64 ID:???
200  おおさか
350  きょうと
120  ひょうご ←並べ替えの評価に使う(2番)
100  おおさか ←並べ替えの評価に使う(1番)
150  きょうと ←並べ替えの評価に使う(3番)

         ↓

100  おおさか ←並べ替えの評価に使う(1番)
200  おおさか
120  ひょうご ←並べ替えの評価に使う(2番)
150  きょうと ←並べ替えの評価に使う(3番)
350  きょうと
935NAME IS NULL:2013/05/28(火) 01:08:13.15 ID:???
>>933
アスペ?社会で苦労してない?
936NAME IS NULL:2013/05/28(火) 03:29:59.07 ID:???
>>935
この程度のことも分からずにプログラマやっていけてる?
体裁は良くないが、聞きたいことと内容は明確だろ。
937NAME IS NULL:2013/05/28(火) 03:30:47.95 ID:pJTxBQZ+
>>936
何を言ってるんだお前は
938NAME IS NULL:2013/05/28(火) 10:43:35.48 ID:???
アンカー間違ってるのか読む場所間違ってるのか区別付かんなw
939NAME IS NULL:2013/05/28(火) 13:25:42.53 ID:???
こういうの、ウィンドウ関数できれいに書けたりするのかな?
あれが独自拡張なのか標準SQLにあるものなのかわかんないけど

>>936が安価ミスなのか、安価の先を見誤ったか、はたまた別かわからなくてもやっとする
プログラマならバグ直してください
940NAME IS NULL:2013/05/28(火) 14:37:31.84 ID:/5K6eTVe!
>>939
窓関数はSQL2003から標準だけれどもどのRDBMSでも実装されているかは微妙。
無難にSQL92の範囲で書くなら>>928みたいなサブクエリーを使う書き方になる。

でも確かに窓関数使うとスッキリ書ける。

SELECT score, address FROM T
ORDER BY MIN(score) OVER (PARTITION BY address), address, score
941NAME IS NULL:2013/05/28(火) 14:43:05.32 ID:???
>>940
SQL2003からなのね。ありがとです。
すごいすっきりしてるし直感的だ、やっぱ使えるようにしとかないと。重ね重ねどもでした
942NAME IS NULL:2013/05/29(水) 02:10:40.00 ID:???
再帰構造のテーブルをSQLで辿る事は可能でしょうか?

id parent value
1 null aaa
2 1 bbb
3 2 ccc
4 3 ddd
5 2 eee

このようなテーブルで4の親を辿って最初にid in (1,2)を満たすvalue(bbb)を探したいです。
DBはpostgresql9.3betaです。
943NAME IS NULL:2013/05/29(水) 05:43:04.35 ID:???
944NAME IS NULL:2013/05/30(木) 18:21:17.05 ID:zDo8DD4s
DB: oracle10g

テーブルにprimary key 制約(以下pk制約)を作成すると、
pk制約と同じ名前のunique indexが作られます。

このunique indexの名前をpk制約作成時に指定することは出来ますか?
作成後にalter indexで変更できることは確認済みです。

alter table TableA add constraint PK_CONST primary key (...);

select * from user_constraints where table_name = 'TableA';
select * from user_indexes where table_name = 'TableA';
pk制約、indexともに'PK_CONST'の名前になっている。
945NAME IS NULL:2013/05/30(木) 19:19:25.31 ID:???
>>944
マニュアル読め。
すぐわかるよ。
946NAME IS NULL:2013/05/30(木) 19:20:33.87 ID:???
create table TableA (COLNAME number constraint PK_CONST primary key);
947NAME IS NULL:2013/05/30(木) 20:37:33.32 ID:???
制約名とインデックス名を違う名前にしたいという話なら
unique indexを先に作れば
 primary key using index インデックス名
でできるにはできるけど
948NAME IS NULL:2013/05/31(金) 14:07:44.38 ID:???
>>945-947
ありがとうございました。
(1) create table
(2) create unique index
(3) alter table add constraint primary key using index
の順番で意図したことが実現出来ました。
949NAME IS NULL:2013/05/31(金) 14:12:47.69 ID:???
一応、下記の方法でも可能でした。
DDLが分かれている方が都合が良かったので採用してません。

create table aaa (
a int,
constraint pk_const primary key (a)
using index (create unique index index_const on aaa(a))
);
950NAME IS NULL:2013/06/07(金) 17:32:29.57 ID:yGnvQyXR
可能な限り、DB依存になるような構文を書きたくないんだけど
DB依存構文検出チェッカーみたいなのって、世の中にある?
951NAME IS NULL:2013/06/07(金) 19:10:38.63 ID:???
OracleならALTER SESSION SET FLAGGERでチェックできるけど他は知らない
http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_2013.htm#SQLRF53054
952NAME IS NULL:2013/06/09(日) 13:39:06.60 ID:DY/9Y4Gb
MySQLについての質問です。

highscoreというテーブルに、id, scoreという2つのカラムがあります。
idのインデックスはPRIMARYです。

POSTでidとscoreの値が送られてきたとき、
そのidが既に登録されている場合、送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、
送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたいのですが、
条件分岐の部分でどのようなSQLを書けばよいのか検討がつきません。

何かヒントをいただければ幸いです。よろしくお願いします。
953NAME IS NULL:2013/06/09(日) 13:44:44.36 ID:???
SQLじゃなくてストアドでやる話。
954NAME IS NULL:2013/06/09(日) 13:53:35.12 ID:???
そんなたいそうなもんじゃなかろう。
やり方は色々思いつくけど、SQL文を2つ発行するのが初心者向けかな。
955NAME IS NULL:2013/06/09(日) 14:08:34.74 ID:???
SQL二つ発行するのは、本来なら分離レベルとかロック制御とか考慮しないといかん
最近のDBMSなら1文で出来るやつもあるから、MySQLで使えるかどうか調べてみたら
upsertとか、mergeとか言われてるやつな
956NAME IS NULL:2013/06/09(日) 14:12:44.99 ID:???
957NAME IS NULL:2013/06/09(日) 14:54:03.65 ID:???
>>952
idが 1 で、入れようとしている score が 9999 の場合

INSERT INTO highscore (id, score) VALUES (1,9999)
ON DUPLICATE KEY UPDATE score = IF(score<9999, 9999, score);

でできると思います。

存在しない id ならそのまま INSERT、存在する id ならば IF で
DBの score より大きければその値を、同じか小さければ元の値でUPDATE。
ちょっとスマートじゃないね。
958952:2013/06/09(日) 17:45:07.54 ID:???
御回答いただいた皆様大変ありがとうございました。
>>957さんの方法で実装できました。
scoreが更新されていなくてもUPDATEするのが無駄に思えますが、
とりあえずこれで運用してみます。
ストアドプロシージャについても調べてみます。
ありがとうございました。
959NAME IS NULL:2013/06/13(木) 04:44:36.45 ID:gtAIlzh6
質問させてください

アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです
アマゾンと少し違うのは、商品そのものの評価ポイントではなく、
商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです

まとめると、
・特定の出品者の出品した商品の評価ポイントの平均値をとる
・同時に、レビューの件数をとる
・判明してるキーはt_prof.keyのみです

テーブルは以下の通り。

レビューtable =t_review
===============================
reviewId -- int(11) :プライマリキー、auto_increment
workId -- int(11) :商品のID
userId -- int(11) :出品者のID
point -- tinyInt(1):評価ポイント(1〜5)

出品者プロフィールtable =t_prof
===============================
userId -- int(11) :プライマリキー、auto_increment
namae -- text :出品者の名前
key -- int(3):キー。ユニーク

どんなクエリを書いたらいいんでしょうか
すみません、よろしくお願いします
960NAME IS NULL:2013/06/13(木) 06:28:46.99 ID:???
1回の出品に対する評価は何回?
複数のの出品者が「同じ商品」を複数個出品することがある?
「判明しているキー」に「プライマリーキー」が含まれていないが?

「サンプルデータ」と「欲しい結果」を出してくれ
961NAME IS NULL:2013/06/13(木) 07:49:21.31 ID:???
これだけなら、出品者IDでgroup byしてavgとcountでよくないか?
962NAME IS NULL:2013/06/13(木) 12:35:34.28 ID:???
where userId = (select userId from t_prof where key = 判明しているキー)
963NAME IS NULL:2013/06/13(木) 14:54:41.42 ID:???
select p.namae,avg(r.point),count(r.point) from t_review r,t_prof p where r.userid=p.userid group by r.userid;
こんなんでどお?
964NAME IS NULL:2013/06/13(木) 16:31:55.01 ID:???
動かしてないけど、p.namaeがgroup byにないってエラーがでそう。
mysqlだったらどれかひとつが勝手に選ばれるという話だったかも
965NAME IS NULL:2013/06/13(木) 17:04:47.70 ID:???
>>959
t_prof.keyは何に対してユニークなんだ

評価はNULLはあり得るのかとかその場合は評価件数に加えるのかとか
いろいろ詰まってないところがあるが

select t_prof.userId,count(*),avg(point)
from t_review join t_prof on t_review.userId=t_prof .userId
where t_prof.key=判明してるキー
group by t_prof.userId

とかで良いんじゃね
966NAME IS NULL:2013/06/14(金) 00:54:00.66 ID:???
始めたばかりでググりましたがよくわかりません

結果がなしなのを0で返したいのです
T-sql
select @test=data from db where 除外内容

宣言済のtestに0か数字を入れたいのです
967NAME IS NULL:2013/06/14(金) 07:01:35.51 ID:???
sumなりで返せばいいだろ。
968NAME IS NULL:2013/06/14(金) 14:56:51.65 ID:???
>>966
SQLの話から外れるけど、ホスト言語側で大概、結果のレコード数を返す
関数が用意されているから、それで見るのが比較的常套だと思うけど。
それをサブクエリーにして、レコード数を集めたりしているのであれば
count()を使えばいいんじゃないかね。
969NAME IS NULL:2013/06/14(金) 15:13:06.98 ID:???
>>966
ISNULL関数使え
つか特定DBの話はそこで聞け
>>967
SUMは対象が全てNULLならNULL返す
>>968
あれレコード数見てるんじゃないぞ
970959:2013/06/14(金) 23:24:15.62 ID:???
>>960-965
ありがとうございます
COUNTやAVGの使い方を復讐しつつそれぞれ参考にさせていただきます
971NAME IS NULL:2013/06/15(土) 00:36:10.01 ID:???
復讐は何も生まないよ
972NAME IS NULL:2013/06/15(土) 00:40:31.73 ID:???
Revengeコマンド、作る?
973NAME IS NULL:2013/06/15(土) 01:16:17.07 ID:???
Living Well Is The Best Revenge
974NAME IS NULL:2013/06/15(土) 16:04:10.91 ID:FktO2NAp
どなたかお願いいたします。
私初心者で「ゼロから始めるデータベースSQL」という本で勉強をしています。付属のソフトをインストールしてパスワードを入れて書いてある通りにやってるんですが最初のテーブルを作るところでエラーが出てしまい困ってます。

Create table shohin;

と入れると
";"またはその近辺でエラーと出ます。

これはなぜでしょうか。

よろしくお願いします。
975NAME IS NULL:2013/06/15(土) 16:15:53.30 ID:FktO2NAp
すみません。

中身何も入れてないからか!?と思い、書いてある通りに入れたら、

プライマリキーはテーブル"shohin"に暗黙的なインデックス"shohin_pkey"を作成します

と出たのですが、これはテーブルを作成できたんでしょうか
976NAME IS NULL:2013/06/15(土) 16:19:55.22 ID:FktO2NAp
ごめんなさい。

できてるみたいです

日本語でおKって話ですよね

初心者すぎました

すみません!
977NAME IS NULL:2013/06/15(土) 18:44:48.32 ID:???
書いてる通りにやってないだろ。
978NAME IS NULL:2013/06/15(土) 20:07:55.82 ID:???
初心者に素直さを期待してはいけない
979NAME IS NULL:2013/06/16(日) 15:16:09.35 ID:???
本当の初心者は、めんどくさそうな手順は後からやろうと飛ばすものだ。
980NAME IS NULL:2013/06/16(日) 15:20:19.75 ID:???
問題は飛ばしたことをすっかり忘れることだなw
981NAME IS NULL:2013/06/16(日) 15:21:55.25 ID:uKsaBYgK
中身何も入れてないってどういうこっちゃ?
データベース作ってないのにテーブル作ろうとしたのかこいつ
982NAME IS NULL:2013/06/16(日) 17:11:49.11 ID:???
> Create table shohin;
って書いてるだろうw
983NAME IS NULL:2013/06/16(日) 19:27:33.70 ID:???
>>981
カラム定義
列は後回しにして、とりあえずテーブルを作ってみようって思ったのかも。
984NAME IS NULL
斬新な発想だな。
プロには想像もつかない。