5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

SQL質疑応答スレ 13問目

1 :NAME IS NULL:2012/08/02(木) 18:24:41.45 ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 12問目
http://toro.2ch.net/test/read.cgi/db/1316769778/

2 :NAME IS NULL:2012/08/02(木) 18:25:42.29 ID:???
SQL言語リファレンス一覧
Oracle Database
http://docs.oracle.com/cd/E16338_01/server.112/b56299/toc.htm
Microsoft SQL Server
http://msdn.microsoft.com/ja-jp/library/bb510741
IBM DB2 Database
http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html
PostgreSQL
http://www.postgresql.jp/document/current/html/sql.html
MySQL
http://dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html


参考リンク
http://sql.main.jp/cont/sql/map.html
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://www.geocities.jp/oraclesqlpuzzle/
http://www.techscore.com/tech/sql/

3 :NAME IS NULL:2012/08/02(木) 18:26:42.31 ID:???
過去スレ
12問目:http://toro.2ch.net/test/read.cgi/db/1316769778/
11問目:http://hibari.2ch.net/test/read.cgi/db/1299305530/
10問目:http://hibari.2ch.net/test/read.cgi/db/1274791771/
9問目:http://pc11.2ch.net/test/read.cgi/db/1252492296/
8問目:http://pc11.2ch.net/test/read.cgi/db/1236253554/
7問目:http://pc11.2ch.net/test/read.cgi/db/1223525474/
6問目:http://pc11.2ch.net/test/read.cgi/db/1210940477/
5問目:http://pc11.2ch.net/test/read.cgi/db/1193486961/
4問目:http://pc11.2ch.net/test/read.cgi/db/1176553195/
3問目:http://pc11.2ch.net/test/read.cgi/db/1160458216/
2問目:http://pc8.2ch.net/test/read.cgi/db/1141622643/
帰ってきた:http://pc8.2ch.net/test/read.cgi/db/1124178925/
Part 2:http://pc8.2ch.net/test/read.cgi/db/1103113155/
初代:http://pc8.2ch.net/test/read.cgi/db/1056973582/

4 :NAME 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
;

5 :NAME 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
;

6 :NAME 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によって文法がかなり違うので注意

7 :NAME 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

8 :NAME 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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。

9 :NAME IS NULL:2012/08/02(木) 18:32:54.66 ID:???
以上、テンプレ終わり

10 :NAME IS NULL:2012/08/02(木) 22:45:47.58 ID:???

前スレはすまんかった

11 :NAME IS NULL:2012/08/03(金) 12:56:34.37 ID:???
>>1
同じく申し訳ない。スレチ話題進行させてしまった。


12 :NAME IS NULL:2012/08/03(金) 13:26:20.86 ID:???
どうも

やっぱ前スレの984は無理ですかね

13 :NAME IS NULL:2012/08/03(金) 13:36:03.76 ID:???
>>12
前スレにちゃんとレスあるよ。
あとは自分でdatetimeをフォーマットする関数見つけてくればいいだけだよ。
か、もしくは文字列として扱って文字数で切ってもいいと思うけど。
それをDISTINCT付けて呼び出せばいいだけ。

14 :NAME IS NULL:2012/08/03(金) 13:41:33.57 ID:???
>>13
なるほどわかりました
DateTimeをフォーマットして時刻を切り捨ててDistinctすれば良いってことですね
やってみますどうもです

15 :NAME IS NULL:2012/08/03(金) 20:01:37.38 ID:???
SQLServerならConvertで111だな

16 :NAME IS NULL:2012/08/07(火) 20:58:23.91 ID:???
http://26g.jp/u/0Fkn6uDJ

17 :NAME IS NULL:2012/08/08(水) 11:58:29.60 ID:???
>>16
商用リンク
踏むべからず

18 :NAME 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

ここで、ある期間において注文してくれた顧客数(重複を排除したユニーク数)を知るにはどうしたらいいでしょうか。


19 :NAME 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'

20 :NAME IS NULL:2012/08/09(木) 15:12:05.44 ID:???
>>19
すみません、正しくは「ある期間において注文してくれた顧客数(重複を排除したユニーク数)を *日付ごとに* 知るにはどうしたらいいでしょうか」でした。

21 :NAME IS NULL:2012/08/09(木) 15:55:47.25 ID:???
少しは応用しろよ

22 :NAME 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;

試してないので無保証

23 :NAME IS NULL:2012/08/09(木) 19:19:21.61 ID:???
>>22
副問い合わせ使うんですか、なるほど!
あとgroup by使わなくてもdistinctでいけるんですね。大変勉強になりました。
ありがとうございました。

24 :NAME IS NULL:2012/08/09(木) 20:52:38.40 ID:???
副問い合わせ使わんでも、COUNT(DISTINCT customer_id)でいける気がするんだが

25 :NAME IS NULL:2012/08/09(木) 23:48:45.75 ID:???
質問しに来たら「よくある質問1」がドンピシャだった

26 :NAME 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);

27 :NAME IS NULL:2012/08/11(土) 00:10:17.78 ID:???
仕事柄毎日SQLをごりごりしてるんだけど未だに苦手な小計なんですが
グルーピングIDの番号って何か規則性があるんでしょうか?
小計中計大計とか出す時いつも結果を見ながらグルーピングIDの番号を調べているんですが面倒臭くて
SQLをメンテすると番号変わったりするし大嫌いなんだけどパフォーマンスを考えたらロールアップ以外の選択肢は無いし

28 :NAME IS NULL:2012/08/11(土) 00:36:14.55 ID:???
>>27
自分がつかってるDBMSが何かもわからないのか?
まずそのマニュアル見ろよ

ORACLEとSQL Serverで見る限りではGROUPING_IDは指定した各項目がビットに割り当てられる数値っぽいが
2進数解らんのか?

29 :NAME IS NULL:2012/08/11(土) 01:05:45.89 ID:???
なんでそんな態度悪いの?

30 :NAME IS NULL:2012/08/11(土) 01:39:01.89 ID:???
にちゃんなんてこんなもんだろ。

優しく対応して欲しいなら、Oracle なり MS のセミナーとかに行けよ。

31 :NAME IS NULL:2012/08/11(土) 01:48:19.45 ID:???
2chだからわざと態度悪くしてるの?

32 :NAME IS NULL:2012/08/11(土) 02:01:41.10 ID:???
この程度で態度悪いと思うなら見ない方が良いと思うぞ

33 :NAME IS NULL:2012/08/11(土) 10:47:39.97 ID:???
出た見ないほうがいい

34 :NAME IS NULL:2012/08/11(土) 11:02:18.90 ID:???
自分で調べたりしないくせに人に優しく教えるよう強要するって図々しいなあ

35 :NAME IS NULL:2012/08/11(土) 11:12:59.51 ID:???
何でこのスレにいるんだ

36 :30:2012/08/11(土) 11:16:04.73 ID:???
>>28 なんて、ちゃんと答え書いてあるし、まっとうな回答だと思うが。

そもそも、会社で先輩に聞いてもこんな回答だろ。

37 :NAME 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

よろしくおねがいします。


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

SET ANSI_WARNINGS OFF

39 :37:2012/08/11(土) 13:36:24.71 ID:???
〉38
実行したら警告出なくなりました。
ありがとうございます。

40 :NAME IS NULL:2012/08/11(土) 13:48:41.11 ID:???
それでいいんだ…

41 :NAME IS NULL:2012/08/12(日) 10:11:09.13 ID:???
>>28はきっと小計の出し方しらなかったと思う、んで知ったかぶりするためにすぐ調べた
でも難しくてムキー


42 :NAME IS NULL:2012/08/12(日) 12:34:34.20 ID:???
>>41
お前そんなに悔しかったのか?w

43 :NAME 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 のトマトの価格を取ってくる

よろしくお願いします。

44 :NAME 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
;

45 :NAME IS NULL:2012/08/16(木) 17:14:05.07 ID:???
>>44
素早い回答有り難うございます!ちょっと試してみましたが何とかなりそうです!

46 :NAME IS NULL:2012/08/17(金) 14:37:49.68 ID:???
EXISTSとINの違いをわかり安く教えてもらえませんか?

47 :NAME IS NULL:2012/08/17(金) 17:18:36.53 ID:???
一緒です

48 :NAME IS NULL:2012/08/17(金) 17:19:11.91 ID:???
というのは嘘です

49 :NAME IS NULL:2012/08/17(金) 18:50:01.07 ID:???
INは項目、EXISTSは行

50 :テキトーですいませ〜ん:2012/08/17(金) 23:15:14.73 ID:???
NULLを含む含まないで違うんじゃなかった?

51 :NAME IS NULL:2012/08/18(土) 03:33:12.84 ID:???
少し前に簡単な表で説明してくれてたが何だったかなあ

52 :NAME 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');


よろしくお願いします。


53 :NAME IS NULL:2012/08/18(土) 14:33:32.71 ID:???
>>52
SQL Server なら FROM で書けるけど
他DBは知らない

54 :NAME IS NULL:2012/08/18(土) 16:26:19.95 ID:???
標準SQLではjoinはfrom句かmerge文のusing句にしか書けず、
from句はselect文(かサブクエリ)にしか書けない

55 :NAME 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
これで解決できました。

56 :NAME 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

57 :NAME IS NULL:2012/08/20(月) 12:42:20.31 ID:???
>>56
t1とt2で直積取って、それにt3を外部結合
SQLite3ってCROSS JOIN使えたっけ?


58 :56:2012/08/20(月) 12:47:20.36 ID:???
>>57
cross joinは使えるみたいです
外部結合はleft outer joinが使えるらしいので試したのですが
使い方が悪いのかleft joinと結果が同じでした
ちょっとcross joinでいろいろ試してみます

59 :NAME IS NULL:2012/08/20(月) 12:53:48.24 ID:???
>>58
left outer joinとleft joinは同じだぞ。outerが省略されただけ
t1とt2をcross joinしてからt3をleft joinするんだ

60 :NAME IS NULL:2012/08/24(金) 02:20:07.64 ID:vyiuPUqc
マテビューでセレクトする項目に空白を含めたいのですが、可能でしょうか?

61 :NAME IS NULL:2012/08/24(金) 05:06:26.49 ID:???
可能です

62 :NAME IS NULL:2012/08/24(金) 06:02:53.93 ID:vyiuPUqc
では、セレクトするのは空白・型は日付型にできるでしょうか

63 :NAME IS NULL:2012/08/24(金) 09:02:34.58 ID:???
お前の使ってるDBMSの日付型が空白を許容するなら可能

64 :NAME IS NULL:2012/08/24(金) 18:28:51.27 ID:vyiuPUqc
>>63
神様!
ありがとうございます!

65 :NAME IS NULL:2012/08/25(土) 21:43:10.85 ID:???
え、マテビューで空白のselectって無理じゃない?

66 :NAME IS NULL:2012/08/26(日) 21:04:43.22 ID:wqfUioWl
>>65
SELECTする取得元の項目がNOT NULLでなければいけた気がするよ

67 :NAME 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

「(」をカットだけすれば、とりあえず他テーブル情報を取得または更新されることは防げるでしょうか?

68 :NAME IS NULL:2012/08/27(月) 12:30:24.60 ID:???
スレ違いだし、そのレベルでは話にならん

69 :NAME IS NULL:2012/08/27(月) 19:44:35.26 ID:???
いいカモだなw

70 :NAME 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回にしたいです。お願いします。

71 :NAME IS NULL:2012/08/28(火) 12:40:11.93 ID:???
1回ってINSERT文みたいにつなげたいってこと?
そのまま1行ずつ書いて、BEGIN ENDで挟むだけじゃだめかね。

72 :NAME 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;

73 :NAME IS NULL:2012/08/28(火) 13:12:29.34 ID:???
×ご私的
○ご指摘

74 :70:2012/08/28(火) 13:21:10.26 ID:???
なぜそうしたいかというのは、「UPDATE大量発行より1回の発行のほうが軽いだろJK」という思い込みが理由なので、
もし何らかの方法があるとしても負荷は大して変わんねーよということであれば>>72のでもいいです。
(UPDATE対象は1万レコードくらい、カラムは数個)

75 :NAME 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;

76 :70:2012/08/28(火) 17:22:36.39 ID:???
>>75
ありがとうございました!

77 :NAME IS NULL:2012/08/28(火) 17:46:24.67 ID:???
まずDBにワークテーブル作って、そこにCSVの内容突っ込んでから
SQLで更新かければ、更新のSQLは1行ですむぞ


78 :NAME IS NULL:2012/08/28(火) 18:00:00.55 ID:???
同じ名前が複数あったとき困る気がする、、スクリプトで排除するのかな

79 :NAME IS NULL:2012/08/29(水) 16:53:03.81 ID:???
大体、単価をマスターに含めること自体が
部分関数従属がだな

80 :NAME IS NULL:2012/08/29(水) 19:18:39.62 ID:???
って、確認せずに書いてもいないことを思い込みで進めて、後で困るパターン。

81 :NAME 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つあるので結合出来ないです。

82 :NAME IS NULL:2012/08/31(金) 18:07:06.69 ID:???
t2のカラム名おかしくね?

t2にt1を2回JOINするだけだと思うけど

83 :NAME IS NULL:2012/08/31(金) 18:48:29.22 ID:???
同じテーブルを複数JOINできるよ

84 :NAME IS NULL:2012/08/31(金) 19:14:46.70 ID:???
t2のカラム名、いくらmysqlでもこんなカラム名許すわけないよな
t2って実テーブルじゃないのか?

とりあえずt2のカラム名ちゃんとしてれば、t1に別名つけて2回Joinすればいけるはずだが


85 :NAME IS NULL:2012/08/31(金) 23:16:34.78 ID:???
許しちゃうんだなこれが
select 1 as `t1.id`

86 :NAME IS NULL:2012/09/03(月) 19:47:21.70 ID:???
複数のテーブルを結合して、その列名のみを取得するのはできるのでしょうか?
教えてください

SQLServerです。

87 :NAME IS NULL:2012/09/03(月) 20:35:47.33 ID:???
SQL Server知らんからググったが、syscolumnsとサブクエリ使えばいけるんじゃね

88 :NAME IS NULL:2012/09/03(月) 20:46:00.48 ID:???
列名のみ取得ってのがイマイチ何をどうしたいのか解らんな
where 1=0とかで良いような気もする

89 :NAME IS NULL:2012/09/03(月) 20:47:45.29 ID:???
>>88
値として列名を取得したいのです。

90 :NAME IS NULL:2012/09/03(月) 20:48:09.46 ID:???
列名も知らないDBを使って何かしようとしてるの?
SQLインジェクションのやり方の質問か

91 :NAME IS NULL:2012/09/03(月) 20:53:14.13 ID:???
>>87
どうやったらできますか?
調べてもよくわかりません。
教えてください

92 :NAME IS NULL:2012/09/03(月) 20:57:21.89 ID:???
>>91
それ結合とか関係ないな
システムテーブルってDBMS固有な場合が多いし、SQL Serverのスレ行って聞け

93 :NAME IS NULL:2012/09/03(月) 21:00:40.98 ID:???
>>92
わかりました。ありがとうございました。

94 :NAME IS NULL:2012/09/03(月) 21:32:03.84 ID:???
INFORMATION_SCHEMA が使えるだろ。

95 :NAME IS NULL:2012/09/04(火) 12:43:36.13 ID:???
画期的なDBメンテツールを開発中なの鴨試練

96 :NAME IS NULL:2012/09/04(火) 23:46:29.63 ID:???
こんなスレで聞いてるぐらいだから、あらぬ方向に画期的なツールになりそう…

97 :NAME IS NULL:2012/09/05(水) 21:54:02.90 ID:DaBfuwdT
SQL Server 2005です

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



これってサブクエリの制限にひっかかるのでしょうか?
コンパイルは通るみたいですが・・・

98 :NAME IS NULL:2012/09/05(水) 21:57:57.52 ID:???
INSERTの構文調べようか

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

SQL ServerならそのSQLは通る気がする
別のテーブル名 にB列=0の行が複数あれば実行時エラーがでる
そうじゃなければ多分動くだろ


100 :NAME IS NULL:2012/09/05(水) 22:32:49.38 ID:???
>>98
ありがとうございます
職場で調べたつもりですが、なんかINSERT文だけは除外されるみたいな書き方でした・・・

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

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

明日の午後にはテストがあるので急いで情報集めたいのですが、
とりあえず、仰るとおり、複数行が帰らなければよいのですね・・・・

101 :100: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の話でした
すいません

102 :NAME IS NULL:2012/09/06(木) 00:57:57.10 ID:???
そもそもそれWHERE句のサブクエリじゃないし

103 :NAME 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ですます方法は
なにかあるんでしょうか?


104 :NAME 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
のミスです


105 :NAME IS NULL:2012/09/06(木) 16:15:35.55 ID:???
usr_statusとorder_statusが別物なのだから無理


106 :NAME 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

107 :NAME IS NULL:2012/09/06(木) 22:44:20.57 ID:???
count(dictinct が使えないならそうするしかないんじゃない?
サブクエリはgroup byじゃなくてselect distinctのほうが自然な感じがするけど

108 :NAME IS NULL:2012/09/06(木) 22:46:20.83 ID:???
>>106
うまくいかなかったってのはどう上手くいかなかったんだ?
ちなみにdistinctのスペル間違ってるけど、それ直してもだめか?

109 :NAME 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


は普通のプログラミング言語と同じく好みの問題ですか?

110 :NAME IS NULL:2012/09/07(金) 03:30:21.61 ID:???
標準的なSQLにIFなんてなかったはず
それが同一かどうかはそのDBMSのスレで聞くかマニュアルでも読んで自分で調べろ

111 :NAME IS NULL:2012/09/07(金) 06:45:33.35 ID:???
>>107
select distinctなんてものがあるのか。知らなかった。ありがとう。

>>108
スペル直したらいけたorz お恥ずかしい サンクス

112 :NAME IS NULL:2012/09/07(金) 11:10:36.19 ID:???
distinct はSQLの初歩の方で出てくるはずだが…

113 :NAME IS NULL:2012/09/07(金) 12:17:53.67 ID:???
重複する結果を1行だけ欲しいというニーズがなかったのか?・・・w

114 :NAME 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回で取得する方法はありますか。

115 :NAME 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に置き換えていく
どちらの動きをするんでしょうか。

116 :NAME IS NULL:2012/09/07(金) 17:24:20.15 ID:???
>>115
関数が入ったからと言って、XYZ = 何か を複数回UPDATEするってことはないはずだお。

厳密にいうならば、1と2、両方とも違う
あらかじめXYZの値に対して、リプレイスを2回かけて得られた値をUPDATEしているはず。

117 :NAME 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
;

118 :NAME IS NULL:2012/09/09(日) 23:52:06.85 ID:2/TvaXCv
SELECT *
FROM テーブルあ LEFT JOIN テーブルい ON テーブルあ.主キー = テーブルい.主キー


としたときに結合したあとの選択結果の列の順番はどのように決まるのですか

119 :NAME IS NULL:2012/09/10(月) 00:02:04.34 ID:???
>>118
DBMSに依るだろうが多分テーブルあがインサートされている順になる気がする

120 :NAME IS NULL:2012/09/10(月) 00:23:27.78 ID:???
>>119
ありがとうございます
このサイトの例題2をみてふと疑問に思ったのですが、


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


普通のRDBでは、列に定義されている順番なんでしょうか

121 :NAME IS NULL:2012/09/10(月) 00:43:31.16 ID:???
列の順序にしても行の順序にしても、クエリで明示的に指定していない場合は
DBMSがテキトーに決めると思っておけ。
指定しない場合にどういう順序になるかなんて、考えるのは無駄。

122 :NAME IS NULL:2012/09/10(月) 08:11:15.12 ID:j8POAroQ
ありがとうございました

123 :NAME IS NULL:2012/09/10(月) 09:25:10.94 ID:???
>>117
遅くなりましたが欲しいデータが取れました
本当にありがとうございました

124 :NAME 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 で結合すればいいのでしょうか?
部活は一人複数入ることも考えて上記のようにしました。

125 :NAME IS NULL:2012/09/11(火) 18:14:47.99 ID:???
その例だと
 人(人ID、名前、身長、体重、その他人としての特性)
 部活(部活ID、部活名、その他部活としての特性)
 人−部活(人ID、部活ID)
の3テーブルにするのが基本かと

126 :NAME IS NULL:2012/09/11(火) 19:59:43.14 ID:???
>>124のtableBのB_idが何をしたいのかが謎すぎる

127 :NAME IS NULL:2012/09/11(火) 22:35:48.13 ID:???
>>126
主キーの役割がわからないとは珍しい御仁だな

128 :NAME IS NULL:2012/09/11(火) 22:57:36.57 ID:???
(部活,A_id)が候補キーであると考えないとtableB自体意味不明だが、
もしそうであればその複合キーの代理キーだな。

129 :NAME IS NULL:2012/09/12(水) 03:46:33.34 ID:???
どうでもいいんだが
B right join A より A left join B の方がしっくりくるのは俺だけ?

まあとりあえず設計はスレ違いだな

130 :NAME IS NULL:2012/09/12(水) 05:47:20.43 ID:???
>>127
この課題に限れば冗長になっているよ

131 :NAME IS NULL:2012/09/12(水) 12:23:15.65 ID:???
>>130
そんなこと言うと代理キーは全部冗長だろうが
あ、代理キー論争は余所でやってね

132 :NAME 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 で出来ます?

133 :NAME 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件だったりとか、切り捨てとかは考慮してない


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

ありがとう。

135 :NAME IS NULL:2012/09/15(土) 08:57:46.51 ID:???
>>134
しかし、SQLも危ない構造をしてるね。こうまでしてしまったのは誰だ。

136 :NAME 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
;

137 :NAME IS NULL:2012/09/15(土) 11:02:40.46 ID:???
>>136
おお、なんかよさげ。
こっちもありがとう。

138 :NAME IS NULL:2012/09/15(土) 16:49:24.38 ID:???
>>135
危ない構造ってどういう事だ?

>>136
1:nで結合すると1側のテーブル項目が無駄に重複してるような気もする
まあ、その辺は好みの問題(単一行サブクエリのエラーの問題はあるけど)
最近のオプティマイザは賢いからなぁ

139 :NAME IS NULL:2012/09/15(土) 18:11:04.07 ID:???
>>138
射影部分で結合を指定しているではないか。
あそこは本来 W への形式指定をするところだ。
この場合で言えば、意味的に W に書き込まれた
無名のテーブルに対して暗黙の結合が起こっている
ことになってしまう。
そんな逸脱を許してよい筈がない。

140 :NAME IS NULL:2012/09/15(土) 19:00:19.20 ID:???
なんか難しくて良くわからんな
(単一値を要求する)サブクエリが結合だってこと?
それが何かを逸脱してて許されないの?
で、それがどう「危ない」の?

たんに学術的におかしいってだけなら、それ用のスレ立ててそこで論議してくれ


141 :NAME IS NULL:2012/09/15(土) 19:30:46.77 ID:???
>>140
where Id=t.親Id とあるからには結合と見做される
親テーブルの資産は集約値でないから本来単一値には
なり得ない。

142 :136:2012/09/15(土) 19:59:43.02 ID:???
>>140
なんか変な人きちゃったね
代わりに謝る

143 :NAME IS NULL:2012/09/15(土) 21:48:06.59 ID:???
>>141
>集約値でないから本来単一値にはなり得ない。
なり得ないんじゃなくて、そうなる保証がないだけだろ
単一値になるかもしれないが、そうならないかもしれない
>>133は親が1件の場合以外は考慮してないと書いてある
つまりこのサブクエリが単一値になる事を前提としていることははっきり示してあると思うが

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

で、何が何を逸脱してて、何が危ないの?

144 :NAME IS NULL:2012/09/15(土) 22:15:09.14 ID:???
親が2件以上あると単純にいかなくなるから危ないのではないかな


145 :144:2012/09/15(土) 22:18:43.53 ID:???
追加 これ集約しても同じでしょ やはり基本は解の集合になる


146 :135,139,141:2012/09/15(土) 22:48:15.87 ID:???
私の書き込みの表現が適切でなかったのかもしれない。言い換えれば、
JOINはfrom句かwhere句の中でしか指定できないのがSQLだと思う。
ところが、>>134 の例では、親テーブルの資産が複数取れてきてしまうと
<列指定>が原因で事実上のJOINを起こさなくてはならなくなる。
これは具合が悪いのではないか。

147 :133: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にその考慮を入れてないんだが


148 :NAME 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

149 :NAME IS NULL:2012/09/20(木) 10:12:25.82 ID:???
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
の前にコンマがあるからでは?

150 :NAME IS NULL:2012/09/20(木) 10:21:10.22 ID:???
>>149
あぁぁぁ〜それだったのか〜orz
どうさしました。ありがとうございますm(__)m

151 :NAME IS NULL:2012/09/24(月) 14:00:17.01 ID:HaYq/Rnn
あるカラムの値を0にそろえたいのですが、
UPDATE *** SET xxx = 0

UPDATE *** SET xxx = 0 WHERE xxx <> 0
ってどっちが一般的でしょうか?

152 :NAME IS NULL:2012/09/24(月) 15:24:37.72 ID:???
0を0に置き換えて何が問題なの?

153 :NAME IS NULL:2012/09/24(月) 15:50:45.29 ID:???
ロック
ログの量
トリガ
ぐらいを考慮して好きなように

154 :NAME 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;


155 :NAME IS NULL:2012/09/24(月) 18:38:16.06 ID:???
なんで企業TBLなのに企業IDで企業が一意に決まらないのかとか
電話番号が同一だったら同一企業なんて条件で本当にいいのかとか
突っ込みどころ満載だけどその要件通りのことは一応できる

update 企業TBL set 最終発送日 = (select max(最終発送日) from 企業TBL T2 where 企業TBL.電話番号 = T2.電話番号)

156 :154:2012/09/24(月) 19:00:31.21 ID:QiS80YJo
>>155さま

ありがとうござます。
おしゃる通り、電話番号が等しければ同一企業と見なしてよいかは検討の余地があるところです。
すみません、テーブル構成を少し端折りましたが、親企業テーブルが別途あり、
同一企業が別の親にぶら下がる場合は、それぞれ別企業として登録する必要があるため、
このようなことが発生しています。

157 :NAME IS NULL:2012/09/24(月) 21:57:02.58 ID:???
総務部と人事部が電話番号違ってたらどうすんの?とか本店と支店は電話番号違うから別企業になるのか?とか果てしなく疑問が出てくる
設計スレではないからいいけど

158 :NAME IS NULL:2012/09/29(土) 14:37:11.50 ID:???
質問させてください。
SQLServerってSQL文の処理をサーバー側がやってくれたりします?
クライアントは命令出すだけで、実行はサーバーだったら良いなと。
現在までアクセスのmdbをNASで共有してきたのですが
Pen4(セレロン)クラスのPCでは遅いので。

159 :NAME IS NULL:2012/09/29(土) 15:01:18.83 ID:???
考えてる通りの動作

てか、access から mysql 使えば安く済むよ

160 :NAME IS NULL:2012/09/29(土) 15:17:15.04 ID:???
>>159
ありがとうございます。
その辺りも検討してみます。

161 :NAME IS NULL:2012/09/30(日) 00:16:54.88 ID:???
実行がクライアント側だというなら、selectはテーブルの全rowをまずクライアント側にコピーするというのか?
質問する前に少しは考えろww

162 :NAME IS NULL:2012/09/30(日) 01:05:38.91 ID:???
> selectはテーブルの全rowをまずクライアント側にコピーするというのか?
・うわっ、バカがいるww


163 :NAME IS NULL:2012/09/30(日) 01:20:37.11 ID:???
AccessのdbファイルをNASで共有という今までのやり方そのものが
実データはネットワークを介した向こうでSQL実行はクライアント
という形だね。

select文だからといって常にフルテーブルスキャンとはならないのと
同じ理由でクライアントで実行するからといって常に全rowを手元
にコピーする必要はない。

164 :NAME IS NULL:2012/09/30(日) 20:55:51.12 ID:???
バカだからよくわかんないや。

165 :NAME 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 のサイズ、トップスのサイズ、などで絞り込みしてリストを作りたいのです。女子のみスカートのサイズがあります。

どのように書けば良いのか教えてください。

166 :NAME IS NULL:2012/10/04(木) 06:56:56.23 ID:???
union使え

167 :NAME IS NULL:2012/10/04(木) 11:52:57.19 ID:???
TransactionSQLはわからないんですが
MySQLユーザな私だと
(SELECT name,tops,pants,'' AS skirt FROM 男子テーブル)
なんぞを女子テーブルとUNIONしちゃいますが。


168 :NAME IS NULL:2012/10/04(木) 20:56:50.85 ID:q2phKc+6
できましたありがとう
>>166
>>177
さん

169 :NAME 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で解決する必要があるのですが、
何か検索を向上させる方法がありますでしょうか。

170 :NAME IS NULL:2012/10/05(金) 09:59:31.14 ID:???
>>169
複合INDEX とは別に 列B,列C,列D にそれぞれINDEXを付ける。

171 :NAME IS NULL:2012/10/05(金) 13:21:18.99 ID:hMuvgCWe
>>169
検索用のB,C,D列だけのテーブル(全部主キー)を作って
そこに該当レコードのキーを入れてJOIN
両方がINDEX SCANいなれば爆速

172 :NAME IS NULL:2012/10/05(金) 13:47:42.91 ID:???
正規化してテーブルを分割した後にinsertやupdateする場合は
SQL文を二つに分けてinsertするのでしょうか?

173 :NAME IS NULL:2012/10/05(金) 14:09:12.44 ID:???
一度にできる方法を教えてくれ

174 :NAME IS NULL:2012/10/05(金) 15:06:58.73 ID:???
>>172-173

とりあえず必要な情報が欠落しているから>>1見てね。

175 :NAME IS NULL:2012/10/05(金) 16:25:09.83 ID:???
>>174
>>173>>172へのレスだろ、空気脳さん。

176 :NAME 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
・・・

177 :NAME IS NULL:2012/10/05(金) 18:30:41.47 ID:???
>>176
単独いらない。というか単独インデックスだとふつうはそのうち一つ
しかつかわれない。

自分もINの中身が少なければこれで良いと思う。注意点は条件式を
複合インデックスを定義したときの列の順番で書くこと。
まあ最近のオプティマイザは頭良いけど。

178 :NAME IS NULL:2012/10/05(金) 18:35:51.89 ID:???
列B||列C||列D のファンクションインデックスでいいだろ

179 :NAME IS NULL:2012/10/05(金) 19:18:07.58 ID:???
>>172-173
VIEWを作ればVIEW越しに更新できるDBMSもあるけどね

まあ正規化のために分けたんなら別々のエンティティだから分けたんであって、
そうであれば別々に更新するのが意味的には正しいと思うけど

180 :NAME IS NULL:2012/10/06(土) 00:21:06.93 ID:???
正規化とエンティティは全然関係ないんだが、いまだにこういう勘違いしている人がいるのな。

181 :NAME IS NULL:2012/10/06(土) 01:36:13.08 ID:???
>>176-177
B,C,Dで連結してから検索してるってことは、たとえば
'X','',''
'','X',''
'','','X'
の3行がin('X','Y','Z')で引っ掛からないとダメってことだろ
素直に結合した状態のインデックスつくるか、条件指定の仕方を見直すかだな

182 :NAME 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(背番号);
ではエラーになってしまいました。

ご教示宜しくお願いいたします。

183 :NAME IS NULL:2012/10/17(水) 06:05:18.97 ID:???
集計関数の使い方をちゃんと勉強してくださいね

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

>>4が参考になるかもしれません

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

185 :NAME IS NULL:2012/10/17(水) 21:29:23.34 ID:???
なにそれこわい

というかそれはSQLじゃなくてRDBMSの問題なのでは

186 :NAME IS NULL:2012/10/18(木) 01:10:04.11 ID:jxIImRzW
>>184
検索列は同じなの?
違う列でフルスキャンした結果ありませんとかじゃないだろうな

187 :182: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がうまくいきません…。

188 :NAME IS NULL:2012/10/18(木) 02:50:29.43 ID:???
検索中に 500 件に達したら終わり
該当が無いから最後まで探そうとするから時間がかかる

ただそれだげ

189 :NAME 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.最少背番号;

190 :184:2012/10/18(木) 09:48:12.50 ID:fR4udFJG
>>185 >>186

ありがとうございます。

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

例えば統計情報を更新していないとかで、こういった
事象も考えられますでしょうか。


191 :NAME IS NULL:2012/10/18(木) 18:48:54.43 ID:???
>>188
500件って制限してないけど。

>>190
どっかにexistsつかってない?

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

検索の時間と表示の時間もちゃんと分けて考えてるか

193 :182:2012/10/19(金) 02:56:07.44 ID:???
>>189
希望通りの結果となりました!どうもありがとうございます。
今まではJOINを使った結合しかやってなかったのですが、
こういうやり方もあるんですね。参考になりました。
備忘録として保存したいと思います。

194 :190: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 | |

195 :NAME IS NULL:2012/10/19(金) 15:42:45.49 ID:???
というかさ>>184は後出しが酷いよ。
簡単なスキーマ定義と問題になっているクエリぐらい書かないと。
184の書き方だと自分でも単一テーブルの全行スキャンの途中打ち切りを
まず疑うし、それがあとから複数テーブルのJoinとか、なんじゃらほい。

いきなり実行計画貼り付けられたところで要エスパーとまではいかなくても
答える方は無駄に面倒だ。
スキーマとクエリを提示、まずそこから。

196 :NAME IS NULL:2012/10/19(金) 16:59:16.79 ID:???
not inとか使ってて、最終的に0件の方がアクセスするレコード件数が多いとかじゃないのか

197 :NAME IS NULL:2012/10/19(金) 20:27:31.64 ID:???
>>196
そう思ってexistsを使ってるか確認してみた

198 :NAME IS NULL:2012/10/19(金) 21:27:55.35 ID:???
SQL インジェクションやられた、あばばばば

199 :NAME IS NULL:2012/10/20(土) 01:43:41.08 ID:/WZRtOi0
ttp://photozou.jp/photo/show/2819159/153010030

( ´∀`)ノ


200 :NAME IS NULL:2012/10/22(月) 15:58:01.32 ID:???
oracle10gのpro*cobolで、カーソルの逆方向読み(fetch prior)は可能でしょうか?

201 :NAME IS NULL:2012/10/22(月) 18:14:17.47 ID:???
oracleのスレで聞けよ w

202 :NAME IS NULL:2012/10/24(水) 00:23:18.40 ID:???
name like 'unkounkounko'

これにワイルドカード使いたい場合どうすればいい?

203 :NAME IS NULL:2012/10/24(水) 13:05:23.96 ID:???
'unkounkounko' like name

204 :NAME IS NULL:2012/10/24(水) 18:54:38.64 ID:???
うんこをなめるのが好きだって?

205 :NAME 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

206 :NAME IS NULL:2012/10/26(金) 12:21:37.47 ID:???
TableBから商品名ごとに最大値を求めるサブクエリ(max(),groupby 使用)と
TableAをジョインさせる

207 :NAME 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はどう書けばよいでしょうか?

208 :NAME 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;

209 :NAME 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 おねがい



210 :NAME 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.場所;

211 :NAME 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.場所

212 :NAME 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


213 :NAME IS NULL:2012/11/06(火) 20:26:08.31 ID:???
副問い合わせ

214 :NAME IS NULL:2012/11/07(水) 09:29:53.25 ID:???
>>213
どうやって?URLでいいから教えて。

215 :NAME 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;

216 :NAME 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;

217 :NAME IS NULL:2012/11/11(日) 11:48:20.00 ID:???
スレ違い
VIEWにはできないの?

218 :216:2012/11/11(日) 14:06:21.24 ID:???
>>217
スレ違い、すみませんでした。

ConsumerName = 'John'の部分を変数にしたいのでViewではなくストアドにしたかったのです。
どうやらDerbyのストアドはJavaで書かなければならないようなので、平文のまま組み込むことにします。

219 :NAME IS NULL:2012/11/12(月) 22:18:27.23 ID:???
ネットで調べてsqlite他組み込みのDBMSは非常に早い事を知ったんですが
世間的にはmysqlやpostgres、oracleなど非組み込みDBMSが一般的です
なんで組み込みのDBMSが主流にならないのでしょうか?

220 :NAME IS NULL:2012/11/12(月) 22:49:48.64 ID:???
早いというか、小さい、だな
プログラムが小さい
扱えるデータ量も小さい
土俵が違う

221 :NAME IS NULL:2012/11/12(月) 23:58:42.67 ID:c7SF2yEW
>>219
スタンドアロンならそれでもいいけどな

222 :NAME IS NULL:2012/11/13(火) 05:51:13.24 ID:???
SQLiteでログインとかパスワードとかどうしてる?

223 :NAME IS NULL:2012/11/13(火) 07:14:42.96 ID:???
SQLite パスワード とかでググれ
少なくともスレチだ

224 :NAME 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



としたいです

225 :NAME IS NULL:2012/11/14(水) 01:08:56.50 ID:vnD9R/B5
mysql5です

226 :NAME IS NULL:2012/11/14(水) 01:38:02.25 ID:???
update hogehoge set mitsudo=jinko/menseki;

227 :NAME IS NULL:2012/11/14(水) 01:51:13.34 ID:???
O(-人-)O アリガタヤ・・

228 :NAME 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

229 :NAME IS NULL:2012/11/14(水) 22:05:15.25 ID:???
IDを1〜最大値まで回してレコードが存在するか
チェックできないほど件数があるの?

230 :NAME IS NULL:2012/11/14(水) 22:28:01.58 ID:???
>>229
.netの環境でマッチングしても良いかと思ったのですが
数十万件分のIDを3種設定するため処理が重いのです
SQL内でループさせてIDを設定できるのでしたら助言頂けると助かります_no

231 :NAME IS NULL:2012/11/14(水) 22:32:59.00 ID:???
IDを再利用する意味が分からん。

232 :NAME IS NULL:2012/11/14(水) 22:38:21.90 ID:???
そのままじゃ無理だろう
マスタの欠番のところにダミーレコードを入れるか
ID管理テーブルを別に作るか
いずれにしても、事前に全件をなめてどっちかを行う処理が必要

233 :NAME 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)
;

234 :228:2012/11/14(水) 23:26:45.77 ID:???
>>233
確かにID再利用は仕様変更の際に面倒になりそうですよね
桁数を7桁に増やしてIDを欠番にしてみようと思います

ソースですが若いIDから+1ずつ見てあげてマッチしなければ数値を設定といった感じでしょうか?
上記のような処理でしたらID欠番にしても動きますので良さそうですね!
参考にさせて頂きますm(_ _)m

235 :NAME IS NULL:2012/11/15(木) 00:25:21.46 ID:???
一つの項目に複数の意味を持たせるのは基本的に設計として間違ってる
IDに、識別子としての意味と、連番としての意味の二つの意味を持たせるからそうなる

236 :NAME IS NULL:2012/11/15(木) 08:02:02.10 ID:???
さすがにそれは的外れ

237 :NAME IS NULL:2012/11/15(木) 15:25:45.41 ID:???
>>234
7桁…?
numericつかってるなら、それをintに変更することを検討してみてもいいかと。

238 :NAME IS NULL:2012/11/16(金) 01:58:46.13 ID:???
関係ないけどdeleteで欠番にするよりフラグ用の列増やして使ってるか使ってないかのオンオフにした方が良くね

239 :NAME IS NULL:2012/11/16(金) 05:46:36.55 ID:???
そんなの常識たったたらりら

240 :NAME IS NULL:2012/11/16(金) 10:42:18.55 ID:???
データによっては完全削除が要求されるものもあるので「常識」とはいえない.

241 :NAME IS NULL:2012/11/16(金) 12:02:55.52 ID:???
データ部分を削除してレコードは削除マーク付けて残しといても良いんじゃない?

242 :NAME IS NULL:2012/11/16(金) 13:08:38.34 ID:???
コンプライアンス上問題になるケースもあるだろ

243 :NAME IS NULL:2012/11/16(金) 15:42:09.78 ID:???
データは消して番号だけ残しておくのにそれは関係ないだろう

244 :NAME IS NULL:2012/11/16(金) 20:56:38.02 ID:???
データベースなのにデータの無いレコードに何の意味があるの?

245 :NAME IS NULL:2012/11/16(金) 22:14:09.91 ID:???
この場合IDそのものが必要なデータだろう。

246 :NAME IS NULL:2012/11/19(月) 00:04:52.48 ID:???
すいません、超初心者です。
以下のSQLの意味がさっぱりわからないのですが、
ご教授いただけないでしょうか。

SELECT * FROM [{0}]

247 :NAME IS NULL:2012/11/19(月) 00:56:11.37 ID:9MGZezeT
>>246
多分ミドルウェア(.NET?)でテーブル名を置換してるだけと思われる

248 :NAME IS NULL:2012/11/19(月) 01:01:33.88 ID:???
SQLインジェクションで死ねるな。

249 :NAME IS NULL:2012/11/19(月) 10:13:07.66 ID:???
そのための[]

250 :NAME 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の実行効率がいいのはこっちだけど、メモリ消費量が少ないのはこっちだとか、
そういうのを教えてください。

251 :NAME IS NULL:2012/11/19(月) 10:45:31.24 ID:???
joinだろ

252 :NAME IS NULL:2012/11/19(月) 10:47:11.51 ID:???
つ ttp://www.geocities.jp/mickindex/database/db_optimize.html

253 :NAME IS NULL:2012/11/19(月) 20:01:41.84 ID:???
SQLは書いたとおりに処理されるとは限りません
実際にどう処理されるかはオプティマイザ次第

254 :NAME IS NULL:2012/11/19(月) 23:33:18.44 ID:???
>>249
表 T があるとして

"T]; truncate table [T;" ってやられたらどうする?

255 :NAME IS NULL:2012/11/20(火) 03:48:12.27 ID:???
ホストアプリも環境も不明でそんな話しても無意味

256 :NAME IS NULL:2012/11/20(火) 04:04:19.69 ID:???
プリペアードステートメントじゃないの?

257 :NAME IS NULL:2012/11/20(火) 10:05:29.96 ID:???
括弧部分はSQLの一部じゃないからそんなことやっても無駄w

258 :NAME IS NULL:2012/11/20(火) 12:27:22.51 ID:???
sqli覚えたてでうれしかったとか

259 :NAME IS NULL:2012/11/20(火) 14:29:05.19 ID:???
>>252
そのページは参考にはなりますが、250の質問については書かれてないようです。
ほかに参考になるページがあれば教えてください。
「SQL join 副問い合わせ 速度」とかでぐぐってるんですが、思うようなページが見つかりません。

260 :NAME IS NULL:2012/11/20(火) 14:33:48.29 ID:???
そんなのRDBMSの実相によるだろ

261 :NAME IS NULL:2012/11/20(火) 14:38:03.81 ID:???
両方のプラン見るんじゃだめなの?

262 :NAME IS NULL:2012/11/20(火) 14:45:52.53 ID:???
SQLだけを見てどっちが早いかなんて解りません

263 :NAME IS NULL:2012/11/20(火) 16:08:48.33 ID:???
基本を知らん奴に限ってまずパフォーマンスとか騒ぎ出すのが不思議。

264 :NAME IS NULL:2012/11/20(火) 21:43:20.03 ID:???
>>247
了解です。ありがとうございました。
.netすれで聞いてみます。

265 :NAME IS NULL:2012/11/20(火) 21:57:21.83 ID:???
プリペアードクエリじゃなくてストリングビルダーとかの気がするなぁ{0}
ってなるとインジェクションも可能になってきそうだけれど。

>>264てか、まだ聞かないとだめなぐらい情報が足りないのか

266 :NAME IS NULL:2012/11/20(火) 23:04:02.42 ID:???
>>265
すんません、C#は初めてで・・・。
いま、やっと {0} の意味がわかりました。
とほほ。

267 :254:2012/11/21(水) 02:13:18.28 ID:???
ほら、やっぱり C# じゃねーか。
>>257 は俺に謝れよ。

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

でないと SQL インジェクションとかエスケープとかで色々苦労するから。

268 :NAME IS NULL:2012/11/21(水) 10:26:45.13 ID:???
>>267
C#なのは見た瞬間にわかるよ。
やっても無駄だって言ってるだろw

269 :NAME IS NULL:2012/11/21(水) 10:27:33.81 ID:???
>>254 はADO.NETの勉強をしてみては。

270 :NAME IS NULL:2012/11/21(水) 23:14:59.49 ID:???
>>268
>やっても無駄だって言ってるだろw

はいはい、君の脳内 DBMS だとダメなんだろうな。

271 :NAME 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はなくてもいい

272 :NAME IS NULL:2012/11/22(木) 17:34:58.19 ID:???
なんとなく再帰と自己結合をすればいいのかなぁとは思うけど再帰クエリ使ったことないからわかんないや

273 :NAME IS NULL:2012/11/22(木) 18:36:53.32 ID:???
>>271
>>8をうまく応用すればできるにはできると思うけど

274 :NAME 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が使われるのか?

275 :NAME 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;

こんな感じでできました。ありがとう!

276 :NAME IS NULL:2012/11/22(木) 19:50:13.10 ID:???
>>274
昔のDBMSではそういうこともあったけど今どきのDBMSは賢いからな

277 :NAME IS NULL:2012/11/22(木) 20:06:56.43 ID:???
>>274
なので、質問したりするときにはバージョンが大事だったりするんです。

278 :NAME 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だけあれば、他は削除しても良い
という結論になりますでしょうか?

279 :NAME IS NULL:2012/11/22(木) 21:30:13.51 ID:???
>>274
「そんなこともないよう」ってのはどうやって確かめたの?
実行計画見たなら質問するまでもないと思うけど。

280 :NAME IS NULL:2012/11/22(木) 21:59:35.93 ID:???
例えばAだけを条件に検索する場合、
INDEX4でもテーブルフルスキャンよりは速いけど
INDEX1よりは遅い、というようになるのが普通。
(データのばらけ具合(カーディナリティ)にもよるので一概には言えんけど。)

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

それと、>>278の思想だとテーブルにあるすべての列をインデックスに入れればいい
とかいう考えに行き着いて、その結果テーブルスキャンよりインデックススキャンのほうが
遅いなんてことにもなりかねない。

281 :NAME 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|*"

282 :NAME IS NULL:2012/11/24(土) 16:41:53.02 ID:???
where '0123' in (電話番号, 携帯番号, FAX)
かな
インデックスが効くかどうかは知らない

283 :281:2012/11/24(土) 17:03:55.92 ID:???
>>282
うわ、目からうろこ。
そんな事も出来るんだ。全然そんな発想無かった。

正直、騙されてるなと思いつつテストしました。thx!

284 :281:2012/11/24(土) 17:16:02.14 ID:???
あ、でもインデックスは使われない様だ。
と言うか OR句でも使われて無かったようだ…。

285 :281:2012/11/24(土) 17:25:31.36 ID:???
>>284
訂正。
インデックスはちゃんと利用されていました。。

286 :NAME IS NULL:2012/11/24(土) 21:10:19.98 ID:???
ぐぬぬ >>282の書き方知らんかった
データベーススペシャリストのこの俺が・・・不覚 ガクッ

287 :NAME IS NULL:2012/11/25(日) 04:31:35.39 ID:???
遅くなる

288 :NAME IS NULL:2012/11/25(日) 05:20:39.84 ID:???
IN はなるべく使うなってばっちゃんが言ってた

289 :NAME IS NULL:2012/11/25(日) 12:48:20.61 ID:???
オプティマイザが貧弱だったころのバッドノウハウ

290 :NAME IS NULL:2012/11/25(日) 12:57:19.58 ID:ITwOfUhV
Orが駄目な理由は?

291 :NAME IS NULL:2012/11/25(日) 13:09:14.13 ID:???
インデックスも知らない人ですか?

292 :NAME 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

よろしくお願いします。

293 :NAME 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

294 :NAME IS NULL:2012/11/25(日) 21:08:14.83 ID:???
データの状態によって結合もかわりそうだね

295 :NAME 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 あほ

のように取り出したいのです。

296 :NAME IS NULL:2012/11/28(水) 10:30:45.68 ID:???
データベースじゃなくてテーブルじゃないの?
UNIONでつなげられるかな

297 :NAME IS NULL:2012/11/28(水) 11:15:41.85 ID:???
あと試すにしても、マニュアルとかは見たほうがいいよ。
A,B はJOIN、A B は別名(A AS B の ASを省略したもの)になるからね。

298 :NAME IS NULL:2012/11/28(水) 12:52:38.69 ID:???
union

299 :NAME IS NULL:2012/11/28(水) 18:03:08.02 ID:29vczbAS
ありがとうございます、UNION ALLでうまくいきました!

300 :NAME IS NULL:2012/11/29(木) 11:51:49.95 ID:3d0Pkdso
MS SQL server2012です。

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

親子
AB
BC
CD
XY
Z0

求めいた結果
親子
AB
BC
CD
よろしくお願いします。

301 :NAME IS NULL:2012/11/29(木) 11:52:24.25 ID:???
>>300です。
すみません。親と子は別の列です。

302 :NAME 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
;

303 :NAME IS NULL:2012/11/29(木) 18:56:52.85 ID:???
>>302
ありがとうございます。
明日試してみます。

304 :NAME IS NULL:2012/11/29(木) 20:44:05.39 ID:???
>>300
階層はなん階層までなんだろ

305 :NAME 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
と記述した場合とどう違うのでしょうか?

306 :NAME IS NULL:2012/11/30(金) 02:25:45.28 ID:???
単なる区切り
カラム名の前についてるなら、テーブル名(かその修飾名)との区切り
その前ならDBMSによっていろいろ。スキーマとかユーザとかデータベースだったり

307 :NAME IS NULL:2012/11/30(金) 07:23:01.52 ID:???
>>305
「ドット」=「の」

308 :NAME IS NULL:2012/11/30(金) 10:33:43.97 ID:???
>>305
複数テーブルの結合の場合には、同じフィールド名が現れることがあるから、
何々テーブルの何々フィールドという言い方が必要になることかあることは
解ると思う。この表現を一般化しただけ。表現として多くの場合冗長だが、
文法上問題はない。

309 :305:2012/12/01(土) 02:05:23.78 ID:???
みなさん解説ありがとうございます。勉強になります。

SQL辞典の索引を見ても .(ドット) の記述が無く困っていたんですが、
初心者本のテーブルの結合の項目に説明がありました。 

310 :NAME IS NULL:2012/12/01(土) 03:48:55.87 ID:???
考えれば分かりそうなものを。

311 :NAME IS NULL:2012/12/01(土) 13:42:10.76 ID:???
まあそう言うなって

312 :NAME IS NULL:2012/12/01(土) 16:00:16.54 ID:???
説明してない本が悪い

313 :NAME IS NULL:2012/12/05(水) 10:26:01.76 ID:rmdEDUmh
SET型について質問です。

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

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

WHERE `fruit` & 5

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


MySQL5を使用しています。
どなたかご教授お願いしますm(_ _)m

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

それと、mysqlから読み込んだデータをまたDBに格納する場合って、
またmysql_real_escape_stringとかでエスケープする必要あるんでしょうか?

315 :NAME IS NULL:2012/12/05(水) 11:47:11.51 ID:???
>>314はすべて解決しました
ありがとうございました。

316 :NAME IS NULL:2012/12/05(水) 17:30:30.09 ID:???
>>313
DBMSに固有の機能に関する質問はそのDBMSのスレで聞け

って、そっちでこっちに誘導されたのか
普通にandで条件2個書けばいいだけじゃないのか?
マニュアルみたらビット演算できるらしいから101とANDとって101と比べても行けるかもしれん
WHERE (`fruit` & 5 )=5 とか。mysql知らんから知らんけど

317 :313:2012/12/05(水) 18:57:36.68 ID:rmdEDUmh
>>316
はい、誘導されてこちらへきました

そして、WHERE (`fruit` & 5 )=5 これで上手くいきました!
回答ありがとうございます!
わざわざマニュアルまでみて調べて頂き、本当にありがとうございましたm(_ _)m

318 :NAME 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ありますか?

319 :NAME IS NULL:2012/12/05(水) 21:45:40.99 ID:???
それでいいと思う
もっといいSQLはちょっと思いつかない

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

負荷とか速度とか、この兼ね合いは皆さんどういう風に判断してるんでしょうか

321 :NAME IS NULL:2012/12/07(金) 20:34:13.03 ID:???
臨機応変
ケースバイケース
気分次第

322 :NAME IS NULL:2012/12/07(金) 21:27:07.18 ID:???
プログラムがめんどいからこうするってのはないな
やっぱり速度が一番重要ジャマイカ
速いけどリソース食いすぎの場合は別途考える

323 :NAME IS NULL:2012/12/07(金) 22:04:47.89 ID:???
速いとその分システムへの負荷が軽い(多分)

324 :NAME 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文が失敗する可能性なんて
考えるのは非現実的でしょうか?

325 :NAME IS NULL:2012/12/08(土) 08:35:36.62 ID:PTDEWr+G
select文が失敗…?
デッドロックが激しすぎる状態とか?

326 :NAME IS NULL:2012/12/08(土) 09:57:20.59 ID:???
テーブル名が途中で書き換えられるとか?

327 :NAME IS NULL:2012/12/08(土) 13:15:59.94 ID:???
まあ複数回取得される同一の値のデータ量が多ければ
二回に分けるかな そんなに遅くならないよね?ね?と自分を安心させて

328 :NAME IS NULL:2012/12/08(土) 13:55:56.24 ID:???
>>325,326
ですよね!普通ならありえないですよね
>>327
>まあ複数回取得される同一の値のデータ量が多ければ
そうなんです、「確かに一度でとれるけど、joinすればするほど何度も同じデータ引き出して無駄じゃないのか」
って気分でモヤモヤしてました
安心しました、ありがとうございました

329 :NAME IS NULL:2012/12/08(土) 18:06:02.35 ID:???
>>324
カラムの数にもよるけどunion使って
3つのテーブルのデータを取得してくる方法も
ありかもね

330 :NAME IS NULL:2012/12/08(土) 18:30:17.61 ID:???
>>325
ネットワークエラーとか。

331 :NAME 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



こんな感じで作れるのでしょうか?
具体的に、このようなサンプルはありますでしょうか?

332 :NAME 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);

333 :NAME 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に更新される気がする
実際試してないから分からんけど

334 :NAME IS NULL:2012/12/12(水) 23:33:09.15 ID:???
table_a.aaaaaaa = table_b.bbbbbbb で取得する値が複数あったら、
一体どれでupdateすればいいの?

335 :NAME 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になると思ってます。

失礼いたしました。

336 :NAME IS NULL:2012/12/13(木) 18:07:33.04 ID:???
>>332
その方法でうまくいきました。
ありがとうございました。

337 :NAME 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

338 :NAME IS NULL:2012/12/13(木) 20:51:04.64 ID:???
mysqlだったら
insert into on duplicate key update か replace into で出来るけど
Postgreの方は知らない

339 :NAME IS NULL:2012/12/13(木) 21:28:10.52 ID:???
>>337
やりたいことをみる感じだと、それ以外の解決方法がありそう。

ともあれ、あればupdate、なければinsertについては下記参照
http://lets.postgresql.jp/documents/technical/9.1/1

340 :NAME IS NULL:2012/12/14(金) 11:25:45.92 ID:xa+Xo9C8
PKで select してレコードがあれば update なければ insert 以外に何かあんの?

341 :NAME IS NULL:2012/12/14(金) 11:55:11.71 ID:???
あるかないかで言えばある

342 :NAME IS NULL:2012/12/14(金) 13:46:33.92 ID:???
>>339
これのどこを読めばいいの?

343 :NAME IS NULL:2012/12/14(金) 21:06:55.95 ID:???
>>342
日本語読めない人じゃないならそんぐらい読んで欲しい。
ついでに目に入ったキーワードはあとで役立つこともあるのだから。

344 :NAME IS NULL:2012/12/15(土) 10:40:04.17 ID:???
>>337
MERGEは?Postgreでサポートしているか知らないけど。

それか、過去のデータ消してないなら
foobarテーブルを全レコード削除してINSERTだけにしたら?

345 :NAME IS NULL:2012/12/15(土) 11:43:41.53 ID:???
>>343
いや、ざっと読んだうえで、どこに書いてあるのかわからないんだが。
これって9.1のリリースノートだよね?SQLの新機能にそんなのがあるのかと思ったけど、別にかいてなかった。

346 :NAME IS NULL:2012/12/15(土) 12:39:24.88 ID:???
どうでもいいけど Postgres な

347 :NAME IS NULL:2012/12/15(土) 12:45:07.77 ID:???
俺的にはPosgre

348 :NAME 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する方法をご教授して頂ければと思います。

349 :NAME IS NULL:2012/12/15(土) 14:23:04.35 ID:???
/ はそれでひとつのコマンドなので単独で入力する必要があるはず

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

てかSQLの質問じゃないな

350 :NAME IS NULL:2012/12/15(土) 14:59:07.54 ID:???
'か)の数があってないんだろ。

351 :NAME IS NULL:2012/12/15(土) 15:36:25.75 ID:???
自民創価連立政権だけは絶対に阻止しまよう
対立候補に投票しましょう

352 :NAME IS NULL:2012/12/15(土) 20:15:28.49 ID:???
>>349
ではOracle質問スレの方で聞いてみます。

353 :NAME IS NULL:2012/12/15(土) 21:25:30.02 ID:???
>>348
改行するのでなく、
commitと入力して改行したらどうなる?

354 :NAME IS NULL:2012/12/15(土) 21:53:36.17 ID:???
>>353
そういう問題じゃないよ。
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。

355 :NAME IS NULL:2012/12/15(土) 21:55:29.13 ID:???
あ、まさか、/を;の直後に置いてるのか???
そんなアホはおらんよな。

356 :NAME IS NULL:2012/12/15(土) 22:01:15.58 ID:???
まさかも何も、>>348にそう書いてあるじゃん

357 :NAME IS NULL:2012/12/15(土) 22:23:28.53 ID:???
あほすぐる

358 :NAME IS NULL:2012/12/15(土) 22:29:11.65 ID:???
つか特定のツールの話はよそでやれ

359 :NAME IS NULL:2012/12/16(日) 10:51:59.92 ID:???
>>354
INSERT文の最後を「;」じゃなく「/」にしろという事でしょうか?

360 :NAME IS NULL:2012/12/16(日) 11:06:14.58 ID:???
もう、アホすぎて返事ができないわ。

361 :NAME IS NULL:2012/12/16(日) 12:16:35.69 ID:???
通りすがりに15秒みてレスするけど、、、


end;
/

こうでねーの?
SQL*Plusとか知らんけど

362 :NAME IS NULL:2012/12/16(日) 12:54:41.24 ID:???
>>361
「/」を最後に1行だけにする。
という事ですか。

363 :NAME IS NULL:2012/12/16(日) 13:04:45.69 ID:HevFQp2W
>>362
>>354
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。

って書いてるやん

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

質問に答えてくれた皆さんありがとうございました。

365 :NAME 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でできるのであれば教えてください。

366 :NAME IS NULL:2012/12/18(火) 11:25:49.93 ID:???
そっちのが無駄な気が、、、
同じパターンが多いならView作っちゃえば?

367 :NAME IS NULL:2012/12/18(火) 11:56:32.49 ID:???
あと通信で時間かかるのは接続だから
つないだまま3つ発行すればいいだけのような

368 :NAME IS NULL:2012/12/18(火) 13:53:05.93 ID:???
適当なパフォチュー情報を見つけて、さらにその断片を曲解して変な事をやりだすやつがたまにいるな

369 :NAME IS NULL:2012/12/18(火) 16:20:11.08 ID:???
まあ、できるかどうかはミドルウェアによるし
SQL関係ないからよそで聞いてくれ

370 :NAME IS NULL:2012/12/18(火) 19:12:33.98 ID:???
>>365
JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
マニュアル読め。

371 :NAME IS NULL:2012/12/18(火) 19:22:29.14 ID:???
ストアドプロシージャの初歩的な例でそういうのが載ってたりするけど違うのか

372 :NAME IS NULL:2012/12/18(火) 19:36:31.28 ID:???
>>370
>JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
なんという名前の機能でしょうか。教えてください。
キーワードがわかればぐぐります。

373 :NAME IS NULL:2012/12/18(火) 19:49:38.69 ID:???
1本のSQLにまとめてしまったら?w

374 :NAME IS NULL:2012/12/18(火) 20:24:26.03 ID:???
>>367
コネクションプーリングはしています。そのうえで通信回数を減らしたいという要求です。

>>373
たがいに関連のないSQLを1つにまとめることができるなら、教えてください。

375 :NAME 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;

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

>>370
で、その機能はなんという名前なんでしょうか。

377 :NAME IS NULL:2012/12/18(火) 21:53:57.55 ID:???
自分で調べられないなら必要ない機能だよ。

378 :NAME IS NULL:2012/12/19(水) 03:10:11.31 ID:???
SQLの問題じゃなくてミドルウェアの問題だって言ってるだろ
スレチだからとっとと引っ込め

379 :NAME IS NULL:2012/12/19(水) 10:14:28.29 ID:???
UNIONなんて誰でも思いつくのにあえて言わないのは何でだかわかるかw

380 :NAME IS NULL:2012/12/19(水) 14:27:25.61 ID:???
そっとしておいてやれよ

381 :NAME IS NULL:2012/12/19(水) 15:00:37.21 ID:???
>>377
>自分で調べられないなら必要ない機能だよ。
機能の名称を教えていただければ、あとは自分で調べます。

>>379
unionは要素の型が同じである集合に対する演算なので、まったく異なる種類のselect文に対して使う発想はなかったです。
これって「誰でも思いつく」ようなものだったんですね。知りませんでした。

382 :NAME IS NULL:2012/12/19(水) 16:50:15.64 ID:???
カーソル動かして結果をフェッチするのに要する通信回数は考えないのか。
クエリを投げる通信回数を減らすのにどれほどの意義があるのかよく分からん。

383 :NAME IS NULL:2012/12/19(水) 17:08:26.96 ID:???
通信するたびに電話かけてダイヤルアップするんだろ

384 :NAME IS NULL:2012/12/20(木) 22:27:02.37 ID:???
話中だと待つのか?

385 :NAME IS NULL:2012/12/20(木) 23:02:41.14 ID:???
>>381
>>370にマニュアル嫁って書いてあっただろ?
ちゃんと読んだか?
読んでないだろ?
マニュアルを全部読んだらバカでもわかる。
マニュアルも読まずにここで質問するな!

386 :NAME IS NULL:2012/12/20(木) 23:03:56.67 ID:???
>>384
その通り。

387 :NAME IS NULL:2012/12/20(木) 23:25:13.07 ID:???
ヒント句指定しても思ったように索引が利用されないんだけど
考えられる原因て表を別名で指定してんのにヒントの中では元の表の名前で入れてしまってる他に
何かある?

388 :NAME IS NULL:2012/12/20(木) 23:54:10.33 ID:???
ヒント句が働いてない
ヒント句の使用方法が間違ってる

389 :NAME IS NULL:2012/12/21(金) 00:46:56.43 ID:???
HINTの文法間違いか、テーブルやインデックスの名前の書き間違い。
ほぼ100%このどちらか。

VIEWの場合は実表を指定するんだったかな。

390 :NAME IS NULL:2012/12/21(金) 02:02:29.95 ID:???
やっぱそうだよね
もう1回見直してみるわ

391 :NAME IS NULL:2012/12/21(金) 18:45:30.72 ID:???
実装に強く依存する質問をDBMS名も書かずにここで質問とかもう
しかも実際のSQLも書いてないし

392 :NAME IS NULL:2012/12/21(金) 20:30:09.30 ID:???
ヒントが上手く動作しない原因なんて、どのDBでも大差ないよ。

393 :NAME IS NULL:2012/12/22(土) 16:22:44.99 ID:???
データベース作成のスクリプトってどうやってデバッグすればいいのでしょうか? 
途中でエラーが出て、それを直しても再実行するとそこまでに出来てたものが重複で
エラーが出ます。 

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

効率の良い手法はないでしょうか? MS-SQLを使ってます。

394 :NAME IS NULL:2012/12/22(土) 16:59:30.68 ID:Wei1UoXa
データベース作成オプションに if exists とか if not exists とかってMS_SQLにはないん?

395 :NAME IS NULL:2012/12/22(土) 17:16:56.76 ID:???
何の言語でスクリプト書いてるのか知らんが、ドロップのエラーで
止まらんようにはできるだろ。

396 :NAME IS NULL:2012/12/22(土) 17:41:04.73 ID:???
>>393
ダンプしろよ。

397 :NAME 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;
/

398 :NAME IS NULL:2012/12/24(月) 09:08:31.18 ID:???
オプティマイザがコストベースでアプローチしちゃうのを防ぎたいがためのヒントなんじゃないの?

399 :397:2012/12/24(月) 12:44:54.89 ID:???
>>398
oracle10g以降ではルールベースのサポートをしていないから、
ヒント句を書いても実行計画を見るとコストベースになっているんじゃないかな。
>>387に関しては、統計情報取ったら改善されると思う。

違っていたらすみません。

400 :NAME IS NULL:2012/12/24(月) 15:34:04.04 ID:???
ORACLEの話はORACLEのスレでやれよ
元質問者はDBMS明記してないし

401 :NAME IS NULL:2012/12/24(月) 15:38:39.79 ID:???
そうなんだサンクス
ヒント句って実行計画を無理やり捻じ曲げるようなものだと勘違いしてた

402 :NAME 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

と交互に抜き出す方法はありませんか?

403 :402:2012/12/26(水) 17:11:37.48 ID:???
UNIONでできました
解決しました

404 :NAME IS NULL:2012/12/26(水) 19:18:20.57 ID:???
なんでunionでできたのかわからんな
unionでも何でもorder byをつけないと順序は保証されないが

405 :NAME IS NULL:2012/12/26(水) 19:25:59.97 ID:???
>>402
参考までにそのSQL教えて下さい

406 :NAME IS NULL:2012/12/26(水) 20:16:57.11 ID:???
>>404
order byじゃ無理だろ。
>>402を良く読め。

407 :NAME IS NULL:2012/12/26(水) 20:44:31.34 ID:???
>>406
おまえこそ>>404の真意をよく読め。

408 :NAME IS NULL:2012/12/26(水) 20:57:58.74 ID:???
ORDER BY でどうやって1, 2, 4, 9, 7, 5って並べるのよ?
1, 2, 4, 5, 7, 9じゃないんだぜ。

409 :NAME 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;

でどうだ

410 :NAME IS NULL:2012/12/26(水) 21:27:40.93 ID:???
>>409
Oracle前提で言うと、ROWIDじゃなくて、ROWNUMだろ。
ROWNUM*2+0とROWNUM*2+1をunion allしてsortだ。

411 :NAME IS NULL:2012/12/26(水) 21:33:09.94 ID:???
>>408
order byつけなければ順序が保証されないうえ、
order byでは解決できない内容なのに、
unionでできたのが何でかわからん
って話でしょ?

412 :NAME IS NULL:2012/12/26(水) 21:35:34.97 ID:???
実は「交互に」は大して重要な要件じゃなくて
単にA列とB列を列挙したかっただけのような気がしなくもない

413 :NAME IS NULL:2012/12/26(水) 21:40:22.88 ID:???
>>412
俺もそう思う。
なのでorder byじゃなくてunionで正解だと思う。

414 :NAME IS NULL:2012/12/26(水) 21:50:33.15 ID:???
>>408
空気脳は日本語も理解できないのかよ?w

415 :NAME 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;

416 :NAME 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;

417 :NAME IS NULL:2012/12/27(木) 17:41:15.16 ID:???
>>415
数字しか通用しない上に順序も保障されないんだが?無駄に複雑にしてるだけだな
>>416
それも順序が保証されない
やってみて上手くいってるように見えるかもしれないが、それはたまたま

XXとDの直積のテーブル結合の方法をヒントとかで制御できるなら
望みの順番で出力されるかな?どっちにしろ保障外だが

418 :NAME 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結構ありそうだし

419 :NAME 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です

420 :NAME IS NULL:2012/12/27(木) 22:42:17.24 ID:???
>>419
CASE使えとかそう言う事?

421 :NAME IS NULL:2012/12/28(金) 12:35:12.17 ID:ClRuT7DF
>>420
CASEでもなんでもいいです

とにかくおを条件文で変える方法が知りたいです

422 :NAME 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

どうすればいいでしょうか。
よろしくお願いします。

423 :NAME IS NULL:2012/12/28(金) 13:43:21.12 ID:???
>>421
だからCASE使えよ

>>422
明らかに設計が間違ってるが、マイナスを考慮しないなら
-を小数点に変換して数字として扱えば行けるんじゃね

424 :NAME 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に上記の関数があるかどうかしらんけど

425 :NAME IS NULL:2012/12/28(金) 13:53:27.29 ID:???
>>424は忘れてくだちぃぃ^^;

426 :NAME 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が邪魔です。
どうにかなりますでしょうか?

427 :NAME IS NULL:2012/12/28(金) 16:50:56.38 ID:???
order byのところに式は使えないんだっけ?
けどいらんのだったらつかわなきゃ良いだけの話では?

428 :NAME IS NULL:2012/12/28(金) 18:08:54.76 ID:???
つかorder byに別名指定できるのか?
2012から仕様変わったか?

429 :NAME 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 データベース);

430 :NAME IS NULL:2012/12/29(土) 07:25:46.42 ID:???
>>422です。
色々有難うございました。
>>429 
ウチのデータベースの形が悪いせいだと思うのですが
上手くいかなかったので、邪魔な列はそのままで使おうと思います。

431 :NAME 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とエラーが表示されましたので間違っているとは思うのですが
こういったことが可能であれば構文的にご指摘いただけないでしょうか。

432 :NAME IS NULL:2012/12/29(土) 20:10:59.23 ID:???
他に行を区別できる項目が無ければ基本的に無理
DBMSによってはそう言う列や関数があるかもしれん

433 :NAME IS NULL:2012/12/30(日) 03:25:55.33 ID:???
update list
set target=1
where ユニークキー = (select ユニークキー from list where id=1 limit1)
ユニークキーも設定してないゴミテーブルなら知らん

434 :NAME IS NULL:2012/12/30(日) 06:22:37.55 ID:???
>>433
id=1 and ユニークキー=aaa

435 :NAME IS NULL:2012/12/30(日) 15:15:17.33 ID:???
>>431
id=1が複数あるなら、
全レコードをいったん取得してから削除し、
必要なデータだけ修正して、
全レコードインサートする

なんてするのかな?

436 :NAME IS NULL:2012/12/30(日) 21:28:40.63 ID:???
そもそもidが複数あるのがよくわからないが。

437 :NAME 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);

438 :NAME IS NULL:2012/12/30(日) 22:26:14.69 ID:???
DBの種類も書いてないのになぜrowidが使えると思うのか。
limitが使えないってことは少なくともmysqlじゃなさそうだが。

439 :NAME IS NULL:2012/12/30(日) 22:53:38.86 ID:???
>>434
頭大丈夫?

440 :NAME 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
)

かな。
主キーが複合キーならそれなりに書き換えて。

441 :NAME IS NULL:2012/12/31(月) 00:25:37.76 ID:???
>>440
それ複数行書き換えるだろ

442 :NAME IS NULL:2012/12/31(月) 09:15:44.56 ID:???
こうだな。
update list
SET target=1
WHERE ユニークキー =(select max(ユニークキー) from list where id = 1);

443 :NAME IS NULL:2012/12/31(月) 09:26:22.22 ID:???
>>441
いや、複数行にはならんだろ

444 :NAME 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;

445 :NAME IS NULL:2012/12/31(月) 19:53:59.62 ID:???
>>440
>>442
キーがあるなら>>433で十分だろ

446 :NAME IS NULL:2012/12/31(月) 20:58:52.07 ID:???
limitが使えるDBMSの場合は、な。

447 :NAME IS NULL:2012/12/31(月) 23:48:19.21 ID:???
エラーメッセージから見て >>431 は、MySQL だろ。

448 :NAME IS NULL:2013/01/01(火) 19:29:09.67 ID:???
>>440,443
UPDATEのテーブル名に別名付けれるのは汎用的じゃないと思うぞ

449 :NAME 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
    メール  aaa-zzz@tba.t-com.ne.jp

  ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

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

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

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

現在、テーブルのイメージはこんなかんじです
Monsterをあらかじめ大量に作っておくしかないでしょうか
他にいい方法はありますか?

451 :NAME IS NULL:2013/01/02(水) 13:41:41.32 ID:???
正規化を勉強するのがいいと思う。
SQL関係無いからこの辺で、、、

452 :NAME IS NULL:2013/01/02(水) 13:54:21.28 ID:gqHbCqyn
ありがとうございます。スレ違いすいませんでした。

453 :NAME IS NULL:2013/01/02(水) 15:09:09.64 ID:???
ゲームじゃないけど、
ここでいうモンスターみたいなのが1カラムにカンマ区切りで入ってるデータベースを知ってる

454 :NAME IS NULL:2013/01/02(水) 15:46:28.18 ID:???
正規化を見て理解しました。
フィールドごとのテーブルを作れば解決だったんですね。ありがとうございました。

455 :NAME IS NULL:2013/01/02(水) 17:16:19.67 ID:???
>>454
それだとそのテーブル名をどこから引いてくるかという問題が発生する。

456 :NAME 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)
です。

負荷を軽くする方法はないでしょうか?

457 :NAME IS NULL:2013/01/03(木) 20:13:30.19 ID:???
group by や max を使わないで済むようにテーブル構造変えればいいじゃない。

458 :NAME IS NULL:2013/01/03(木) 21:01:56.26 ID:???
>>456
実行計画みてみないと何とも言えないが
一般的にはrankか、size,md5,mimeにインデックス張る
INをやめて相関問い合わせで=にしてみたら早くなるかもしれん

それ以上はRDBMS実装に大きく依存するからmysqlのスレで聞け

459 :NAME 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の解決策→まだわかりません。

ただ、解決策の載ったブログがヒットすることはわかりました。
数日かけてそうしたブログを理解していこうと思います。

460 :NAME IS NULL:2013/01/03(木) 21:15:27.93 ID:2T2n9/75
>>458
ありがとうございます。
学習が進んだら、mysqlスレでも聞いてみます。

461 :NAME IS NULL:2013/01/03(木) 22:43:38.18 ID:???
idは主キーなんだから、たぶんシステムが勝手にインデックス張ってるだろ
rankと(size, md5, mime)にインデックス張れよ

462 :NAME 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 |
+------------+--------------+
といった感じです

463 :NAME 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;

こんなのとか

464 :462: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

465 :NAME IS NULL:2013/01/04(金) 07:24:37.51 ID:???
統計情報
ってググっても統計情報を取得して〜とか統計情報を利用して〜
とかそんなようなことしか書いてないんだけど
具体的に説明すると何なん?
データの格納情報とかそういう意味?

466 :NAME IS NULL:2013/01/04(金) 08:15:40.39 ID:???
>>454
正規化とかいうならば、

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

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

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

ではないかな。

467 :NAME 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によってはさらに詳細な情報をとったりするし
とるかどうか選べたりもする

468 :NAME 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
    メール  aaa-zzz@tba.t-com.ne.jp

  ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

469 :462: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句は何も書かずにできました
出てくるデータの形が望んでいた形式じゃありませんでしたがプログラム側で簡単です。

470 :NAME IS NULL:2013/01/06(日) 22:40:55.67 ID:???
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。

これを一括で
Taro, Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。

471 :NAME IS NULL:2013/01/06(日) 22:43:00.56 ID:???
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。

これを一括で
Taro Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。

472 :NAME IS NULL:2013/01/06(日) 22:45:23.52 ID:???
substr使えよ。
多分mysqlにもあるだろう。

473 :NAME IS NULL:2013/01/06(日) 22:52:23.08 ID:???
>>472
substr使いこなせてません。。

474 :NAME IS NULL:2013/01/06(日) 23:35:49.79 ID:???
t-sqlでselectで時間のかかる処理を
一定時間でエラーさせたいのですが
どうすればいいのでしょうか?

475 :NAME IS NULL:2013/01/07(月) 05:20:28.57 ID:???
3割はhanako, yamadaで入っているのか?

476 :NAME IS NULL:2013/01/07(月) 09:47:58.77 ID:???
Taro という苗字が無いなどと
どうして言えるんだ

477 :NAME IS NULL:2013/01/07(月) 10:12:19.71 ID:???
カンマが入ってるものは全て逆順、ということなの?

478 :NAME 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を抽出したいです。
お願いします。

479 :NAME 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');

480 :NAME IS NULL:2013/01/07(月) 19:28:23.37 ID:???
>>479
ありがとうございます!

481 :NAME IS NULL:2013/01/09(水) 17:15:28.84 ID:??? ?2BP(0)
幾つかフィールドを持つ検索UI作ってるんだけど、各々のフィールドに入れた値によって他のポップアップに出てくる値を絞りたいんだけど、
そう言うのって普通どうしてますか?

482 :NAME IS NULL:2013/01/09(水) 17:41:48.60 ID:???
何の話?
何とかSQL、とかの製品名の話なら専用スレでどうぞ。

483 :NAME IS NULL:2013/01/09(水) 18:48:20.55 ID:???
っていうかアプリ側の話だろうに。

484 :NAME IS NULL:2013/01/09(水) 21:41:17.50 ID:???
>>481
全部持ってきて随時ゴリゴリするか、データ構造を工夫するか、毎回持ってくるか状況によるけど
次からスレ違いしないでね

485 :481:2013/01/10(木) 11:01:05.94 ID:??? ?2BP(0)
ありがとさんです。
sqlでwhereなしに全部持ってきて、後は配列操作で何とかするのが王道ですか。
検索フィールドの項目を選択する毎にwhereで条件追加とかするのかと思ってました。

486 :NAME IS NULL:2013/01/10(木) 17:14:29.95 ID:???
話通じてないし

487 :NAME IS NULL:2013/01/10(木) 17:15:29.42 ID:???
ワロタ

488 :NAME 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万円〜にしましょう。

489 :NAME IS NULL:2013/01/14(月) 18:52:14.16 ID:???
>>488
どういう処理がしたいのか書いてくれ

490 :NAME 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

宜しくお願いします。

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

492 :NAME 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

493 :NAME 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

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

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

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

この説明だと select a,b で良いんじゃねえのかと思うぞ

496 :NAME 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
何度も済みませんがよろしくお願いします。

497 :NAME IS NULL:2013/01/15(火) 08:03:09.59 ID:???
>>496
>>5

498 :NAME 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

年で別れてしまっている行を
月だけでまとめたいのですが。

499 :NAME IS NULL:2013/01/15(火) 10:43:31.48 ID:???
>>498
http://msdn.microsoft.com/ja-jp/library/ms187748.aspx

500 :NAME 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

でいいのでは

501 :NAME IS NULL:2013/01/16(水) 22:08:48.39 ID:7bZDmpX4
年月が別の型ならそれをふまえてね

502 :NAME 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すればいいだけですが、
同時に上記の条件で件数を出そうとするとどうしたらいいか分かりません。
よろしくお願いします

503 :NAME IS NULL:2013/01/17(木) 07:56:53.99 ID:???
>>502
まずテーブルAのgroupbyで金額のsumと件数1を返すクエリを作って、それとテーブルBを結合すればいいのでは

504 :NAME IS NULL:2013/01/17(木) 12:01:41.50 ID:???
>>500
すごい勉強になりました。
有難うございました。

505 :NAME IS NULL:2013/01/17(木) 15:53:02.51 ID:???
>>504
即レスしてくれた>>499はスルーなのね。

506 :NAME 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

507 :NAME IS NULL:2013/01/17(木) 19:55:25.20 ID:Q5aJSjp6
>>505
質問の答えじゃなくヒント程度なんだから
そこから答えが導けないならスルーされてもしょうがないんでは
レスが欲しいなら欲しいなりの回答したほうがいいかと

508 :NAME 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万円〜にしましょう。

509 :NAME 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.分類

510 :NAME IS NULL:2013/01/17(木) 22:37:18.46 ID:IiOhCqTn
T-Sql使ってます
複数の会社へ順番に接続して
DOSバッチからクエリ動かして結果を収集してるのですが
通信や処理が重くて、時間かかる所があります
一分ぐらいで取得不可なら次の会社へとするようにする方法は無いでしょうか?

511 :NAME IS NULL:2013/01/17(木) 22:42:22.62 ID:???
1分で取得不可なら飛ばしていいようなどんな情報を収集しているのか聞かないと
答える気にもならない

512 :NAME IS NULL:2013/01/17(木) 22:49:45.29 ID:???
スレ違い。

513 :NAME IS NULL:2013/01/17(木) 23:19:18.45 ID:???
>>511
会社の売り上げとかです
大きなデータではないです
一分は例えばの話です

514 :NAME IS NULL:2013/01/17(木) 23:27:11.81 ID:???
>>510
接続タイムアウトクエリタイムアウト通信タイムアウトあたりの設定を見直せばいいんじゃないかな。

515 :NAME IS NULL:2013/01/18(金) 06:28:12.47 ID:???
SQLと関係あるのか?w

516 :502:2013/01/18(金) 07:01:14.79 ID:???
>>503,506,509
ありがとうございます。
急な出張に出ることになってしまい
実際にクエリをまわせるのが週末になってしまいそうですが
確認でき次第、再度ご報告しますね

517 :NAME IS NULL:2013/01/18(金) 10:18:01.01 ID:???
>>515
ついでに誘導してあげたらいいのに

518 :NAME IS NULL:2013/01/19(土) 00:53:28.66 ID:???
報告とかいらんから。スレ違いなんで、↓に行け。

Microsoft SQL Server 総合スレ 9
http://toro.2ch.net/test/read.cgi/db/1310645522/

519 :NAME 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位・・・
というふうに学年クラス順に順位の高い生徒を並べ替えたいです
よろしくお願いします

520 :NAME IS NULL:2013/01/22(火) 14:25:24.79 ID:???
漠然とした一般的な話なんですが、インデックスに関して教えて下さい
例として販売データテーブルがあったとします。
そして、PKが商品コード、販売日、担当者コードとして、この時、商品コード単体で
検索をする時に商品コードだけにインデックスを設定すれば、その効果が
ある…と考えて良いんですか?

521 :NAME IS NULL:2013/01/22(火) 14:50:24.72 ID:???
>>519
MySQLだと一旦クラス内での順位をつけてから自己結合かなぁ。
あと、別に縦を横にしたいわけじゃないよね?

>>520
よく分からない。インデックスを作成しなければインデックスの効果は得られないよ。
商品コードを含んでいるPKがインデックスの代替になるかということであれば、RDBMS次第

522 :NAME IS NULL:2013/01/22(火) 15:06:51.32 ID:???
520です。
>>521さん、ありがと。
もう少し勉強しますm(__)m

523 :NAME 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 させりゃインジャネ?

524 :NAME IS NULL:2013/01/22(火) 18:28:28.70 ID:???
>>523
ツッコミまち?

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

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

> 気のりしたら相手してやる。
→気のりしたら他にもつっこんでやる。

525 :524:2013/01/22(火) 18:30:15.67 ID:???
ああ恥ずかしい。
結合抽出した結果じゃなくて、単に求める結果だな。ごめんごめん。

526 :NAME IS NULL:2013/01/22(火) 19:08:42.47 ID:???
求める結果の割に得点順にもクラス順にもなってないのはなぜ?

527 :519:2013/01/22(火) 20:09:13.55 ID:???
書き方が悪く伝わらなかったみたいですみません。
524さんの言うとおり一番下のテーブルみたいなのはテーブルじゃなくほしい結果です。

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

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

よろしければお願いします。

528 :NAME IS NULL:2013/01/22(火) 20:40:21.61 ID:???
やりたいことは分かるがなんでこれが必要なのかがわからん
それと例えば1-1が3行あって1-2が4行あったら1-1の学年4位の行はどうなるんだ?NULLで補完されないと駄目なのか?

529 :NAME IS NULL:2013/01/22(火) 20:58:51.29 ID:???
SQLの中だけでやろうとすると大変だけど、
外部のプログラムに渡してソートさせたらどうだろう?

530 :NAME IS NULL:2013/01/22(火) 21:15:07.50 ID:???
>>527
1回で扱うデータ量が多いから遅くなる。

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

それ以上の高速化をする場合はDBエンジンのチューニングとか・・・。

531 :NAME 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
縦を横にする必要はないみたいだよ。

532 :NAME IS NULL:2013/01/22(火) 21:38:57.25 ID:???
お前らselect文よく思いつくね
俺は有名どころからコピペしてきて改変作業しかしないから
1から作ることが出来ない

533 :NAME IS NULL:2013/01/22(火) 21:47:04.34 ID:???
普通の手続き型言語とは思考方法がちょっと違うからね

select句にサブクエリ書いてるような人は手続き型言語の思考から
抜け出せてないんだろうなあと思う

534 :NAME IS NULL:2013/01/22(火) 21:48:04.67 ID:???
考える前に検索して終わらす病だな
それを続けてるといつかDCや客先の隔離施設で自分の無能を痛感することになる

535 :NAME IS NULL:2013/01/22(火) 21:57:26.86 ID:???
>>533
抜け出すとどんな感じに書くようになるのか書かないなら>>523にも劣るぜ

536 :NAME IS NULL:2013/01/22(火) 22:29:45.51 ID:???
>>527
同じクラスに同点の生徒がいたらその場合の規則は?
それによってみんなのSQLなんて全部だめだろ

そもそもこんなデータ構造をむりやり1回のSQLで
問い合わせても満足な速度はむりだと思うぞ
その辺は気にしないのか?

537 :NAME 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

538 :NAME 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;

539 :NAME IS NULL:2013/01/23(水) 02:35:49.85 ID:???
>>538
ありがとうございます!いけました!
GROUP BYを使うのですね・・基礎的なことがごっそり抜けていることが分かりました。
もっと勉強せねば。
本当にありがとうございました!

540 :527:2013/01/23(水) 09:25:09.52 ID:CISRUOZX
色々回答ありがとうございます。
設計が間違ってたんですかね。
バッチで順位付けやビューですが、生徒テーブルには男女や親の年収やら補導歴やらいろんなのがついてて
WHERE 男で親の年収500万以上で補導歴なしみたいなことにもなるので無理なんです。
設計からやり直してみます。

541 :NAME IS NULL:2013/01/23(水) 11:03:11.67 ID:???
>>540
得点にインデックスをつける
クラス毎のビューを用意する(5000行あるなら、スクリプトか何かでやるしかないだろうなぁ)
並べ替えはSQLでやるけど、順位の番号は読みだしてから手続き言語でやる

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

そもそも学校に例えてるのがおまいさんの思い込みであって実際のモデルとかけ離れてる気がしないでもない。
実際の学校だとしたら、5000クラスもないし、生徒テーブルに得点入れたりしないだろうし。

542 :NAME IS NULL:2013/01/23(水) 15:52:32.88 ID:???
作るメリットがまるでないビューを5000個作れとか拷問だろ。

>>540
なんか改善できそうな気はするけどね。
>>531のクエリは運用に耐えられる速度じゃなかったってことかな。

543 :NAME 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= を外部スクリプトで書き換えて実行。)

544 :NAME IS NULL:2013/01/23(水) 19:20:48.60 ID:???
1クラスずつやるのなら、クラスごとのインデックスが効けば大差ないと思うが
質問者はまずちゃんとインデックス張ってるのかから確認せんといかんレベルだろ

545 :NAME IS NULL:2013/01/23(水) 20:14:20.76 ID:XLyIL2Lt
>>541
得点にインデックスなんて無駄
そんなインデックスつけても要件を満たしていない

546 :NAME 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のコストが、とか言い出したら末期だけど、
他の理由があるのなら知りたい。

547 :NAME IS NULL:2013/01/23(水) 20:58:01.08 ID:???
>>546
ほかのDBエンジンに移植した時に動くようにじゃね?
SQLSERVERとかJETじゃ動かないんだったと思うけど。<using

548 :NAME IS NULL:2013/01/23(水) 21:13:59.85 ID:???
>>527
ちなみにだけど、速度要件はどれくらい?
postgresqlで申し訳ないんだけど、初期core i7環境で試したら30秒くらいだった。

>>547
mysqlでusingは使えるようだよ。
というか、問題視したのはそこじゃなかったんだけど余計なことしちゃったな。

549 :NAME IS NULL:2013/01/23(水) 21:57:17.02 ID:???
>>548
何が(どのSQL)が30秒なの?

550 :NAME IS NULL:2013/01/23(水) 22:58:49.24 ID:???
最終的に10万行全部を出力するんだよね?

551 :527:2013/01/24(木) 05:27:12.91 ID:???
学校に例えたのが悪かったみたいですね

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

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

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

色々ありがとうございました

552 :527: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

こんな風に書いてます。

553 :NAME IS NULL:2013/01/24(木) 05:47:13.37 ID:???
今時のマシンで10万件程度で30秒もかかるかと思って、ちょっとSQLServerで実験してみたが
>>531のSQLとか、Core2Duoのマシンでも2秒で終わるぞ
まあ実際のレコードサイズとか学年とかクラスのばらけ具合で多少の差は出るかもしれんが
それより10万件のテストデータつくる時間が超暇だったぜ

554 :NAME IS NULL:2013/01/24(木) 05:57:32.68 ID:???
>>552
こういうのみると、MySQLはRDBMS名乗るなと思いたくなるな

555 :NAME IS NULL:2013/01/24(木) 15:00:43.68 ID:???
>>553
連番生成してくれる機能がないRDBMSの場合は連番テーブルを作っとくと何かと便利かもね
(>>8が関連するかも)

556 :NAME IS NULL:2013/01/24(木) 21:38:09.56 ID:07BNynAu
途中でレスしてるのを見てのると実際は「条件が実際は複雑」「結合してるものがもっとある」
「取り出してる情報が多い」ってのがあれば遅くなるってのも普通だろ
あそこまでいっていればSQLだけでなく、他の部分も含めての改良をしない限りは
改善できないと思うね

まあ10万件を2秒で終わるのはすげーと思ったわ
描画なり、出力なりでもそんな訳ないんじゃねと

557 :NAME IS NULL:2013/01/24(木) 23:50:59.97 ID:???
一画面分だけ処理して表示してるのを終わったと思ってるの鴨。

558 :NAME IS NULL:2013/01/25(金) 01:53:21.21 ID:???
10万件ったって、1レコード10バイトなら1メガバイトだからな
>>548がどんな風にやったか知らんが、与えられた条件(>>519のレイアウトで
>>531のSQL)で30秒はかかりすぎだと思っただけだ

559 :NAME IS NULL:2013/01/25(金) 04:08:06.06 ID:???
質問主が現状かかっている時間を書かないのはなんでなんだろね。
速度要件は特にない、遅いから改善したいだけじゃ状況もつかめない

560 :NAME IS NULL:2013/01/25(金) 05:57:13.72 ID:???
自分はあのシステムは価格比較みたいな情報を
とりたいSQLなんだと思うわ
商品別の安い順で店名と価格とかね
まあどっちにしろSQLの質問であれば
上で回答してるSQLが正解だろうけど
それ以上の改善を求めるなら情報を
もっと出すしかないし、だせないなら
これで終わりな話題でしょ

561 :NAME IS NULL:2013/01/25(金) 07:58:32.06 ID:???
10万件=100K件なんで、1件が何バイトかにもよるけど、たいした量ではないと思うんだが。

562 :NAME 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です

563 :NAME IS NULL:2013/01/25(金) 12:13:59.87 ID:???
三つのテーブルを外部結合していっぺんに取ってきて
null の方は捨てる

564 :NAME 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限定な書き方ならもっとヘンタイな最短があるかもしらん。

565 :NAME IS NULL:2013/01/25(金) 17:35:16.77 ID:???
>>564
一般にunionはコストの高い操作(使うならunion allの方がいい)
それにjoinしてもインデックスは効かないだろうからさらにコストが高い
その方法でやるなら、joinしたものをunion allした方が多分早いから
重複してようがしてまいが下のSQLだけでいいんじゃね

566 :NAME 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

567 :NAME 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の該当件数が少ないならこれが最良だとおもうが

568 :566:2013/01/25(金) 17:50:22.40 ID:???
>>567
同じクエリ :)

569 :NAME IS NULL:2013/01/25(金) 18:04:31.80 ID:???
>>567
そのインデックスに効果はなさそうに思う。

570 :565=567:2013/01/25(金) 18:11:04.06 ID:???
>>568
リロード大事だな
まああれだから、いちゃもんレベルの指摘しとこう
whereで絞る順序はカーディナリ高い奴からってのが基本
まあいまどき順番通りにしかインデックス使えないようなオプティマイザじゃないだろうし
どうせidは主キーだろうから実際はあんまり関係ないんだけど

俺ならこのレイアウトなら(id,groupType)でt_allの主キーにするけど
idのみ主キーなら、groupTypeの検索はwhereじゃなくてonのとこに書く方が好み

571 :NAME 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 = ?


こうじゃねーの?

572 :571:2013/01/25(金) 22:08:59.00 ID:5gQwGGS8
これでGROUPTYPEみて参照するカラムを分けりゃいいだろ
何か難しくしたいの?

573 :562:2013/01/25(金) 22:50:25.17 ID:???
素晴らしい方法の数々ありがとうございました
自分の頭の固さや基礎知識の乏しさを痛感しました
勉強してみます、ありがとうございました

574 :NAME IS NULL:2013/01/25(金) 23:52:13.21 ID:???
>>572
>>566の最後がそんな感じ。
テーブル構成的にgrouptypeを見る必要はないだろうし、そうなってくると、
そもそもcoalesceがいらないよねってことで>>567みたいになる。

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

>>573
がんばれー

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

それとgrouptypeなんてデータの分布を考えたらインデックス貼るなんてありえないんじゃね

576 :NAME IS NULL:2013/01/26(土) 01:05:04.57 ID:???
>>575
groupType単体にインデックス張る効果は多分ほとんどないだろうけど、誰もそうしろとは言ってないだろ

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

まあ最短でって希望なんで一般的にもっとも早くなるように色々考えてるけど
実際にはどうでもいいレベルの話
MySQLでどこまで思った通りに動くかもしらんしな

577 :NAME IS NULL:2013/01/26(土) 02:07:56.85 ID:???
俺の経験ではこんなSQLでUNION使いたがる奴は大抵馬鹿
今回はもとになるテーブルの条件が単一ならば
UNIONを使う必要はまったくないし
サブクエリでUNIONとかありえないレベル
でもこういうSQLを考える奴が多いんだよな世の中w

578 :NAME IS NULL:2013/01/26(土) 02:39:50.14 ID:???
>>577
どれくらいコストに差がありましたか?

579 :NAME IS NULL:2013/01/26(土) 06:34:35.86 ID:???
>>578
聞くまでも無く2倍以上の差があるだろ。
UNION使うということは、2回SELECTした上で、その2つの結果をSORTしてるんだぞ。

580 :NAME IS NULL:2013/01/26(土) 10:04:15.41 ID:???
>>579
>>565

581 :NAME IS NULL:2013/01/26(土) 11:09:18.03 ID:vF4LejwG
テーブルAのカラム1が○○またはカラム2が××のデータを取り出すような場合、
どちらかのカラムはインデックスが効かない分遅くなる可能性がある
そういった場合にUNION ALLするのは効果があるだろうが
今回のようなケースではそんな事しても意味がない
UNION信者は悪いやり方を広めないほうがいい

582 :NAME IS NULL:2013/01/26(土) 11:44:39.64 ID:???
なんだ。エンタープライズ病のオラクル厨か。

583 :NAME IS NULL:2013/01/26(土) 12:58:30.10 ID:vF4LejwG
俺が今開発で使ってるのはORACLEじゃないが
数十件程度のSQLですぐ結果があるからこれでいいだろみたいなクズは
ORACLEとか使って大量データをこなすSQLは作れないだろうな
全然駄目なSQL作る奴ほど「インデックスが必要です(キリッ)」
「正規化がおかしいんじゃないでしょうか」「データが大量過ぎる;;」とか言い出すわ

そもそもORACLE厨なんてこんなスレにこないだろw
MYSQLみたいなDB使うシステムしかやれない低級PGばかりだと思うが

584 :NAME IS NULL:2013/01/26(土) 13:06:21.50 ID:???
釣りだよね

585 :NAME IS NULL:2013/01/26(土) 16:18:50.35 ID:???
割りとマジなんじゃね?

俺なら SQL で自慢とか恥ずかしくてありえないが。

586 :NAME IS NULL:2013/01/26(土) 16:38:29.03 ID:???
>>571-572
明示されてない要件を自分の都合の良い方に決めれるならそれで良いな

587 :NAME IS NULL:2013/01/26(土) 20:41:08.28 ID:???
>>583
なんとなく同意。

588 :NAME 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で問題ないんじゃないか
質問者の要件以外に自分勝手に決めた要件があるかい?

589 :NAME IS NULL:2013/01/26(土) 22:35:42.50 ID:???
明示されていない要件っていってるのに、明示されてる要件だけ上げてどうするんだ

たとえば、取得するのはAまたはBとある
AもBも出して良いのか、AかBのいずれかしか出してはいけないのかは明示されていない
ホストアプリ側でAが該当したのかBが該当したのか関知したくない場合は、両方出して
ホストアプリで判断する仕様にする事が妥当だと言えるか?
そう考えると勝手に両方だして自分で判断しろってのは要件を勝手に決めてるだろ

590 :NAME IS NULL:2013/01/26(土) 23:08:58.94 ID:???
質問スレで何言っちゃってるんだろ、この人…

591 :562:2013/01/27(日) 00:36:50.92 ID:???
すみません、あいまいな質問したばかりに
3つのテーブルのidはそれぞれauto_incrementを設定した主キーです
今さらですみません

592 :NAME 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
わざわざどうも、いろいろ試してみるといいよ

593 :NAME IS NULL:2013/01/27(日) 04:03:14.46 ID:???
まあ実際のとこ詳しい事は>>562にしかわからん
>>562>>563方式(>>571のSQL)でいいならそれでいいんじゃないか
unionするよりは確かに早いだろう
(それでも2倍も差はでないだろうけど)

594 :NAME IS NULL:2013/02/02(土) 17:51:27.98 ID:xdgMUmqf
※本投稿の拡散お願い致します。
◯外国労働者を海外から日本の企業での作業(物理的に日本にいる必要はない)に従事させる場合、海外の受注者は派遣業者として登録し派遣法に準拠しなければならない。違反すれば職安法違反となる。

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

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

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

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

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

◯刑事告訴は無料です。元請けの各役員報酬は数千万円はゆうに超えているでしょうから、
総額で4000万円〜程度の和解金となるでしょう。
和解金の相場は日本の相場に準拠しますので、皆様の国の平均生涯年収を超えることは間違いないでしょう。

595 :NAME IS NULL:2013/02/02(土) 18:10:25.14 ID:???
民事じゃあるまいし、和解金などあるわけない

596 :NAME IS NULL:2013/02/02(土) 21:47:17.92 ID:???
ニホンゴデカカレテモワッカリマセーン

597 :NAME IS NULL:2013/02/03(日) 00:34:45.61 ID:???
You fool HA-HA-HA!

598 :NAME 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を書けば良いのでしょうか?

599 :NAME 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知らないけど

600 :NAME IS NULL:2013/02/05(火) 16:07:23.60 ID:???
上げちった・・・すまん

601 :598:2013/02/05(火) 16:38:47.29 ID:???
>>599

感謝です!!

一旦
select tcode,max(tdate) as maxdate
from daily_date
group by tcode;
で出したのをループでやっていくかぁと思ってたとこでした^^;

602 :NAME 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の値を求めたいです。

よろしくお願いします。

603 :NAME IS NULL:2013/02/06(水) 15:41:50.85 ID:???
select sum(列1)/sum(列2) from TBL;

604 :NAME IS NULL:2013/02/06(水) 15:44:11.54 ID:???
ごめん よく読んでナカタ

select (sum(列1)-sum(列2))/count(*) from TBL;

605 :NAME IS NULL:2013/02/06(水) 15:48:52.99 ID:???
>>604
sumの場所間違ってるだろ。

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

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

ABSも入れといてやったぜ。

606 :NAME IS NULL:2013/02/06(水) 16:26:43.71 ID:???
素直に
select avg(列1 - 列2) from データベース
で良い気が

607 :NAME IS NULL:2013/02/06(水) 16:41:28.02 ID:???
「差異」の平均だから、理系の奴はABSを付けるだろうし、
そうじゃない奴はABS無しで済ますんだろうな。

608 :NAME IS NULL:2013/02/06(水) 16:45:35.29 ID:???
>>605
俺は>>604ではないが
差異が列1と列2の差としか書いてないからなぁ
絶対値とる必要があるなら>>604はちゃんと動かないけど
そうじゃないなら行けるのは行けるんじゃね
sum(a-b)=sum(a)-sum(b)だと思う

問題はNULL絡んだらどうなるかってのがあるけどな

609 :NAME IS NULL:2013/02/06(水) 16:51:56.73 ID:???
>>607
理系のやつは絶対値とれって明示されてないのでやりませんよ
言外の意味を解釈しないのが理系です

610 :NAME IS NULL:2013/02/06(水) 18:51:30.80 ID:???
>各番号の列1と列2の差を求め
と書いてあるから、差異は必ずプラスだろ。
各番号の列1から列2を引いた値と書いてあったなら単純にマイナスで良いと思うが。

611 :NAME IS NULL:2013/02/06(水) 19:48:34.31 ID:???
なんで正の値が保証されるの?

612 :NAME IS NULL:2013/02/06(水) 20:42:38.67 ID:???
>>611
保障されないから絶対値取れって話だろ
まあ、それはどうしたいか>>602が言えばすむ
それよりNULLがあるのかどうかの方が大事

613 :NAME IS NULL:2013/02/07(木) 08:06:54.17 ID:???
>>603-612
ありがとうございます。
列1と列2の値はMAXとMINで取ろうと思ってました。
NULLはないので教えていただいた方法で行けそうです。
ありがとうございました。

614 :NAME IS NULL:2013/02/13(水) 08:34:38.70 ID:???
温かいスレだ

615 :NAME 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.のそれぞれ)は同じものと理解して問題ないのでしょうか?

616 :NAME IS NULL:2013/02/15(金) 18:19:51.37 ID:???
動くの?

617 :NAME IS NULL:2013/02/15(金) 18:50:11.67 ID:???
>>615
ヒント:
 SQLの評価順は
 FROM→WHERE→GROUP BY→HAVING→SELECT→UNION→ORDER BY

618 :NAME IS NULL:2013/02/15(金) 18:54:51.86 ID:???
もう少しヒント:
 GROUP BYの段階で集計(SUMとかMAXとか)が行われる

619 :NAME IS NULL:2013/02/15(金) 20:07:46.23 ID:???
>>615
まずそのSQLは普通はエラーになるはず
HAVINGに集約関係ない式は指定できない

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

論理的な話なら>>617

あとgroup byで分割されたレコードの集合なんてない(内部的にワークとして作ってるかもしれんが)
分割にしても集約にしても操作されたものと操作前のものが同一だとする理由が解らん

620 :NAME IS NULL:2013/02/16(土) 08:39:06.29 ID:???
>>615
宣言的記述であるSELECT文に関して処理の流れや順序を問うことにあまり意味は無い。

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

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

ちなみに仕様に書かれている手順に興味があるのであればSQL92の仕様書のSELECT文の
Semanticsの項を読んで下さい、と書こうとしたのだけれども、あれの邦訳ってどこに
転がっているのだろう。丸善Date本やアジソンウェスレイの標準SQLガイドのSELECT文の
項にはちゃんと仕様で定められた評価順序が書いてあるのだけれども。

621 :NAME IS NULL:2013/02/16(土) 13:21:32.12 ID:/IbyUisN
データベーススペシャリストの勉強本でいいのない?

622 :615: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
ここに書いてあるようなテーブルの項目に対する条件と集計関数の結果に対する条件という違いという理解であっているのでしょうか?

623 :NAME IS NULL:2013/02/17(日) 03:29:11.64 ID:???
>>622
>ここの記事などを読んでgroup byがレコードの集合を作るのであれば
そのページの解説も、

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

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

てのがおかしい。

624 :NAME 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がマシ。

625 :NAME IS NULL:2013/02/17(日) 03:54:46.88 ID:???
またMySQLか、こんなでたらめSQL通すのは

626 :NAME 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行だけになってしまうのでこういう結果になる。
「テーブルの項目に対する条件と集計関数の結果に対する条件」だけだとこの例のような
事例を理解するにはちょっとイマイチだと思う。

627 :NAME IS NULL:2013/02/17(日) 11:33:33.65 ID:???
>>621
「情報処理教科書 データベーススペシャリスト」
スレチだけど、これ1冊読んでおけば十分。

628 :NAME 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のユーザーを検索しないようにするには
どうしたら良いんでしょうか
それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのか
わかりません

629 :628: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;

でした

630 :NAME 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加えればいいのでは?

631 :NAME 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だから場合によってはこれだけでもいいけど)

632 :628:2013/02/20(水) 01:39:25.92 ID:???
>>630-631
ありがとうございました
なんとなくわかってきました

633 :NAME IS NULL:2013/02/22(金) 19:55:44.90 ID:???
なんとなくで大丈夫か?

634 :NAME IS NULL:2013/02/23(土) 09:07:59.21 ID:???
色々やってりゃそのうちわかるさ。

何回か痛い目に会うかもしれないけど。

635 :NAME 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です)

636 :635:2013/02/25(月) 23:15:58.95 ID:8BczK/hd
あいまいだったので補足します
上記の条件での更新処理を実現するクエリ文を教えて欲しい、ということです
通常の更新条件としてはidをユニークキーとして想定しています

637 :NAME IS NULL:2013/02/26(火) 00:27:10.35 ID:???
>>636
id範囲指定による更新や、col1を指定しての更新はないと。

638 :NAME IS NULL:2013/02/26(火) 00:35:10.85 ID:ljDtJ7sG
>>637
そうです、通常の更新では
where Id =123 という形で更新できるんですが、
そこにcol2が0か1かによって、更新の可否や帰り値まで決定できるような
クエリが作れないかと思いました

一発では無理で、複数のクエリに分けるしかないんでしょうか
自分では思いつきません

639 :NAME IS NULL:2013/02/26(火) 00:44:44.52 ID:???
case式は?

640 :NAME IS NULL:2013/02/26(火) 00:58:59.25 ID:???
更新できるかどうかの確認だけで実際に更新処理するわけではないよね?

641 :NAME IS NULL:2013/02/26(火) 03:08:07.91 ID:???
select for updateかなぁ

642 :NAME IS NULL:2013/02/26(火) 08:04:38.39 ID:???
>>638
idを指定して更新するという文言がどこかに必要でしたね。

643 :NAME IS NULL:2013/02/26(火) 20:07:51.86 ID:???
それを1文でやる必要性がわからん

644 :NAME IS NULL:2013/02/26(火) 20:22:01.60 ID:???
mysql5のupdateって、更新した行数戻したりしないのか?
id指定するなら0か1なんだから、戻り見たらわかるだろ

645 :NAME IS NULL:2013/02/26(火) 20:26:10.86 ID:???
update HOGEHOGE set HEMOHEMO=MOKEMOKE
where id=PIYOPIYO and col2=0;

とでもして、戻り値で更新された行数を取得するとか

646 :NAME IS NULL:2013/02/26(火) 20:35:12.37 ID:???
affectedrowsは要件を満たさないと思ってそっとしといたのに

647 :NAME IS NULL:2013/02/28(木) 21:10:39.57 ID:3Nk6dQry
mysqlはよくわからんけど
select for updateでロックして
あればupdateして
updatedを返す
なければupdate_fail'かえすSQLブロックかけばいいんじゃね
それぐらいできるだろ

648 :NAME IS NULL:2013/02/28(木) 23:35:29.18 ID:???
update文では文字列返さないからselect文使うしかないかと
それじゃだめなの?

649 :NAME IS NULL:2013/02/28(木) 23:38:35.38 ID:???
>>628
a.id is not null をwhere句に追加かな

650 :NAME IS NULL:2013/02/28(木) 23:41:53.32 ID:???
>>621
sqlならプログラマのためのSQLがおすすめ
あとは翔泳社読んどけばいいよ

651 :NAME 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月にして累計を求める方法は
ありますでしょうか?
よろしくお願いします。

652 :NAME IS NULL:2013/03/05(火) 11:50:46.82 ID:???
思いっきり簡略化してこうなったのかな、、まあいいかw

ORDER BY 月 < 4, 月

をつけるとか。BOOL値でソートしてから月でソート

653 :NAME 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;

654 :NAME IS NULL:2013/03/05(火) 12:17:44.75 ID:???
>>651
2010年度の月っていうことは
01月は2011年01月という事?
データに年が入ってないの?

655 :NAME IS NULL:2013/03/05(火) 12:18:09.30 ID:???
>>652-653
ありがとうござます。
ご回答頂いた内容が難しいので
しばらく考えてみます。
ありがとうございました。

656 :NAME 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で書いてしもた
 関数がなければ適宜読み替えてくれ

657 :NAME IS NULL:2013/03/05(火) 12:54:35.36 ID:???
>>654
はい、その通りです。
最終的にそういう形になりました。

658 :NAME IS NULL:2013/03/05(火) 13:26:09.59 ID:???
>>652-654,656
ありがとうございました。
おかげで、理想の形にすることが出来ました。

659 :NAME 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ですが、、なかなかいい方法がわからなくて・・・

660 :NAME IS NULL:2013/03/05(火) 23:10:44.21 ID:???
>>659
別にkeyword 消し忘れてました  keywordは忘れてください。

661 :NAME IS NULL:2013/03/05(火) 23:45:54.55 ID:???
こういうこと?
select * from A_table where 'あいうえお' like '%' || title || '%'

|| は文字列連結演算子
MySQLではconcat関数なのかな?
そしてMySQLでこういう方法が使えるかどうかは知らない

662 :NAME 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
みたいなことがしたい。

663 :NAME IS NULL:2013/03/06(水) 12:11:04.60 ID:???
SET x = (CASE WHEN x = old1 THEN new1 ELSE x END),
y = (CASE・・・
とかつなげればできるけど、、、全行アップデートになる。

664 :NAME IS NULL:2013/03/06(水) 13:21:32.05 ID:???
素直に3行書けよ。
仮に1行にまとめられたとしても、実行計画は同じになるだろ。

665 :NAME IS NULL:2013/03/06(水) 13:46:42.58 ID:???
まあこの場合、new2とold3が同値だった場合3度に分けるとややこしいことに
なるかもだけど、そもそも元がタイプミスな気がしないでもないw

666 :NAME IS NULL:2013/03/06(水) 15:47:33.33 ID:???
>>659
すみません。WEBで入力した文字列というのは
どこにあるのですか?

667 :NAME IS NULL:2013/03/06(水) 16:01:40.19 ID:???
それくらい脳内補完が出来ないと
エスパー回答者にはなれない

668 :NAME IS NULL:2013/03/06(水) 16:55:18.81 ID:???
SQLインジェクションのほうに話を進めるのかと思ったw

669 :NAME 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

670 :NAME IS NULL:2013/03/07(木) 10:38:33.61 ID:???
SQLだけでやろうとしてるのはそう言う理由があるの?

671 :NAME IS NULL:2013/03/07(木) 10:52:52.49 ID:???
せめてテーブル名くらい指定してください。

672 :NAME 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の順に並べかえたいのですが、どのようにクエリーを書けばよいでしょうか?よろしくお願いいたします。

673 :669:2013/03/07(木) 11:17:37.56 ID:x/bLWl8/
>670
SQLだけじゃぁ無理でしょうか?(ノω・、)
ストアドプログラム?とかでも大丈夫です

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

よろしくお願いします!

674 :NAME IS NULL:2013/03/07(木) 11:52:24.93 ID:???
>>672
数字にして名称と数値のテーブル別に作った方がいい気もするが
MySQLなら、
ORDER BY field(季節,'Spring', 'Summer', 'Fall', 'Winter')
でいけるかな?

675 :NAME IS NULL:2013/03/07(木) 16:31:03.49 ID:???
>>673
> ←前日の繰越がマイナスなら残はゼロに
これさえなきゃ単純にSQLでかけると思うんだけどね。

676 :NAME IS NULL:2013/03/07(木) 18:17:46.60 ID:???
>>663
なるほど。case式は頑張って書くとしても、全行アップデートはいやですね。

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

>>665
すみません、タイプミスです ;(

677 :NAME IS NULL:2013/03/07(木) 18:31:39.11 ID:???
全行アップデートはまあパフォーマンスとかは気にならんかもだけど
トリガとかあると面倒かな。

678 :NAME IS NULL:2013/03/07(木) 18:32:28.24 ID:???
>>676
3回通信?ストアドがーとか考える前に基礎知識を充実させたほうがいい

679 :NAME IS NULL:2013/03/07(木) 20:09:55.59 ID:???
>>678
もとの質問では書いてませんが、更新件数を知りたいので、一文ごとに実行するしかないかなと思っています。
3つの文をまとめてDBに投げて、それらの更新件数もきちんと取得できるなら、そうしたいです。できるのであれば、ですが。

680 :NAME IS NULL:2013/03/07(木) 22:55:24.05 ID:???
>>679
どれくらい遅くなっちゃいそう?

681 :NAME IS NULL:2013/03/08(金) 01:58:29.69 ID:???
>>676=679
>>678>>679も書いてるけど、素直に3回SQL発行しなされ。
で、ちゃんとしたベンチマークして、1回と3回でどれだけ違うか測定してみて、
耐えられない程遅いなら考えればいい。

(1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。

682 :NAME IS NULL:2013/03/08(金) 14:42:51.75 ID:???
>>681
>>676じゃないけど
> (1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。
これどういうこと?

683 :672:2013/03/08(金) 16:58:17.66 ID:???
>>674
MySQLだとOrder側でそのように書けるのですね、
他のDBでもOrderにCase式で並べ替えれそうですね、回答ありがとうございました。

684 :NAME 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月となるのでただの大小比較では無理でした。

685 :NAME IS NULL:2013/03/18(月) 15:30:25.79 ID:dL6PwHp0
追記です、Oracle独自の関数を使わないやり方でお願いします。

686 :NAME 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
みたいなのでいけるんじゃ。

687 :NAME IS NULL:2013/03/18(月) 15:41:12.43 ID:???
このくらいなら、手抜きでこんなんでもいいかも
ORDER BY nendo, TO_NUMBER(tsuki, '99') < 4, tsuki

688 :NAME IS NULL:2013/03/18(月) 16:09:06.32 ID:???
to_charとto_numberってOracle独自な(というかSQL標準関数ではない)気もしないではない。

689 :NAME IS NULL:2013/03/18(月) 16:19:26.58 ID:???
あれ、CAST避けてTO_NUMBERにしたんだけど逆だったか?
普段はPostgreSQLなんで、::INTなんだよな、、、

690 :684: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としてもらうようお願いしてみます。

691 :NAME 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

692 :NAME IS NULL:2013/03/19(火) 06:45:23.39 ID:???
>>691
そういうのは

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

に行きなさいって

後、バルクインサートは?

693 :NAME 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

694 :NAME IS NULL:2013/03/19(火) 15:54:45.60 ID:???
読めば読むほどわからなくなる内容だな。
レコード消すならDELETE FROMじゃないのか?

695 :NAME 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`の消し方も不明でした。
知識不足でお伝えするのが難しいです・・・

696 :NAME 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);

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

心よりお礼いたします。

698 :NAME 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の結果を指定することはできないのでしょうか?

699 :NAME IS NULL:2013/03/21(木) 12:40:54.28 ID:???
>>698
ちゃんとみてないけど
on の前にテーブル別名指定してonの条件は別名でやってみ

700 :NAME 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'
 );
これで取れそうな気がするが

701 :700:2013/03/21(木) 13:08:21.34 ID:???
すまん、最初のbk.*は*の間違いだ

702 :NAME IS NULL:2013/03/21(木) 18:21:38.99 ID:???
テーブルの定義にもよるけどユーザIDに関連するフィルタ近辺で意味が変わる可能性があるよ。
一番外のサブクエリははずせると思うけども

703 :NAME IS NULL:2013/03/21(木) 20:53:59.76 ID:???
お前らかっこいい

704 :NAME IS NULL:2013/03/21(木) 22:30:24.25 ID:???
禿がいいのか。

705 :NAME 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

706 :NAME IS NULL:2013/03/22(金) 11:04:25.28 ID:???
>>705
UNIONじゃダメ?

707 :NAME 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

708 :NAME IS NULL:2013/03/22(金) 12:07:44.69 ID:???
>>705
1-2行しかない時どうしようとか。

709 :NAME IS NULL:2013/03/22(金) 13:24:03.19 ID:???
>>706-708 ありがとうございます。
>>707様のやり方でできました。

710 :NAME IS NULL:2013/03/24(日) 14:16:59.11 ID:LtAoLu+W
mysqlを使用しています
descを使うとカラムの名前などがわかるのですが
sql分の結果でカラムの名前だけを知りたい場合はどのようにすればいいか教えて頂けないでしょうか?

711 :NAME 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';

でどうだろうか

712 :NAME 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 |の項目は非表示にしたい

713 :NAME 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だけで出来るの?

714 :NAME IS NULL:2013/03/24(日) 17:10:30.90 ID:???
まだよくわからん
Fieldの部分だけを見たいのはプログラム?人間?

どっちにしても>>711の後者のSQLで表示はできるが

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

ということで>>712はmysqlのスレへ行ってください

716 :NAME 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 \
;

717 :NAME IS NULL:2013/03/27(水) 10:38:03.77 ID:???
COALESCE 使う

718 :NAME 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 \

719 :NAME IS NULL:2013/03/27(水) 10:55:57.18 ID:???
読み方はコウアレス

720 :NAME IS NULL:2013/03/27(水) 13:38:43.11 ID:???
しかし、コアレスセと心の中で発音しながらタイプする

721 :NAME IS NULL:2013/03/27(水) 13:43:35.45 ID:???
やっぱりみんな、読み方と綴りに苦労してるんだなw

722 :NAME IS NULL:2013/03/27(水) 16:20:32.36 ID:???
コアリーズだとばかり思ってたw

723 :NAME IS NULL:2013/03/28(木) 14:53:31.97 ID:???
コアレス

724 :NAME IS NULL:2013/03/28(木) 15:56:48.82 ID:???
シングルコア→マルチコア→メニーコア→ついにコアレスへ

725 :NAME IS NULL:2013/03/28(木) 19:15:34.91 ID:qyRM7UsI
発音記号
http://ejje.weblio.jp/content/coalesce

726 :NAME IS NULL:2013/03/29(金) 00:17:42.48 ID:???
音声
http://dictionary.goo.ne.jp/leaf/ej3/16873/m1u/coalesce/

727 :NAME IS NULL:2013/03/29(金) 10:13:08.70 ID:???
アクセントはレにあるのか
やべー今まで間違えてたぜ

728 :NAME IS NULL:2013/03/29(金) 13:15:53.49 ID:???
日本人相手ならカタカナ棒読みで大丈夫だ。

729 :NAME 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毎の入力最新日をセット
したいのですが、どう書けばいいんでしょうか。

730 :NAME IS NULL:2013/03/30(土) 10:44:46.72 ID:aVENNsvE
お知らせ

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

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

期間中は2人組の在日の創価学会員が、頻繁に創価批判者の自宅周辺を、
うろつき回ると思われます
日本人の方は、充分に注意してください

731 :NAME IS NULL:2013/03/30(土) 12:48:52.45 ID:???
coalesce 使うと遅くなる?

732 :NAME 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に別名付けないとダメかもしれんが

733 :NAME IS NULL:2013/03/30(土) 16:53:52.38 ID:???
>>732
729です。感謝です!セット出来ましたm(__)m

734 :NAME IS NULL:2013/03/31(日) 02:54:12.01 ID:???
>>731
遅くなるよ

735 :NAME 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を満たせなくなります(写真情報のない日記を抜き出せなくなる)
どうしたら良いんでしょうか、すみませんがよろしくお願いします

736 :735:2013/04/07(日) 13:33:53.21 ID:???
すみません、解決しました
joinの条件としてonで指定できるんですね
お邪魔しました

737 :NAME IS NULL:2013/04/07(日) 18:35:36.99 ID:???
onの条件じゃなくて、inner join かouter joinかって話だと思うが
left joinとか何も分からず使ってるのか

738 :NAME 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と結合できた場合の条件

739 :NAME IS NULL:2013/04/09(火) 20:27:39.28 ID:???
>>738
それだとis_finished=0の写真しかもたない日記が選択されないぞ
条件2の日記のテキスト情報だけを取得する、に反してる

あと俺なら結合できた場合の条件の方は括弧で囲んどく
andとorの優先順位に絶対の自信があるなら無くても良いのかもしれんが

740 :NAME 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でやるってのはどうにも解決に結びつかないと思いつつ

741 :NAME 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とかが許されて、こっちは許されないってのは納得いかないようにも。

742 :NAME IS NULL:2013/04/10(水) 10:46:57.89 ID:???
>>741
たぶん、ワカッテナイ人が無暗に使うからでしょ。
結局は、それも一つの道具じゃんね。

743 :NAME IS NULL:2013/04/10(水) 11:15:23.22 ID:???
>>742
System R 時代からの基本中の基本じゃない。

744 :NAME IS NULL:2013/04/10(水) 23:01:40.61 ID:???
>>741
それは条件1:一つの日記に対して複数のデータを持ち
に反する

>セレクト句でサブクエリ使うのはワカッテナイ人だみたいな
お前がわかってないだけで、ちゃんと使ってる人はわかってる

745 :NAME IS NULL:2013/04/10(水) 23:38:00.30 ID:???
そんじゃ>>740でいいのか
って書いたらその書き方じゃだめだっていわれるのかなぁ…

746 :NAME 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

747 :NAME 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で配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。
宜しくお願いします。

748 :NAME IS NULL:2013/04/11(木) 18:57:35.88 ID:???
やりたいことがよくわかんないけど
実際に削除せずに削除フラグ(削除日)の列を追加すればいいんじゃないの?

749 :NAME IS NULL:2013/04/11(木) 19:04:40.74 ID:5zVK9FJ/
>>748
毎日別の場所から全データデータをinsertしており、削除しているわけではありません。

750 :NAME IS NULL:2013/04/11(木) 19:17:01.34 ID:???
前日で絞り込んだものと当日で絞り込んだものを外部結合して、当日のレコードがないものがそれだとおもうよ

にしても処理の遅さってのが気になるなぁ。
PHPのコードが下手なんじゃないだろうか。もしくはレコードが10万件ぐらいあるか

751 :NAME 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

これでなんとか取得出来ました。ありがとうございます。

752 :NAME IS NULL:2013/04/12(金) 01:04:55.22 ID:???
2万行でこのSQL走らせるとか…何もわかってねーな。

753 :NAME IS NULL:2013/04/12(金) 04:07:11.05 ID:???
なんだろうこのクエリ
とても読みにくい
>>750の説明の通りに書いたつもりの結果なのかな

2万件/dayが二つあって、PHPで4億回ループするコード書いてそうな気がする

754 :NAME 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です。

755 :NAME IS NULL:2013/04/12(金) 10:34:44.20 ID:???
>>754
最低でも>>1は読んでね。

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

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

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

曜日は、ホスト言語側で計算させるほうが大概はいい気がする。

756 :NAME IS NULL:2013/04/12(金) 16:00:24.21 ID:1iWE1m3w
>>755さん

失礼いたしました。

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

・DBMS名とバージョン
Mysql 5.5.27

・テーブルデータ

ユーザーテーブル

ID | Username| email
--+----------+-----
1 | taro | taro@mail.com
2 | jiro | jiro@mail.com
3 | saburo | saburo@mail.com
4 | shiro | shiro@mail.com

・欲しい結果、説明

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

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

このような意味合いになるでしょうか。
だとしたらすっきりいたしました。
ありがとうございます。これで実装をしてみます。

757 :NAME 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,
);

758 :NAME IS NULL:2013/04/12(金) 16:42:47.88 ID:???
DB設計のところから話を始めたほうがよくね?

759 :NAME IS NULL:2013/04/12(金) 20:24:18.00 ID:WP7p6Bmy
>>752
>>753
実際に抜き出すデータは100件そこらなので、PHPの時には
2重foreachで回して、同一データが存在した場合両方を削除して最初からやり直しーといったコードを組んでおりました。

>>750さんの説明通りに書いてみたつもりなのですが、
もっと効率良く抽出出来るSQLがあるのでしたら、是非お教え願えませんでしょうか。

760 :NAME IS NULL:2013/04/12(金) 22:15:34.14 ID:???
>>759
効率よくという以前に、結合とはどういう処理なのか、考えたほうがよいかと。

761 :NAME IS NULL:2013/04/12(金) 22:17:06.04 ID:WP7p6Bmy
>>760
はい、実は結合を使ったのは今回が始めてでして・・・学びなおしてきます。

762 :NAME IS NULL:2013/04/13(土) 06:18:07.10 ID:???
>>761
1. 指定日付の集合 T1 を得る
2. 指定日付の前日の集合 T2 を得る
3. T1 のうち T2 に名前のないレコードを出力する

763 :NAME 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'
まあ、俺ならこう書く

764 :NAME 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を取得したいのです。

以上、宜しくお願いします。

765 :NAME IS NULL:2013/04/14(日) 04:38:01.01 ID:???
SELECT * FROM テーブル WHERE 'server1.test1.co.jp' like '%'||ドメイン名
で行けるんじゃないかな

766 :NAME 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という完全一致文字列がマッチ
しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。

767 :NAME IS NULL:2013/04/14(日) 15:49:58.88 ID:???
>>766
いったいお前は何を言ってるんだ

768 :NAME IS NULL:2013/04/14(日) 15:56:09.11 ID:???
え、そんな難しいことは言ってないべ?

769 :NAME IS NULL:2013/04/14(日) 16:28:56.72 ID:???
test1.co.jp も許可してやれよ。

770 :NAME IS NULL:2013/04/14(日) 17:08:10.10 ID:???
PostgreSQL なんだから POSIX正規表現 使えよ

771 :NAME IS NULL:2013/04/14(日) 17:31:34.80 ID:???
>>769
許可してるじゃん。
トリックの解釈が難しいのかな?

772 :NAME IS NULL:2013/04/14(日) 17:46:52.91 ID:???
>>771
%.test1.co.jpじゃtest1.co.jpは引っ掛からないだろ。

773 :NAME IS NULL:2013/04/14(日) 17:54:20.75 ID:???
>>772
トリックわかってないんじゃん、、、やっぱり>>766って難しいこと書いてたのかな。
俺はすぐわかったけどなあ

774 :NAME IS NULL:2013/04/14(日) 18:14:26.71 ID:???
>>773
おれなら>>766のSQLはこう書く
SELECT * FROM テーブル WHERE '.'||'server1.test1.co.jp' like '%.'||ドメイン名

まあドメインの検索条件は要件次第だしよそでやってくれ

775 :NAME IS NULL:2013/04/14(日) 19:30:36.12 ID:???
766と大差無いやん。

この例の場合はあまり関係無いけど、ドメイン名に関してはレコード数が多くなった場合は
test1.co.jpではなくjp.co.test1のようなリバースオーダーで管理した方が扱いやすいことも多い。

776 :NAME 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'に'.'を付けてやらなきゃだめだろ。

777 :NAME IS NULL:2013/04/14(日) 22:29:19.74 ID:???
index効かないからドメインの抽出はホスト言語側でやれよ。

778 :NAME IS NULL:2013/04/14(日) 22:55:10.85 ID:???
index必要なほどたくさんのdomainをホストしているようには思えないな。

779 :NAME 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が必要。

あんまり意味がある話じゃないんだけれども、結合を利用した多次元的な組み方をより早く理解できるんじゃないかと。
効率がいいものが欲しい場合、それらを利用してどんな出力を多用するかとかの話がないと無理ポ

780 :NAME IS NULL:2013/04/15(月) 13:15:05.62 ID:???
>>776
なもんでこれを書いてたんだと思うよ。
> 次にこれだとserver1.test1.co.jpはマッチしてもtest1.co.jpという完全一致文字列がマッチ
> しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。
実装時にはSQLでやるかロジックでやるか任せてみたんでないの

781 :NAME 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ごとに教えていただけるとさいわいです。

782 :NAME IS NULL:2013/04/15(月) 13:44:12.21 ID:???
>>781
「特集:基礎から理解するデータベースのしくみ」
http://itpro.nikkeibp.co.jp/article/COLUMN/20060127/228070/

をまず読みましょう。

783 :NAME IS NULL:2013/04/15(月) 14:28:41.49 ID:???
>>781
とりあえず自分の使ってるRDBMSでどういう風に処理されたか確認してごらん。
どういう順番で処理されたかを知る方法はあるから。

784 :NAME IS NULL:2013/04/15(月) 14:34:49.48 ID:???
FROM句に(SELECT 〜)置いてそれとjoinするとか

785 :NAME 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 ... を使っているので、期待するのとは違いました。

786 :NAME IS NULL:2013/04/15(月) 14:52:23.94 ID:???
>>785
その記事で全てがカバーされてはいないが、
・実行計画とは何か
・実行計画にはどのようなものがあるのか
・実行計画はどのようにして決定されるのか
・自分が使っているRDBMSで実行計画を知るにはどうすれば良いのか

を、自分で調べろっつってんだよ、タコ

787 :NAME IS NULL:2013/04/15(月) 14:53:37.55 ID:???
あと、コストベースとかルールベースとかがその記事になければ、そこまで調べろアホ

788 :NAME IS NULL:2013/04/15(月) 14:56:29.05 ID:???
まぁまぁ。上の人が言いたいのは、

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

ケースバイケースとしか言えないから、自分で実行計画を読めるだけの知識を蓄えて、
自分で試しましょうってことだと思うよ。

789 :NAME IS NULL:2013/04/15(月) 15:55:40.34 ID:???
SQL文に ( ) 付ければ、( ) の中から順に処理してくれるよ。
(落とし穴があることは気がつかないだろうけど)。

790 :NAME 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しない場合もあると思う。

791 :NAME IS NULL:2013/04/15(月) 17:34:01.95 ID:???
>>786
そんなに行数費やしてるのに答えが書いてないということは、知らないってことですね。
「知ってるけど教えてやらない」という態度を取る人は、実は知らないことが
バレてしまうのを恥ずかしがってるだけだからあまり追求してやるなと、
死んだじいちゃんが言ってました。

>>787
コストベースもルールベースも、その記事に書いてますよ。読んでないんですか?

792 :NAME IS NULL:2013/04/15(月) 18:04:49.42 ID:???
>>791
やっちゃったね…

793 :NAME IS NULL:2013/04/15(月) 18:13:11.70 ID:???
>>791
一生そう思っとけ糞が

794 :NAME IS NULL:2013/04/15(月) 18:20:21.59 ID:???
RDBMSごとに違うというよりもスキーマやクエリごとに違うというのが実際だからなぁ。
実行計画見てみなさいとしか答えようがないのでは。

795 :NAME IS NULL:2013/04/15(月) 18:27:41.26 ID:???
>>791
で、手元にあるRDBMSが出力する実行計画の内容は理解できたの?

796 :NAME IS NULL:2013/04/15(月) 18:31:59.06 ID:???
>>791
なりすますのは楽しい?

> 先に where や order by で対象行を絞りこんで
元はこのレベルなんだから釣るならもっと上手にお願い

797 :NAME IS NULL:2013/04/15(月) 19:02:07.56 ID:???
>>781
>join は、where や order by より必ず先に実行されるのでしょうか
答え:いいえ。実際の実行方法はRDBMSが判断して決定します


以上、この話題終了で

798 :NAME IS NULL:2013/04/15(月) 20:17:46.07 ID:???
春だよな。
おまけに月曜日だよな。

799 :NAME IS NULL:2013/04/15(月) 20:18:45.60 ID:???
給料もらってSQL書いてるなら、2chで質問せずに自分で調べて考えりゃいいのに。

800 :NAME IS NULL:2013/04/15(月) 21:28:00.15 ID:???
給料は、2chで回答してもらうため

801 :NAME IS NULL:2013/04/15(月) 22:21:16.42 ID:???
お勉強熱心なのは良いと思うけど、
それを知ったところで彼にどんなメリットがあるんだろうか。

802 :NAME IS NULL:2013/04/16(火) 00:33:50.26 ID:???
単純にSELECT文は宣言的であることを理解していないから出てきた質問だと思うよ。

803 :NAME IS NULL:2013/04/16(火) 00:38:33.12 ID:???
でも組むときは手続き的に考えないとパフォーマンスを考慮できないというSQLの問題

804 :NAME 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)
〜〜〜

という感じです
スレ違いでしたら誘導お願いします

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

しかしrootでサンプルをコンパイルして実行したり/usr/shareにJar突っ込んで/etc/profileに
クラスパス追加したりと、色々な意味ですごい解説ページだね。
他のページも見たけど情報古いし(そもそもFC5だし)当時基準で考えても行儀の悪い手順が多い。
他所をあたるのが吉。

806 :NAME IS NULL:2013/04/16(火) 04:09:18.93 ID:???
>>805
ありがとう そうする

807 :NAME 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を書き換えた方が速い場合もあるので、なんとも。

808 :NAME IS NULL:2013/04/16(火) 12:04:04.88 ID:???
サブクエリのorder byは(特殊な条件のぞいて)意味が無いんだが
それはともかくとして、ポスグレのオプティマイザそんなに貧弱なのか?

809 :NAME IS NULL:2013/04/16(火) 12:48:53.98 ID:???
だからさ、まず実行計画の見方を勉強しようよ。
そしてRDBMSによっては、スロークエリーの検出機能があるから、その閾値を100msとかに設定して、
時間がかかるクエリの実行計画を見て、改善点があるかさがすとかしようよ。

810 :NAME IS NULL:2013/04/16(火) 14:32:45.26 ID:???
807と781は論理的に等価なSELECT文じゃないからね。
781はnameでソートされた結果が保証されるけど807に関してはそうではない。
(仮に807がソートされた結果を返してもそれは「たまたま」)

order by無しで比較するとどうなる?

811 :NAME IS NULL:2013/04/16(火) 15:05:39.15 ID:???
>>807
> PostgreSQLの場合はjoinのほうを先にやってしまうということなんでしょう
まだ推測ですすめるクセが残ってるね

812 :NAME IS NULL:2013/04/16(火) 15:07:37.11 ID:???
1割ってのもあいまいな話だし、脱初心者をしたと思っている初心者の状態なのかなぁ

813 :NAME IS NULL:2013/04/16(火) 18:24:01.55 ID:???
だから落とし穴があると書いといたのに。。。
新人君は駄目だな。

814 :NAME IS NULL:2013/04/16(火) 18:45:50.67 ID:???
Postgresのドキュメントみるかぎりカッコつけてネストしたクエリもまず一端展開する
みたいだけど。一般論としてはカッコ付けて実行計画を強制出来るかはSQLの仕様上は
無し、実際の動作は実装依存であまり考慮の対象になる方法ではないと思うなぁ。

815 :NAME IS NULL:2013/04/17(水) 10:05:39.36 ID:???
実行計画の見方がわからなかったので
推測に頼ることにした。
に一票

816 :NAME IS NULL:2013/04/17(水) 22:27:30.56 ID:???
(分散トランザクションとかリモート問い合わせはスレチ…??)

817 :NAME IS NULL:2013/04/17(水) 23:45:01.52 ID:???
基本的にSQL関係ないのはスレチ
というか、RDBMSの実装に強く依存するのはそれぞれのスレで聞けよ

818 :NAME IS NULL:2013/04/29(月) 02:30:05.84 ID:???
日本人の払った貴重な血税から
ゴキブリ在日朝鮮人に生活保護が支払われている

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

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

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

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

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

日本社会の寄生虫 ゴキブリ在日朝鮮人
日本から出て行け! ゴキブリ在日朝鮮人

819 :NAME 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

820 :NAME 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

821 :NAME IS NULL:2013/05/08(水) 23:10:56.33 ID:???
>>819
>>5または>>7

822 :NAME IS NULL:2013/05/08(水) 23:25:30.47 ID:???
>>821
素早い回答ありがとうございます。
環境が会社にしかないので明日試してみます。
だめそうなら別の手を考えてみます。

823 :NAME IS NULL:2013/05/09(木) 00:02:30.05 ID:???
たとえば
1/3 "" "" ""
のような結果はそのままじゃ作れないよ、と。
こういう結果もほしい場合は >>8 も組み合わせてね

824 :NAME IS NULL:2013/05/09(木) 01:12:45.04 ID:???
標準SQLにはないけどアクセスにはクロス集計クエリーていう技があるから
それ使えばいいだけじゃ

825 :NAME IS NULL:2013/05/09(木) 01:16:07.10 ID:???
最終的にエクセルで処理するんならエクセル側でピボットテーブル使うという手もある

826 :NAME IS NULL:2013/05/09(木) 18:22:40.24 ID:3HjWO8Ji
助けてください><

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

「先生。SQLのavg関数はなぜwhere句で使用することができないのですか?」

827 :826:2013/05/09(木) 18:25:16.79 ID:3HjWO8Ji
質問者です。
あれ?理由って以下でおk?
WHERE句の条件は同一行に対して適用されるからです。

828 :NAME 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では使えるという理屈です。

829 :826:2013/05/09(木) 20:44:45.42 ID:???
>>828
ふむ。。。
他の子はプログラムのメソッド理解してるけどその子はって何?ってレベルの子なので
教えてくれた内容を理解するのは難しいかも(´・ω・`)

教えてくれてありがとうございました

830 :NAME IS NULL:2013/05/09(木) 21:00:41.63 ID:???
ふむ。

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

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

(厳密にはこの順番で評価した結果と「等価な結果」を返すとか暗黙のグループ
とか色々ツッコミどころはありますがその辺はとりあえず無視で)

831 :NAME 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"というものがかえってきてきてしまいます

832 :NAME IS NULL:2013/05/09(木) 23:26:32.98 ID:iWf63QvN
申し訳ありません途中で送信してしまいました

1,"田中","2013-04-01"を返してもらう為のsql文を教えて頂けないでしょうか
よろしくお願い致します

833 :NAME IS NULL:2013/05/09(木) 23:43:22.68 ID:???
04/04 からどうやって 04/01 を導くんだよ? 月初、でいいんか?

834 :NAME IS NULL:2013/05/09(木) 23:46:43.73 ID:hRjieOLa
MIN( b.date )
これで13年4月を出すのはムリ

835 :NAME 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"
が結果として表示されてしまいます

836 :NAME IS NULL:2013/05/10(金) 00:03:14.62 ID:???
同じ日付があったら無理だけど、まず、テーブルBから最小の日付をもつレコードのuuidを求めて、
そのuuidでテーブルAと結合。

837 :NAME 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を求める方法がわからないのですが
教えて頂けないでしょうか

838 :NAME 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

839 :NAME 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 )
で同じようなこともできました とても勉強になりました

840 :NAME 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の勉強には向かないと思うぞ

841 :NAME IS NULL:2013/05/10(金) 01:27:47.76 ID:???
ISO標準に完全に沿って作られてるRDBMSなんてないでしょ

842 :NAME IS NULL:2013/05/10(金) 01:31:16.94 ID:???
完全にISO標準である必要なんてないけど
どう考えても結果が不定で実行できないSQLをエラーなしで通すのはなぁ

>>839みたいな、とんでもSQLで出来た気になってしまうのは問題だろ

843 :NAME IS NULL:2013/05/10(金) 01:35:27.33 ID:H99FPAxg
>>840
ありがとうございます
>>840でもで問題なくできました!

>>839
これだめですね
MIN( b.date )がついてたから正しく動いてるように思えただけでした

844 :NAME IS NULL:2013/05/10(金) 01:39:59.75 ID:???
別にとんでもSQLだとは思わないけど
aテーブルの内容を副問い合わせで表示して
その副問い合わせとは全く無関係なところでb.dateを出しちゃってるから
あんまり良いSQL文だとは言えないかもな

845 :NAME 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だけ単独で解除してデータを更新後サマリー表のチェック解除ということもできるのでしょうか?

846 :NAME IS NULL:2013/05/15(水) 12:49:30.90 ID:???
IBM DB2 総合スレ2
http://toro.2ch.net/test/read.cgi/db/1166153254/

こっちいったほうがいいかも

847 :NAME IS NULL:2013/05/15(水) 13:01:09.37 ID:???
>>846
ありがとうございます、そちらに書いてみます。

848 :NAME 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文を教えていただけないでしょうか
よろしくお願いいたします

849 :NAME IS NULL:2013/05/15(水) 20:50:21.63 ID:???
誤:min(price)
正:max(price)
でした

850 :NAME IS NULL:2013/05/15(水) 21:16:03.19 ID:???
エラーメッセージの通りだろ。別名使え。

851 :NAME IS NULL:2013/05/15(水) 21:25:40.58 ID:???
UNION以前に二つ目のクエリはGROUP BY無しでidとmax()がSELECTリストに並んでいる
のでエラーになるね。

SELECTリストからidを外すか、一つ目のクエリと同様に最大値だけ求めてから絞り込みを
する必要がある。

852 :NAME IS NULL:2013/05/15(水) 21:42:00.20 ID:???
>>850のとおり。
あと、union all の方がいいとおもうよ。

>>851
mysqlだとgroup byなしでできてしまうかもしれない。気持ち悪い。

853 :NAME IS NULL:2013/05/16(木) 02:14:12.46 ID:???
>>850
>>851
>>852
ありがとうございます
別名を使い思っていたことができました!

854 :845:2013/05/17(金) 09:01:16.91 ID:???
>>845
uncheckedすることで解除できました
算術オーバーフローはロードしたテーブルAのデータを修正してからrefreshをかけることで解決
あと、チェックペンディングになっていたのはサマリー表ではなく間にあるステージング表でした
お騒がせしました

855 :NAME IS NULL:2013/05/17(金) 19:07:27.79 ID:Fw65R92N
HTAアプリで、JavaScriptを使ってMySQLにアクセスしてみました
JSには当然ですがSQLエスケープ用の関数が用意されていないので、自前でしないといけないですが
単に文字列置換でシングルクオートをエスケープするだけでいいのでしょうか?

856 :NAME IS NULL:2013/05/17(金) 19:26:56.49 ID:boKr6IGa
htaアプリっていうの知らないんだけどjavascriptでアクセスって時点でセキュリティも何もないんじゃないの?

857 :NAME IS NULL:2013/05/17(金) 19:54:19.31 ID:???
スレ違い。

858 :NAME IS NULL:2013/05/17(金) 20:07:33.69 ID:???
自分しか使わないローカルなアプリなので、セキュリティのためというよりは、誤動作防止のためですね

859 :NAME IS NULL:2013/05/17(金) 21:01:40.09 ID:???
どっちにしろSQLの質問じゃねえ

860 :NAME 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%');
な感じなのですがこういうときの定番なやり方ありますか?

861 :NAME IS NULL:2013/05/19(日) 13:47:02.42 ID:???
>>860
実行計画みたか?

862 :NAME IS NULL:2013/05/20(月) 00:23:39.38 ID:QJOCjzcl
ワイルドカードに該当する部分をクエリで参照したい場合、どういう方法がありますか?

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

のようなことをやりたいのです

863 :NAME IS NULL:2013/05/20(月) 00:24:39.06 ID:???
ワイルドカードが三箇所になってしまいました
hogeとhogeの間の一文字、ということです

864 :NAME IS NULL:2013/05/20(月) 09:01:16.41 ID:???
正規表現とかマッチした部分抜き出す機能があるdbmsならできるけど。
じゃなきゃ普通はアプリ側じゃないかな

865 :NAME IS NULL:2013/05/20(月) 09:11:42.59 ID:???
>>862
update table set col0 = col1 where col1 like 'hoge_hoge';

866 :NAME IS NULL:2013/05/20(月) 09:53:51.86 ID:???
hogeの部分を空文字列に置換すればいいな。

867 :NAME IS NULL:2013/05/20(月) 11:04:23.26 ID:???
hoge%と%hogeでANDで検索してsubstringとかでhoge消すのか

868 :NAME IS NULL:2013/05/20(月) 11:25:37.04 ID:???
>>862
これでどうかな
update table set col0 = replace(col1, 'hoge', '') where col1 like 'hoge_hoge';

869 :NAME IS NULL:2013/05/20(月) 11:39:59.58 ID:???
真ん中にhogeあったらそれも消えちゃうような

870 :NAME IS NULL:2013/05/20(月) 11:57:56.82 ID:???
汎用的なのは、SQLだけじゃ無理だろうな。

871 :NAME IS NULL:2013/05/20(月) 17:50:31.02 ID:???
>>869
_にhogeが入るって事?あったら驚きだね

872 :NAME IS NULL:2013/05/20(月) 22:02:14.82 ID:???
カラム/テーブルに日本語使っている人いますか?

873 :NAME IS NULL:2013/05/20(月) 22:30:00.97 ID:3Fvcp97C
使う理由がない

874 :NAME IS NULL:2013/05/20(月) 22:31:29.30 ID:???
続きの質問が気になってしょうがないけど、それはきっと杞憂で、これが本来の質問なんだろうな。
いるよ。

875 :NAME IS NULL:2013/05/20(月) 22:38:44.86 ID:???
特定の環境でしか作業しない人なら、
日本語のカラム名、テーブル名使う人いそうな気がする。

876 :NAME IS NULL:2013/05/20(月) 22:44:45.81 ID:3Fvcp97C
いやいや、SQLの質問スレなんだから「いればその方に聞きたいのですが・・・」と続くはず
>>872が気付くのを待ったほうがいい

877 :NAME IS NULL:2013/05/20(月) 23:21:17.38 ID:???
無理に英語使うより、税区分とかのほうがわかりやすいというのはある。

878 :872:2013/05/20(月) 23:32:40.01 ID:???
うちの会社で作っているソフトって、全部カラム・テーブルが日本語なんですね
そして、他の会社も同じく日本語を使っていたわけです。

なので、これは一般的なのかな?と疑問に思って質問しました
在庫管理のシステムなのですが、みなさんは英語でやってますか

879 :NAME IS NULL:2013/05/20(月) 23:40:29.66 ID:???
うちも在庫管理も含めて色んな業務アプリ作ってるけど、
日本語のテーブル名やカラム名なんてありえないよ。
ローマ字ですら少ない。
基本は英単語や短縮形。
Inventoryとか、Qtyとか、DueDateとか。

880 :NAME IS NULL:2013/05/21(火) 00:25:15.07 ID:???
人生いろいろ、sqlもいろいろ

881 :NAME IS NULL:2013/05/21(火) 03:13:04.17 ID:???
どこがSQLの質問なの?

882 :NAME IS NULL:2013/05/21(火) 04:17:28.23 ID:pYPcPelP!
今いる会社はそもそも日本の会社じゃないので当然全部英語だけれども、それ以外にも
専ら規約ベースのORMを使うのでテーブル名やカラム名をアプリのコード内で使われて
いるドメインクラス名やそのプロパティ名と可能な限り一致させているという事情もある。
クラス名やプロパティ名が英語なのでテーブルやカラムの名前も自動的に英語になる。

日本語での開発であっても例えばJavaだとHibernateなどJPA系のORMを使うのであれば
英語のテーブル名カラム名を使った方が断然楽だと思う。
さもなければ名前マッピングを全部書き下すか、開発者にクラス名等々に日本語を使えと
お願いすることになりそう(日本語のクラス名等でORMがきちんと動くかも謎)。

883 :NAME IS NULL:2013/05/21(火) 07:36:41.18 ID:???
スレ違いネタはいらないから。

884 :NAME IS NULL:2013/05/21(火) 15:27:26.22 ID:???
つか、専用のスレ立ってるじゃん。
そっち書けばいいじゃん。
じゃんじゃん。

885 :NAME 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のみを取り出したいのですがどうすればいいでしょうか

886 :NAME 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

887 :NAME IS NULL:2013/05/21(火) 19:28:20.59 ID:???
>>885-886
JOINすればいいよ。

888 :NAME IS NULL:2013/05/21(火) 19:58:43.08 ID:???
>>6してからJOINだな

889 :NAME IS NULL:2013/05/21(火) 20:12:30.14 ID:???
まぁJOINって何? なんだろうけど。
運が良ければ誰かがSQL書いてくれるかもしれないしな。

890 :NAME IS NULL:2013/05/21(火) 20:27:50.23 ID:4o/NXjFR
SQL書くのは楽なんだけどテスト用のデータベース作るのが面倒くさい

891 :NAME 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)

892 :NAME IS NULL:2013/05/21(火) 21:29:34.50 ID:4o/NXjFR
IDがユニークじゃない…

893 :872:2013/05/22(水) 00:01:12.70 ID:???
英語だとこんな感じになりますか?

商品コード → ProduceCode
納入先住所1/2/3 → CustormZip1/2/3
在庫数(総バラ) → Piece
在庫数(ケース数) →Unit
----------------------------------------------
テーブル名
出庫依頼 → info_order_list

894 :NAME IS NULL:2013/05/22(水) 00:22:39.30 ID:???
>>893
スレ違い。

895 :NAME 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.コード (+)

896 :NAME IS NULL:2013/05/22(水) 00:52:27.47 ID:???
>>895
>>1

897 :NAME IS NULL:2013/05/22(水) 01:49:55.42 ID:???
>>893
あまりにも違いすぎる。わざと間違えてるとしか考えられん。
商品はItem
納入先≠顧客=Customer≠Custorm
住所≠郵便番号=ZipCode
出庫依頼=ShippingOrder
PieceとUnitの使い方も変よ。

898 :NAME IS NULL:2013/05/22(水) 12:28:00.00 ID:???
で、いつまでスレ違い続けるの?

899 :NAME IS NULL:2013/05/22(水) 13:29:28.02 ID:SXOouUvj
お前がぶり返さなきゃ終わってたよ

900 :NAME 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回結合するしかないのでしょうか?

901 :NAME IS NULL:2013/05/22(水) 18:33:00.93 ID:???
>>899
くだらねー質問してんじゃねーよ

902 :NAME IS NULL:2013/05/22(水) 18:34:03.54 ID:SXOouUvj
やっちゃったな・・・ID

903 :NAME IS NULL:2013/05/22(水) 18:45:02.30 ID:???
基本的にはそうだろうけど、オプティマイザがうまいことやってくれそうな気がするな。

904 :NAME IS NULL:2013/05/22(水) 20:26:29.11 ID:???
>>6で逆にAもBもCも持っていない、ID:02と03を取り出すにはどうしたらいいんですか?

905 :NAME 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を取り出すにはどうしたらいいんですか?

906 :NAME IS NULL:2013/05/22(水) 20:33:53.42 ID:???
Havingで3にならないやつ。

907 :NAME 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個を持っている値を得られるならそれを得たいんです
よろしくお願いします

908 :NAME IS NULL:2013/05/22(水) 20:46:52.51 ID:???
not in でいいだろ。

909 :NAME IS NULL:2013/05/22(水) 21:34:31.02 ID:???
>>907
A,B,Cのどれかひとつでも持っているIDの一覧を取得し、
その一覧にないIDを選択

910 :NAME IS NULL:2013/05/22(水) 22:05:30.10 ID:???
NOT INでは無理です

>>909
直接得るの難しいですか
ありがとうございます

911 :NAME 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'));

912 :NAME IS NULL:2013/05/23(木) 16:03:38.70 ID:???
>>911
ありがとうございます

913 :NAME IS NULL:2013/05/23(木) 23:13:06.09 ID:???
SQL Serverでストアド書くときどのように書いてますか?
OracleだとPACKAGEがあるのでVBっぽく書けますが、SQL Serverはちょっとイメージがつかないです。

914 :NAME IS NULL:2013/05/24(金) 05:44:07.05 ID:???
ゆとりw

915 :NAME IS NULL:2013/05/24(金) 07:56:45.91 ID:???
春だからな。

916 :NAME IS NULL:2013/05/25(土) 01:29:45.90 ID:???
>>914
とりあえず、罵るならば教えて下さい

917 :NAME IS NULL:2013/05/25(土) 06:23:04.93 ID:???
馬鹿には無理

918 :NAME IS NULL:2013/05/25(土) 07:55:22.71 ID:???
馬鹿には無理さんてここにもいたのか

919 :NAME IS NULL:2013/05/25(土) 09:15:52.67 ID:???
スレ違い。

920 :NAME 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と省略するのやめるとかしてくれ

921 :NAME IS NULL:2013/05/26(日) 11:51:41.78 ID:???
過疎ってるからなんでしょ。

922 :NAME IS NULL:2013/05/26(日) 14:38:03.09 ID:???
SQL Serverスレでスルーされてただけだろ
このスレでストアドが対象外だと思うならスルーしとけば

923 :NAME IS NULL:2013/05/26(日) 14:39:52.48 ID:???
スルーされるだけだから親切心で言ってるんだろ

924 :NAME IS NULL:2013/05/26(日) 14:46:44.55 ID:???
ストアドは対象外。

925 :NAME 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が書けますか?

926 :NAME IS NULL:2013/05/27(月) 03:02:21.54 ID:qPx1TzON
> addressの中の最小値

訂正
同じaddressの中のscoreの最小値

927 :NAME IS NULL:2013/05/27(月) 06:30:16.13 ID:???
group by

928 :NAME 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が複数ある場合に期待したように動かない。

929 :NAME IS NULL:2013/05/27(月) 10:48:34.05 ID:???
なんだかクレージーな印象

930 :NAME IS NULL:2013/05/27(月) 11:43:00.42 ID:???
>>929
「最小値でソートして」という所が問題なんだろ。

931 :NAME IS NULL:2013/05/27(月) 17:47:12.66 ID:???
order by address desc,score desc
でダメなん?

932 :NAME IS NULL:2013/05/27(月) 19:26:45.44 ID:???
>>931
180  ひょうご ← 120だったら、きょうとの前にこないといけない

933 :NAME IS NULL:2013/05/28(火) 00:32:05.46 ID:???
>>932
?

934 :NAME 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  きょうと

935 :NAME IS NULL:2013/05/28(火) 01:08:13.15 ID:???
>>933
アスペ?社会で苦労してない?

936 :NAME IS NULL:2013/05/28(火) 03:29:59.07 ID:???
>>935
この程度のことも分からずにプログラマやっていけてる?
体裁は良くないが、聞きたいことと内容は明確だろ。

937 :NAME IS NULL:2013/05/28(火) 03:30:47.95 ID:pJTxBQZ+
>>936
何を言ってるんだお前は

938 :NAME IS NULL:2013/05/28(火) 10:43:35.48 ID:???
アンカー間違ってるのか読む場所間違ってるのか区別付かんなw

939 :NAME IS NULL:2013/05/28(火) 13:25:42.53 ID:???
こういうの、ウィンドウ関数できれいに書けたりするのかな?
あれが独自拡張なのか標準SQLにあるものなのかわかんないけど

>>936が安価ミスなのか、安価の先を見誤ったか、はたまた別かわからなくてもやっとする
プログラマならバグ直してください

940 :NAME 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

941 :NAME IS NULL:2013/05/28(火) 14:43:05.32 ID:???
>>940
SQL2003からなのね。ありがとです。
すごいすっきりしてるし直感的だ、やっぱ使えるようにしとかないと。重ね重ねどもでした

942 :NAME 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です。

943 :NAME IS NULL:2013/05/29(水) 05:43:04.35 ID:???
http://www.postgresql.jp/document/9.2/html/queries-with.html

944 :NAME 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'の名前になっている。

945 :NAME IS NULL:2013/05/30(木) 19:19:25.31 ID:???
>>944
マニュアル読め。
すぐわかるよ。

946 :NAME IS NULL:2013/05/30(木) 19:20:33.87 ID:???
create table TableA (COLNAME number constraint PK_CONST primary key);

947 :NAME IS NULL:2013/05/30(木) 20:37:33.32 ID:???
制約名とインデックス名を違う名前にしたいという話なら
unique indexを先に作れば
 primary key using index インデックス名
でできるにはできるけど

948 :NAME 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
の順番で意図したことが実現出来ました。

949 :NAME 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))
);

950 :NAME IS NULL:2013/06/07(金) 17:32:29.57 ID:yGnvQyXR
可能な限り、DB依存になるような構文を書きたくないんだけど
DB依存構文検出チェッカーみたいなのって、世の中にある?

951 :NAME 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

952 :NAME 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を書けばよいのか検討がつきません。

何かヒントをいただければ幸いです。よろしくお願いします。

953 :NAME IS NULL:2013/06/09(日) 13:44:44.36 ID:???
SQLじゃなくてストアドでやる話。

954 :NAME IS NULL:2013/06/09(日) 13:53:35.12 ID:???
そんなたいそうなもんじゃなかろう。
やり方は色々思いつくけど、SQL文を2つ発行するのが初心者向けかな。

955 :NAME IS NULL:2013/06/09(日) 14:08:34.74 ID:???
SQL二つ発行するのは、本来なら分離レベルとかロック制御とか考慮しないといかん
最近のDBMSなら1文で出来るやつもあるから、MySQLで使えるかどうか調べてみたら
upsertとか、mergeとか言われてるやつな

956 :NAME IS NULL:2013/06/09(日) 14:12:44.99 ID:???
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

MySQL 5.0 以降かな

957 :NAME 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。
ちょっとスマートじゃないね。

958 :952:2013/06/09(日) 17:45:07.54 ID:???
御回答いただいた皆様大変ありがとうございました。
>>957さんの方法で実装できました。
scoreが更新されていなくてもUPDATEするのが無駄に思えますが、
とりあえずこれで運用してみます。
ストアドプロシージャについても調べてみます。
ありがとうございました。

959 :NAME 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):キー。ユニーク

どんなクエリを書いたらいいんでしょうか
すみません、よろしくお願いします

960 :NAME IS NULL:2013/06/13(木) 06:28:46.99 ID:???
1回の出品に対する評価は何回?
複数のの出品者が「同じ商品」を複数個出品することがある?
「判明しているキー」に「プライマリーキー」が含まれていないが?

「サンプルデータ」と「欲しい結果」を出してくれ

961 :NAME IS NULL:2013/06/13(木) 07:49:21.31 ID:???
これだけなら、出品者IDでgroup byしてavgとcountでよくないか?

962 :NAME IS NULL:2013/06/13(木) 12:35:34.28 ID:???
where userId = (select userId from t_prof where key = 判明しているキー)

963 :NAME 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;
こんなんでどお?

964 :NAME IS NULL:2013/06/13(木) 16:31:55.01 ID:???
動かしてないけど、p.namaeがgroup byにないってエラーがでそう。
mysqlだったらどれかひとつが勝手に選ばれるという話だったかも

965 :NAME 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

とかで良いんじゃね

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

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

宣言済のtestに0か数字を入れたいのです

967 :NAME IS NULL:2013/06/14(金) 07:01:35.51 ID:???
sumなりで返せばいいだろ。

968 :NAME IS NULL:2013/06/14(金) 14:56:51.65 ID:???
>>966
SQLの話から外れるけど、ホスト言語側で大概、結果のレコード数を返す
関数が用意されているから、それで見るのが比較的常套だと思うけど。
それをサブクエリーにして、レコード数を集めたりしているのであれば
count()を使えばいいんじゃないかね。

969 :NAME IS NULL:2013/06/14(金) 15:13:06.98 ID:???
>>966
ISNULL関数使え
つか特定DBの話はそこで聞け
>>967
SUMは対象が全てNULLならNULL返す
>>968
あれレコード数見てるんじゃないぞ

970 :959:2013/06/14(金) 23:24:15.62 ID:???
>>960-965
ありがとうございます
COUNTやAVGの使い方を復讐しつつそれぞれ参考にさせていただきます

971 :NAME IS NULL:2013/06/15(土) 00:36:10.01 ID:???
復讐は何も生まないよ

972 :NAME IS NULL:2013/06/15(土) 00:40:31.73 ID:???
Revengeコマンド、作る?

973 :NAME IS NULL:2013/06/15(土) 01:16:17.07 ID:???
Living Well Is The Best Revenge

974 :NAME IS NULL:2013/06/15(土) 16:04:10.91 ID:FktO2NAp
どなたかお願いいたします。
私初心者で「ゼロから始めるデータベースSQL」という本で勉強をしています。付属のソフトをインストールしてパスワードを入れて書いてある通りにやってるんですが最初のテーブルを作るところでエラーが出てしまい困ってます。

Create table shohin;

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

これはなぜでしょうか。

よろしくお願いします。

975 :NAME IS NULL:2013/06/15(土) 16:15:53.30 ID:FktO2NAp
すみません。

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

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

と出たのですが、これはテーブルを作成できたんでしょうか

976 :NAME IS NULL:2013/06/15(土) 16:19:55.22 ID:FktO2NAp
ごめんなさい。

できてるみたいです

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

初心者すぎました

すみません!

977 :NAME IS NULL:2013/06/15(土) 18:44:48.32 ID:???
書いてる通りにやってないだろ。

978 :NAME IS NULL:2013/06/15(土) 20:07:55.82 ID:???
初心者に素直さを期待してはいけない

979 :NAME IS NULL:2013/06/16(日) 15:16:09.35 ID:???
本当の初心者は、めんどくさそうな手順は後からやろうと飛ばすものだ。

980 :NAME IS NULL:2013/06/16(日) 15:20:19.75 ID:???
問題は飛ばしたことをすっかり忘れることだなw

981 :NAME IS NULL:2013/06/16(日) 15:21:55.25 ID:uKsaBYgK
中身何も入れてないってどういうこっちゃ?
データベース作ってないのにテーブル作ろうとしたのかこいつ

982 :NAME IS NULL:2013/06/16(日) 17:11:49.11 ID:???
> Create table shohin;
って書いてるだろうw

983 :NAME IS NULL:2013/06/16(日) 19:27:33.70 ID:???
>>981
カラム定義
列は後回しにして、とりあえずテーブルを作ってみようって思ったのかも。

984 :NAME IS NULL:2013/06/16(日) 20:58:02.03 ID:???
斬新な発想だな。
プロには想像もつかない。

295 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)