SQL質疑応答スレ 10問目
at DB
1:NAME IS NULL
10/05/25 21:49:31
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 9問目
スレリンク(db板)
2:NAME IS NULL
10/05/25 21:50:33
SQL言語リファレンス一覧
Oracle Database
URLリンク(download.oracle.com)
Microsoft SQL Server
URLリンク(msdn.microsoft.com)
IBM DB2 Database
URLリンク(publib.boulder.ibm.com)
PostgreSQL
URLリンク(www.postgresql.jp)
MySQL
URLリンク(dev.mysql.com)
参考リンク
URLリンク(sql.main.jp)
URLリンク(www.atmarkit.co.jp)
URLリンク(oraclesqlpuzzle.hp.infoseek.co.jp)
URLリンク(www.techscore.com)
3:NAME IS NULL
10/05/25 21:51:14
過去スレ
SQL質疑応答スレ 8問目
スレリンク(db板)
SQL質疑応答スレ 7問目
スレリンク(db板)
SQL質疑応答スレ 6問目
スレリンク(db板)
SQL質疑応答スレ 5問目
スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 4問目
スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 3問目
スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 2問目
スレリンク(db板)
【帰ってきた】SQL質疑応答スレ
スレリンク(db板)
SQL質疑応答スレ Part 2
スレリンク(db板)
SQL質疑応答スレ
スレリンク(db板)
4:NAME IS NULL
10/05/25 21:51:55
よくある質問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
10/05/25 21:52:36
よくある質問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
10/05/25 21:53:17
よくある質問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
10/05/25 21:54:00
よくある質問4
(問)
列の数が可変な問合せはどう書きますか?
(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。
SQL Serverのpivot(2005以降)
URLリンク(msdn.microsoft.com)
URLリンク(www.sqlprof.com)
Oracleのpivot(11g以降)
URLリンク(download.oracle.com)
URLリンク(www.oracle.com)
8:NAME IS NULL
10/05/26 05:20:59 bivGLNrt
さぐぇ
9:NAME IS NULL
10/05/26 21:13:53
>>1
乙
10:NAME IS NULL
10/05/26 21:38:51
質問です。
・DBMS名とバージョン
MySQL5.1.42
・テーブルデータ(アクセスログのようなもの)
ID CREATED
--+---------------------
1 2010/5/10 12:00:00
2 2010/5/10 15:00:00
3 2010/5/11 13:15:00
4 2010/5/14 10:00:00
5 2010/5/15 16:30:00
・欲しい結果
対象テーブルの日毎のレコード数
ただしグラフ化したいのでゼロの日はゼロと出力したい
・説明
SELECT date_format(created,'%Y/%m/%d') d, count(*) from test_table group by d;
とすると、日毎のレコード数が出力できるのは確認済です。
スキマ(5/12&5/13分)をゼロで出力する簡単な方法はないでしょうか。
11:NAME IS NULL
10/05/26 21:47:00
>>10
カレンダーテーブルを別途用意してOUTER JOIN
てかこれもFAQにしたほうがよかったかも?
12:10
10/05/26 22:01:56
>>11
薄々そんな気はしてたんですが、これが一番ですよね。
ありがとうございました。
13:NAME IS NULL
10/05/26 22:57:21
まあテーブルでもいいけどそこだけなら当月の日付一覧を検索するサブクエリでいいしょ。
14:10
10/05/27 22:22:26 PcEBL+w/
>>13
うわ、それ気になります!!
例えば今月の日付一覧を出力するSQLってどう書くんでしょう。
お願いします。
15:NAME IS NULL
10/05/27 22:59:16
アンケート生成システムを作っているのですが、
アンケート項目数が可変なのでアンケートテーブルを別途作り
さらに回答項目数(チェックボックスとか)も可変なので回答項目テーブルも作りました。
アンケートテーブル→アンケート項目テーブル→回答項目テーブル
という感じで紐づいてます。
ユーザさんが(会員制ではないためユーザテーブルはありません)回答したログはどこに置こうかと悩んで
結局回答ログテーブルを回答項目テーブルと紐付けて
1.ユーザID(回答時に暫定的に割り振る) 2.回答項目ID 3.テキストエリアの場合の回答用カラム
として作成しました。
精一杯考えて結局上記のようになったのですが
これだと例えばあるアンケートの回答一覧をユーザごとに出したい場合
アンケートIDから全ての項目IDを割り出してその項目ID全てに紐づいた回答項目IDを出し
その回答項目IDから回答テーブルを検索しなくてはならず煩雑です。
他の方法としてはアンケートテーブルに質問1 質問2 質問3...と数十個カラムを足すしか思いつかないのですが
何かいい方法がないでしょうか。
16:NAME IS NULL
10/05/27 23:08:55
回答項目テーブル、回答テーブルにアンケートID項目をつくる。
17:NAME IS NULL
10/05/27 23:14:14
ご回答ありがとうございます。そうします。こんな長い質問読んでくださりありがとうございます。
しかも以下間違ってました。読みづらくてごめんなさい。
×アンケート項目数が可変なのでアンケートテーブルを別途作り
○アンケート項目数が可変なのでアンケート項目テーブルを別途作り
18:NAME IS NULL
10/05/28 00:01:52
>>15
もしかしてjoinを知らない?
19:NAME IS NULL
10/05/28 00:09:32
>>18
知ってます。in句が重なるとパフォーマンスも落ちるし
もうちょっと簡潔に出来る方法ないかな…と思ってお聞きしました。
20:NAME IS NULL
10/05/28 16:48:05
>>19
もしかしてjoinを理解してない?
inなんて使う所が思い浮かばないんだが
つか、自分で考えたテーブルレイアウトとSQL書いてみ
21:NAME IS NULL
10/05/28 21:16:30
INNER JOINで質問。
2つのテーブルに同じ名前のフィールドがある時、結合するとどうなるか、どこかに解説はないでしょうか。
PHPからMySQLでやってみて、そのフィールド名のデータを取ったら片方のデータは取り出せた。もう片方は取り出せない。
phpMyAdminで試してみたら結果には両方のフィールドが入っています。
好きな方のデータを取り出すにはどうやったら良いのでしょうか。テーブル名.フィールド名だとエラーでした。
22:NAME IS NULL
10/05/28 22:03:51
まさか列名はテーブル名で修飾できるって知らないのか?
23:NAME IS NULL
10/05/28 22:50:47
それが何故か上手くいかないんで。
テーブル名付きで指定すると、そんな名前ありませんみたいなエラーが出ちゃう。
24:NAME IS NULL
10/05/28 23:19:29 0+Zm+ajr
ぐだぐだ書いてないでそのSQL晒した方が早いんでね?
25:NAME IS NULL
10/05/29 00:59:17
うまくいくのでSQL待ちだな
26:NAME IS NULL
10/05/29 03:56:39
テーブル名に別名つけてるのにその別名で修飾してないと予想
27:NAME IS NULL
10/05/29 06:32:44
MySQL5.0.77
テーブルAの中の特定のidを持つレコードのうち特定の範囲だけをUPDATEしたい場合、例えば
UPDATE A SET flag=1 WHERE id=1 ORDER BY date DESC LIMIT 10,10
とやるとMDB2 Error: syntax errorになります。
UPDATE A SET flag=1 WHERE id=1 ORDER BY date DESC LIMIT 10
なら大丈夫なんですが、オフセットを指定するにはどうすればいいでしょうか。
28:NAME IS NULL
10/05/29 07:05:12
id以外にキーはないのか?
29:NAME IS NULL
10/06/02 06:50:35 CZR/Bmnf
まったくわからないのです教えてください・・
1、名前はわかっているが、コードが不明な商品の受注明細を照会するSELECT文を記述せよ。
副照会:商品名からコードを求めるSELECT文
主照会:商品コードから商品の受注明細を照会するSELECT文
2、平均受注個数を超える商品に仕入れ先を照会するSELECT文を記述せよ。
副照会:商品の平均受注個数を求めるSELECT文
主照会:商品コード別に受注個数合計を求め、受注個数合計 > 平均受注個数であれば、仕入れ先を表示
3、1月と2月に\50,000以上の注文があった顧客からの3月受注額を照会するSELECT文を記述せよ。
副照会:4月と5月に受注額合計が共に50000以上であるという条件をみたす顧客を照会
主照会:顧客別に6月の受注額合計を求めるSELECT文。
よろしくお願いいたします・
30:NAME IS NULL
10/06/02 07:12:31
宿題は自力でやれ
31:NAME IS NULL
10/06/02 09:18:29
答えられる人がいないスレw
32:NAME IS NULL
10/06/02 09:36:11
まあ、質問テンプレ全部守れとは言わないが
ここはエスパーに回答してもらうスレじゃないんでな
33:NAME IS NULL
10/06/02 11:29:29
元のテーブル構成まで推測しろとw
34:NAME IS NULL
10/06/02 11:32:13
学校の宿題は自分でな。
35:NAME IS NULL
10/06/02 22:59:15
だめだw
1はまず間違いないだろうが2と3は別解がありすぎるw
36:NAME IS NULL
10/06/02 23:25:18
>>29
1.
select 商品コード from コードテーブル where 商品名 = ?
select 商品受注明細 from 商品受注明細テーブル
join 商品コードテーブル on 商品コード = 商品受注明細テーブル.商品コード
where 商品コードテーブル.商品名 = ?
2.
select 商品平均受注個数 from 商品平均受注個数テーブル
select 商品コード別受注個数合計, 仕入先
from 商品コード別受注個数合計テーブル
where 受注個数合計 > 商品平均受注個数
3.
select 顧客 from 顧客テーブル
where4月の受注額合計 > 500000
and 5月の受注額合計 > 500000
select 6月の顧客別受注額合計
from 顧客別受注額合計テーブル
37:NAME IS NULL
10/06/03 00:30:50
俺の質問に誰か答えてくれよ
38:NAME IS NULL
10/06/03 00:31:40
質問どれだよw
39:NAME IS NULL
10/06/03 13:53:58
MySQL5です。
maindata
-----------------------------
main_id | main_name | junle
-----------------------------
1000001 | aaaaaaaaa | 1
1000002 | bbbbbbbbb | 2
1000003 | ccccccccc | 1
1000004 | ddddddddd | 3
1000005 | eeeeeeeee | 1
itemdata
--------------------
item_id | item_name
--------------------
9000001 | AAAAAAAAA
9000002 | BBBBBBBBB
9000003 | CCCCCCCCC
9000004 | DDDDDDDDD
9000005 | EEEEEEEEE
itemlist
------------------
main_id | item_id
------------------
1000001 | 9000001
1000001 | 9000004
1000002 | 9000002
1000002 | 9000005
1000004 | 9000002
1000004 | 9000004
1000004 | 9000005
という3つのテーブルがある場合に、maindata.junle='1'を条件に
main_id | main_name | itemlists
----------------------------------------------------
1000001 | aaaaaaaaa | AAAAAAAAA DDDDDDDDD
1000003 | ccccccccc |
1000004 | eeeeeeeee | BBBBBBBBB DDDDDDDDD EEEEEEEEE
----------------------------------------------------
※itemlistsは空白で連結
という結果を求めたいと思います。
サブクエリを利用して一度に求めることは可能でしょうか?
それとも、アプリケーション側でループの際に都度itemlistsを生成する必要がありますでしょうか?
40:NAME IS NULL
10/06/03 13:59:31
>>39
maindataテーブルとitemdataテーブルをitemlistテーブルを媒介にしてinner join
あとは普通に検索条件をかければいい
41:39
10/06/03 15:15:55
>>40
ありがとうございます。
・・・でも、そのSQLの書き方が判りません…
大変申し訳ありませんが、サンプルをご提示いただけると助かります。
よろしくお願いいたします。
42:NAME IS NULL
10/06/03 16:20:14
ああ縦を横にしようとしているのか
43:NAME IS NULL
10/06/03 18:07:05
>>39
>>7
44:NAME IS NULL
10/06/03 18:28:19
>>39
つ GROUP_CONCAT
45:39
10/06/03 19:50:07
>>44
ありがとうございました。
おかげさまで、目的を達成する事ができました。
46:NAME IS NULL
10/06/03 21:29:20
テーブルの主キーを日付にする時、一般論としてDate型で持つのとNumber(14)やNumber(17??年くらいからのミリ秒・・16桁くらい?)で持つのとで速度に差は出ますか?
? <= xx_date and xx_date < ? のように範囲検索を多用する場合です。
データベースはMySQLかPostgreSQLだと思ってください。
47:NAME IS NULL
10/06/03 23:29:21
厳密には当然違いはある。一般論としては悩むだけムダ。
48:NAME IS NULL
10/06/04 19:36:50
【質問テンプレ】
・DBMS名とバージョン
MySQL5.0.77
・テーブルの構造
CREATE TABLE IF NOT EXISTS table (
id integer NOT NULL auto_increment,
value integer NOT NULL,
PRIMARY KEY (id),
);
・テーブルデータ
ID VALUE
--+--------
1 相沢
2 飯田
3 上井
・操作
INSERT INTO table(id, value) values
(NULL, '遠藤'), (NULL, '岡田');
・欲しい結果
4
5
・説明
ID列をauto_incrementにしているのですが、要素を追加したときに
そのIDを取得したいと考えています。どのようにしたらいいでしょうか?
49:NAME IS NULL
10/06/05 09:06:58
放置されてる質問はわかる奴がここにはいないってことか
手頃な金額で依頼したSQL書いてくれるサービスないかな
50:NAME IS NULL
10/06/05 15:17:12
>>48
INSERTは一件ずつにする。
INSERTしたら
SELECT LAST_INSERT_ID() AS LAST
51:NAME IS NULL
10/06/05 19:47:59 IU+phbd/
【質問テンプレ】
・DBMS名とバージョン
postgresql 8.2.4
・説明
left join や right join を例えばsybaseでのwhere句の式"*="ように
postgresqlでも符号であらわすことはできるのでしょうか?
(テンプレに沿ってなくてすみません。)
52:NAME IS NULL
10/06/05 20:47:31
出来ないんじゃね。メリットないし。
OracleとSQLServer(sybase)だけだろうな。
53:NAME IS NULL
10/06/05 22:40:48
【質問テンプレ】
・DBMS名とバージョン
Oracle Database 10g 10.2.0.1
・テーブルデータ
なし
・欲しい結果
指定した年月に対応する年月日
・説明
年月(yyyyMM)を指定し、その年月に対応する年月日を取得したい
---------
yyyyMMdd
---------
20100601
20100602
・
・
・
20100630
できるにはできたのですが、スマートでなかったので・・・
お願いします。
hoge:201006
SELECT TEST
FROM (
SELECT hoge || '01' AS TEST FROM DUAL
UNION ALL
SELECT hoge || '02' AS TEST FROM DUAL
UNION ALL
・
・
・
SELECT hoge || '31' AS TEST FROM DUAL
)
WHERE TEST <= TO_CHAR(LAST_DAY(hoge || '01'),yyyyMMdd)
ORDER BY TEST
54:NAME IS NULL
10/06/05 23:23:59
>>53
試してないけど↓が見つかった
URLリンク(www.seiji-tsubosaki.net)
55:NAME IS NULL
10/06/05 23:37:35
最大でも31行までのレコードを得られれば良いので、適当なビューを使えば
行数を返す関数を作る必要も無い。
↓適当に作ってみた
SQL> select to_char(TEST,'YYYYMMDD') as TEST from
2 ( select to_date( '201006','YYYYMM' )+rownum-1 as TEST from all_catalog where rownum<=31 )
3 where trunc(TEST,'MM')=to_date('201006','YYYYMM');
TEST
------------------------
20100601
20100602
:
20100629
20100630
30行が選択されました。
10gなら
SQL> select to_char(TEST,'YYYYMMDD') as TEST from
2 ( select to_date( '201006','YYYYMM' )+level-1 as TEST from dual connect by level<=31 )
3 where trunc(TEST,'MM')=to_date('201006','YYYYMM');
なんての可能だけど、使い所が限られるかも。
56:NAME IS NULL
10/06/06 00:24:26
SQLでデータを「作りたがる」人は相変わらずいるもんだね。
57:NAME IS NULL
10/06/06 03:16:00
まあ、なんでもSQLでやりたくなる気持ちはわからんでもないが...
>>11も言ってるけど、本気でFAQのテンプレ化したほうがいいかもな
ただ、PostgreSQLみたいに連番生成する関数がもっとほかのDBに広まってもいいとも思う
58:NAME IS NULL
10/06/06 08:27:10
PostgreSQLは新しい実装に積極的だよね。
果敢にチャレンジし続けるイメージがある。
59:53
10/06/06 10:07:57
>>54-55
ありがとうございます
60:NAME IS NULL
10/06/06 19:29:43 sC7klrj/
create databaseとcreate schemaのsqlがあるわけですが、
database=schemaじゃないんですか?
61:NAME IS NULL
10/06/06 19:37:25
違う。
62:60
10/06/06 19:59:13 sC7klrj/
それじゃ、スキーマって何なんですか?
63:NAME IS NULL
10/06/06 20:02:47
心と心の間を埋めるものだよ
64:NAME IS NULL
10/06/06 20:04:06
SQL92 には CREATE DATABASE なんて存在しないな。
65:60
10/06/06 20:24:09 sC7klrj/
そんじゃ、ユーザー=スキーマってことでおk?
66:NAME IS NULL
10/06/06 20:47:23
厳密には違うが、ユーザー=スキーマな実装もあるかもしれない
67:60
10/06/06 20:59:25 sC7klrj/
>>66
それだけわかれば十分だよ
厳密な意味はそのうち勉強することにする
thx
68:NAME IS NULL
10/06/06 21:48:50
>>62
「テーブルを作った人」くらいの感覚でいいよ。
69:NAME IS NULL
10/06/06 22:44:45
昔受けた講習で「スキーマとはテーブルなどの所有者のことです」って
臆面もなく説明されたことがあったな
70:NAME IS NULL
10/06/07 01:32:16
>>65
スキーマはオブジェクトの集合。
Oracleのようにユーザとスキーマが一対一で不可分の場合は
ユーザ=スキーマで差し支えないけど、
SQL Serverのようにユーザとスキーマが別々に定義されていて、
それぞれを結び付けるようなデータベースもある。
71:NAME IS NULL
10/06/07 19:43:29
【質問テンプレ】
・Oracle10g
TableA
IDa C1
-------------
A1 X
A2 Y
A3 Z
TableB
IDb C2
-------------
B1 S
B2 T
B3 U
TableC(TableAとTableBを紐付けているテーブル)
IDa IDb
-------------
A1 B1
A3 B3
欲しい結果
IDa IDb C1 C2
-----------------
A1 B1 X S
A2 Y
A3 B3 Z U
B2 T
説明
TableA,B,Cの3つのテーブルからTableCに存在しないIDのTableAとTableBのデータも出力したい
>>39と似てる気もしますが、よろしくお願いします。
72:NAME IS NULL
10/06/07 19:59:01
ヒント:OUTER JOIN
73:NAME IS NULL
10/06/07 20:18:17
SELECT IDa, IDb, C1, C2 FROM TableA LEFT OUTER JOIN TableC USING(IDa) FULL OUTER JOIN TableB USING(IDb) ORDER BY IDa
74:NAME IS NULL
10/06/07 20:36:29
>>73
こんな単純にできたんですね・・・
2時間試行錯誤してた自分ェ・・・
ありがとうございました。
75:NAME IS NULL
10/06/07 21:56:16
mysqlでsqlの勉強をしているところなのですが、
alter databaseでdbの名前を変えられないんですか?
76:NAME IS NULL
10/06/07 22:17:46
RENAME DATABASE xdb TO ydb
77:NAME IS NULL
10/06/07 23:01:55
>>76
thx
78:NAME IS NULL
10/06/09 00:34:22
SQLを仕事で書いてますが、困ってます。
○テーブルA
number
nendo
gaku
riyu
○テーブルB
number
code
テーブルAのgakuの値を更新するSQLを作りたいです。条件は
・テーブルAのriyu <> -1の全てのレコードのgakuに値をセットする。
セットする値は、レコードそれぞれのnumberでテーブルAとテーブルB
を結合して、テーブルBのcode=1なら1000,code=2なら2000、code=3なら3000
以下のようなSQLを書きましたがうまくいきません。
update テーブルA a set gaku = (
select
case
WHEN b.code = 1 1000
WHEN b.code = 2 2000
WHEN b.code = 3 3000
ELSE 0
END gaku
from テーブルA a,テーブルB b
where a.number = b.number
and (a.number,a.nendo) IN ( select number,nendo from テーブルA where riyu <> -1 )
)
where (a.number,a.nendo) IN ( select number,nendo from テーブルA where riyu <> -1 )
DBはOracle10gです。
よろしくお願いします。
79:NAME IS NULL
10/06/09 02:23:38
UPDATE テーブルA a
SET a.gaku = (CASE (SELECT b.code FROM テーブルB b WHERE b.number = a.number) WHEN '1' THEN '1000' WHEN '2' THEN '2000' WHEN '3' THEN '3000' ELSE NULL END)
WHERE a.riyu != '-1'
結合する必要ない・・よね?
UPDATEは一気にぜんぶ書くんじゃなくて、更新したいレコードを抽出するSQL→SETの中身と順に書くのがええかと。
80:NAME IS NULL
10/06/09 18:53:04
MYSQLやSQLITEでTIMESTAMP型の比較ってどうやって書くのでしょうか?
条件に現在の時間から3時間以内のデータを取り出す等のようなSQL文を書きたいのですが。
ただ現在の時間からというのなら
select * from hoge where time < CURRENT_TIMESTAMP
で良さそうなんですが、時間の指定がよくわかりません。
81:NAME IS NULL
10/06/09 20:09:13
そのDBMSで試してないけど、たとえば
'2010/06/09 02:23:38'::timestamp
82:NAME IS NULL
10/06/09 21:11:50
>>80
つ URLリンク(dev.mysql.com)
83:NAME IS NULL
10/06/09 21:26:44
create databaseでデータベースを作成したわけですが、
rootでデータベースを作成しました
rootでshow tables;をすると作ったデータベースが見えるのですが、
一般ユーザからはshow tables;をしてもデータベースが見えません
なんでですか?
dbms:mysql 5
84:NAME IS NULL
10/06/09 21:51:26
権限がないからです
そしてSQL言語でない、MySQL固有のコマンドの質問はスレ違いです
85:NAME IS NULL
10/06/09 21:52:18
>>84
そうですか
86:NAME IS NULL
10/06/09 23:04:49
MySQLでのやり方をお尋ねします。
table1
−−−−−−−−−−−
| id1 | column1 |
−−−−−−−−−−−
| 1 | ああああ1 |
| 2 | ああああ2 |
−−−−−−−−−−−
table2
−−−−−−−−−−−−−−−
| id2 | id1 | column2 |
−−−−−−−−−−−−−−−
| 1 | 2 | かかかか1 |
| 2 | 1 | かかかか2 |
| 3 | 2 | かかかか3 |
−−−−−−−−−−−−−−−
id1が一致するものをくっつけたいのですが、table2でid1=2のレコードが2つあるので
その場合はid2が大きいほうを選びたいと思っています(つまりid2=3のレコードです)。
−−−−−−−−−−−−−−−−−−−−−
| id1 | id2 | column1 | column2 |
−−−−−−−−−−−−−−−−−−−−−
| 1 | 2 | ああああ1 | かかかか2 |
| 2 | 3 | ああああ2 | かかかか3 |
−−−−−−−−−−−−−−−−−−−−−
CREATE TEMPORARY TABLE tmp SELECT MAX(id2) AS id2 FROM table2 GROUP BY id1;
SELECT * FROM table1,table2 WHERE table1.id1=table2.id1 AND table2.id2=tmp.id2;
試行錯誤してこのようになりましたが、一文にすっきりまとめることはできないでしょうか?
87:NAME IS NULL
10/06/09 23:11:22
>>86
>>4
88:78
10/06/09 23:45:21
>>79
レス遅れて申し訳ありません。
なるほど、こんな書き方があったんですね。
明日早速試してみます。
ありがとうございました。
89:NAME IS NULL
10/06/10 00:26:53
>>87
ありがとうございます。
>>4はテーブルが1つの場合で、>>86は2つの場合ですが、
やり方は同じですか?
4行目の「from TableName A」の部分をテーブル2つにする方法が
わからなくて困っています。
from table1 A,table2 C とか
from table1,table2 A とか
やってみましたが、エラーが出ます。
90:86、89
10/06/10 00:45:34
度々すみません。
SELECT A.id1,
A.column1,
B.*
FROM table1 A
INNER JOIN
(SELECT *,MAX(id2) as max_id2
FROM table2
GROUP BY id1
) B
ON A.id1 = B.id1
とやってみたら
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
| id1 | column1 | id2 | id1 | column2 | max_id2 |
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
| 1 | ああああ1 | 2 | 1 | かかかか2 | 2 |
| 2 | ああああ2 | 1 | 2 | かかかか1 | 3 |
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
という結果になってしまいました。
最後の行に「AND B.max_id2 = table2.id2」のような指定をする必要があるんでしょうか。
これを追加すると、Unknown column 'table2.id2' in 'on clause'というエラーになります。
91:NAME IS NULL
10/06/10 00:50:22
table2に>>4を適用して、その結果とtable1を結合すればいいんじゃね?
92:NAME IS NULL
10/06/10 00:51:03
JOINしたら1テーブルに扱えるでしょ。普通に並べて書けば。
SELECT a.id1, b.id2, a.column1, b.column2, c.max_id2
FROM table1 a
INNER JOIN table2 b ON a.id1 = b.id1
INNER JOIN (SELECT id1, MAX(id2) AS max_id2 FROM table2 GROUP BY id1) c ON b.id1 = c.id1
WHERE b.id2 = c.max_id2
個人的には>>4のやり方より↓の方が直感的だと思うんだが。
SELECT a.id1, b.id2, a.column1, b.column2
FROM table1 a INNER JOIN table2 b ON a.id1 = b.id1
WHERE id2 = (SELECT MAX(id2) FROM table2 WHERE id1 = a.id1 GROUP BY id1)
93:86、89
10/06/10 01:00:03
>>91-92
ありがとうございます。
>>92さんのSQL文はどちらも正しく動きました!
下のほうがスッキリしているので、じっくり見て仕組みを考えてみたいと思います。
こういうのをさっと書けるようになりたいですけど、もっと慣れないと混乱して無理っぽいです。
精進します。
94:NAME IS NULL
10/06/10 04:00:00
>>92
GROUP BYは要らないだろ。
WHERE b.id2 = (SELECT max(id2) FROM table2 WHERE table2.id1 = a.id1)
95:NAME IS NULL
10/06/10 12:47:18
>>94
おうふ
全くそのとおりでござる
96:NAME IS NULL
10/06/10 15:06:59
教えてください
MS Accessで下記の(dept,place)でのくくりで
count のtop3を抽出したいです
table a
dept|place|ext|count
aaaa|aaaaa|jar|10
aaaa|aaaaa|com|4
aaaa|aaaaa|scr|20
aaaa|aaaaa|exe|80
aaaa|aaaaa|bat|2
aaaa|bbbbb|ace|10
aaaa|bbbbb|arj|4
aaaa|bbbbb|zip|20
aaaa|bbbbb|rar|80
aaaa|bbbbb|lzh|2
bbbb|aaaaa|mdb|10
bbbb|aaaaa|xls|4
bbbb|aaaaa|ppt|20
bbbb|aaaaa|doc|80
bbbb|aaaaa|txt|2
bbbb|bbbbb|gif|10
bbbb|bbbbb|png|4
bbbb|bbbbb|jpg|20
bbbb|bbbbb|bmp|80
bbbb|bbbbb|tif|2
↓
aaaa|aaaaa|exe|80
aaaa|aaaaa|scr|20
aaaa|aaaaa|jar|10
aaaa|bbbbb|rar|80
aaaa|bbbbb|zip|20
aaaa|bbbbb|ace|10
bbbb|aaaaa|doc|80
bbbb|aaaaa|ppt|20
bbbb|aaaaa|mdb|10
bbbb|bbbbb|bmp|80
bbbb|bbbbb|jpg|20
bbbb|bbbbb|gif|10
こんな感じ
さっぱりわかりません
助けてください
97:NAME IS NULL
10/06/10 16:22:37
countが重複したときは?
98:NAME IS NULL
10/06/10 16:57:32
count のtop3 ってのはトータルでのトップ3なのか、
(dept,place)でのくくり ごとのトップ3なのか?
99:NAME IS NULL
10/06/10 18:02:31
>>97
重複は稀すぎるので、今回考えなくてかまいません
>>98
>>96の出力例みればわかってもらえると思ったのですが
>(dept,place)でのくくり ごとのトップ3なのか?
こちらです
100:NAME IS NULL
10/06/10 18:46:52
>>99
>出力例みればわかってもらえると思ったのですが
お前の出力例ではトップ3は全部の組み合わせで同じだから判断できねえだろうが
SELECT * FROM TableA a WHERE count IN (
SELECT TOP 3 count FROM TableA WHERE dept=a.dept AND place=a.place ORDER BY count DESC
)
ORDER BY dept,place,count DESC
101:NAME IS NULL
10/06/10 18:57:36
>>100
>お前の出力例ではトップ3は全部の組み合わせで同じだから判断できねえだろうが
ここの意味がわからなくてイラッっとしてますが
ものすごく正解のSQLいただいたので、土下座して感謝します
まじでありがとうございました
102:NAME IS NULL
10/06/10 19:01:05
>>101
お前もう来るな。
103:NAME IS NULL
10/06/10 19:15:43
「重複は考えなくていい」もそうだが、仕様とは何かをまずわかってないんだろうな
104:NAME IS NULL
10/06/10 19:34:40 X6f9EMRL
>イラッっとしてますが
www
105:NAME IS NULL
10/06/10 23:52:11
俺もイラッとしたw
もちろん
>お前の出力例ではトップ3は全部の組み合わせで同じだから判断できねえだろうが
がわからないからだ。
106:NAME IS NULL
10/06/11 00:49:06
日付順で並べ替えて10件目から20件目までUPDATEしたい場合
どう書けばいいでしょうか?
LIMIT 10,20が使えないぽい
107:NAME IS NULL
10/06/11 01:20:16
UPDATE table1 a
SET column1 = 'hoge'
WHERE a.主キー IN (table1の日付順の10件目から20件目までの主キーを取得するSELECT文)
108:NAME IS NULL
10/06/11 22:44:13
table as a
table a
この2つってどう違うんでしょうか?
ついでに、そういう細かいことがわかるサイトも
教えていただけると助かります。
109:NAME IS NULL
10/06/11 23:59:30
その2つは同じなのでそういう細かいことって言われても何とも答えづらい。
>>2を見ればDBMSごとの文法は知ることができるし
URLリンク(savage.net.au) で標準SQLの正しい文法が分かる。
110:NAME IS NULL
10/06/12 00:06:10 nH6zlsmE
今日、OracleでFULL OUTER JOINを使って、ちょっとはまったのですが、
SQL ServerとOracleでSQLの解釈に違いってあるもんでしょうか?
SQL Serverの場合
SELECT *
FROM 名簿 A
FULL OUTER JOIN ON 名簿 B
ON A.部活 = 'テニス部' AND B.部活='陸上部'
A.名前=B.名前
のような書き方で、名簿テーブルの中でテニス部に所属している人の一覧
と、陸上部に所属している人の一覧を結びつけられると思ったのですが、
どうもOracleの場合は、ON句でWHERE句の条件を書いても絞り込まれない
ような印象でした。
最終的には、
SELECT *
FROM ( SELECT *
FROM 名簿
WHERE 部活='テニス部') A
FULL OUTER JOIN
(SELECT *
FROM 名簿
WHERE 部活='陸上部') B
ON A.名前 = B.名前
のような形にして対応しました。
どうもOracleはなんでもかんでもサブクエリにしないとまともな
SQLが書けない印象。わたしの勘違いなのかなぁ。
111:NAME IS NULL
10/06/12 00:51:44
SQLServerはそんなまともじゃないSQLでも動くんだな。
112:NAME IS NULL
10/06/12 01:03:47
>>109
ありがとうございます。
読んで勉強します!
113:NAME IS NULL
10/06/12 02:33:36
>>110,111
SQL Serverでも上のSQLはそのままじゃ動かないぞ
ONが多いのとANDが抜けてるとしても、そもそもその二つのSQLは同じ結果じゃないと思うが
なにがしたいのかいまいちよくわからん
それぞれのDBMSのバージョンいくつだ?
とりあえず full join バグ あたりでググってみるとなんかあるかもよ
114:NAME IS NULL
10/06/12 02:34:29
SQLServerで複数列を更新する際に、
同じ条件なんだけど更新する内容が列によって違う場合、
以下のように同じ条件をだらだらと書かずに出来ないもんでしょうか?
UPDATE table_a SET
cd5 = CASE WHEN fee IN (80, 90) THEN SUBSTRING(cd, 1, 5)
ELSE NULL
END,
cd2 = CASE WHEN fee IN (80, 90) THEN SUBSTRING(cd, 1, 2)
ELSE NULL
END,
varkey = CASE WHEN fee IN (80, 90) THEN post + user
ELSE post
END
↓こんな感じにまとめられないですかね?
UPDATE table_a SET
(cd5, cd2, varkey) = CASE WHEN fee IN (80, 90)
THEN (SUBSTRING(cd, 1, 5), SUBSTRING(cd, 1, 2), post + user)
ELSE (NULL, NULL, post)
END
115:NAME IS NULL
10/06/12 02:39:03
2回投げるのが楽そうだけど、どうしても一回でやりたいのかなぁ
116:NAME IS NULL
10/06/12 02:51:54
最初は二回に分けてたけど、レコードが数十万件あるから一回で済ましたほうが効率良いかと思いまして・・・
117:NAME IS NULL
10/06/12 02:58:00
>>114
特定のDBMSに固有のSQLはそのDBMSのスレで聞け
CASE使ってまで1文で更新したい理由がわからん
俺なら素直に
UPDATE table_a SET
cd5=SUBSTRING(cd, 1, 5),
cd2=SUBSTRING(cd, 1, 2),
varkey=post + user
WHERE
fee IN (80, 90)
と
UPDATE table_a SET
cd5=NULL,
cd2=NULL,
varkey=post
WHERE
fee NOT IN (80, 90)
の二つ流すが
118:NAME IS NULL
10/06/12 03:18:13
>>117
二つ流すのははっきり率悪いだろう・・・。
>>114
そのSQLでしょうがないんじゃね。
119:NAME IS NULL
10/06/12 09:53:54 d+6B+4E8
msdnで聞くのが吉
URLリンク(social.msdn.microsoft.com)
120:NAME IS NULL
10/06/12 09:59:45
すなおに二つにします。
皆さんありがとうございました
121:NAME IS NULL
10/06/12 10:02:18
あ、まだどっちがパフォ良いか試してないんでそれから検討します。
122:NAME IS NULL
10/06/12 11:15:33 1rzl2/wK
Oracleでの「定数との比較を含む外部結合」をACCESS形式に変換したいです。
<TABLE1> <TABLE2>
|COLUM1|COLUM2| |COLUM3|COLUM4|COLUM5|
├――┼――┤ ├――┼――┼――┤
| あああ | XX | | かかか | XX | AAA |
├――┼――┤ ├――┼――┼――┤
| いいい | YY | | ききき | XX | BBB |
└――┴――┘ ├――┼――┼――┤
| くくく | YY | AAA |
└――┴――┴――┘
上の2つのテーブルに対して以下のSQLを実行すると下の実行結果が得られると思います
(今机上ででっちあげたもんだから試してないけど)
SELECT TABLE1.COLUM1, TABLE2.COLUM3
FROM TABLE1, TABLE2
WHERE TABLE1.COLUM2=TABLE2.COLUM4(+) AND 'AAA'=TABLE2.COLUM5(+)
<実行結果>
|COLUM1|COLUM3|
├――┼――┤
| あああ | かかか |
├――┼――┤
| いいい | |
└――┴――┘
これを、ACCESS文法に変えたいのですが、「TABLE1.COLUM2=TABLE2.COLUM4(+) AND 'AAA'=TABLE2.COLUM5(+)」
の部分(定数との比較を含む外部結合)のやり方がわかりません。
「TABLE1 LEFT JOIN TABLE2 ON TABLE1.COLUM2=TABLE2.COLUM4 AND TABLE2.COLUM5='AAA'」
では上手くいきませんでした。
123:NAME IS NULL
10/06/12 11:32:54
・まずACCESS文法って造語が意味分からない
・結果の2行目に"くくく"が表示されないのが意味分からない
・定数との外部結合をする意味がわからない
・行選択のための条件をWHERE句でなくON句で書く意味がわからない
124:NAME IS NULL
10/06/12 11:39:04
実行結果が(いいい,くくく)じゃ無いのはおかしくないか?
なにがしたいのか不明だ。どう上手くいかなかったんだよ
外部結合である必要ないんじゃないのか?
125:NAME IS NULL
10/06/12 12:00:02
>まずACCESS文法って造語が意味分からない
Oracle用のSQL表記とmdbファイル参照する時のSQLと違うでしょ?
>結果の2行目に"くくく"が表示されないのが意味分からない
TABLE1.COLUM2=TABLE2.COLUMと'AAA'=TABLE2.COLUM5をともに満たすTABLE2の
レコードがある場合はCOLUM3を表示し、無い場合は外部結合なんでCOLUM1だけ
表示する、と思うだけど
>定数との外部結合をする意味がわからない
だって元のSQLがそうなってるんだもん
Oracleサーバを参照してたSQLをサーバ負荷軽減のためにローカルにDLした
mdbを参照するようにしたいんで、OracleSQLと等価なmdb用SQLに変換したいんだ
>行選択のための条件をWHERE句でなくON句で書く意味がわからない
でも「'AAA'=TABLE2.COLUM5(+)」(COLUM5が'AAA'に等しいTABLE2のレコードがあれば
実行結果のCOLUM3を表示し、なければCOLUM3はNULLにしてCOLUM1だけ表示する)
っていうのはmdb用SQLじゃWHERE句に乗せられないでしょ
Oracleなら(+)付ければ一発だけど
126:NAME IS NULL
10/06/12 12:03:46
TABLE2の3行目は ('くくく', 'YY', 'BBB') の間違いじゃないの?
でなければOracleだってその実行結果にはならん。
そうだと仮定して、
select T1.COLUM1,
T2.COLUM3
from TABLE1 T1
left outer join
(select *
from TABLE2
where COLUM5 = 'AAA'
) T2
on T1.COLUM2 = T2.COLUM4
;
127:NAME IS NULL
10/06/12 12:22:16
>>126
ありがとうございます
まあぶっちゃけ実行結果はどうでもよくてOracle形式と等価なmdb用SQLさえ
わかればよかったんで適当でした
すいません
ただFROM句に副問合せを含むとDAOからの実行が出来なくなる気が・・・
(似たようなSQLでmdbのSQLビューからは実行できたのにDAOからは出来なかったことあり)
ともあれありがとうございます
参考にします
128:NAME IS NULL
10/06/12 12:32:52
サンプルが不適切なんで要件が捻じ曲がった可能性があるけど
まあ質問者の自業自得だな
129:NAME IS NULL
10/06/12 13:59:38
つかそれなら本人がダメだったって言ってるSQLで行ける気がするんだがな
130:NAME IS NULL
10/06/13 19:03:28
alter tableで列にnot null制約を追加したいのですが、
modify 列名 データ型 not null
と、わざわざデータ型を入力しないと駄目なのでしょうか?
いちいちデータ型を記入するのは面倒なんですが
131:NAME IS NULL
10/06/13 19:31:24
少なくともOracleではデータ型は書かなくてもいいんだけど
DBMSは何なの?
132:130
10/06/13 21:41:34
>>131
mysqlを使っています
133:NAME IS NULL
10/06/13 21:42:00 bWmBmCbn
mysqlと見た
134:NAME IS NULL
10/06/14 06:43:40
>>121
そもそもそのSQLってしょっちゅう流すわけじゃないでしょ?
移行かなんかのバッチだよね。
もしそうなら、高々数十万件の更新の処理なんてバッチとしてはすぐ終わる部類だし、
せっせとCASE文書いて漏れがないかを検証する作業がもったいないと思わんかね。
135:NAME IS NULL
10/06/14 07:22:12
>>134
しょっちゅう流します
136:NAME IS NULL
10/06/14 12:24:45
>>135
設計見直した方がいいんじゃねえか
137:NAME IS NULL
10/06/14 13:02:55
どう見直すんだろw
138:NAME IS NULL
10/06/14 13:45:08
まあ、設計はスレ違いだし、提示されてない前提条件もあるのかもしれんが
たとえば
初めからCD1を分割しておけば、一部切り出して別コードにするなんて不要
毎回UPDATEしないで、UPDATE後の値を取得できるVIEWをつくるなりトリガで更新する
とか
139:NAME IS NULL
10/06/14 19:08:55
期間の抽出について相談です。
元情報
ID START END
----- ----- -----
10 2010/06/01 2010/06/12
10 2010/06/13 2010/06/14
10 2010/06/15 NULL
20 2010/06/01 2010/06/11
20 2010/06/13 2010/06/15
↓
欲しい情報
ID START END
----- ----- -----
10 2010/06/01 NULL
20 2010/06/01 2010/06/11
20 2010/06/13 2010/06/15
・開始日、終了日の期間重複はなし
・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日
・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20)
アドバイス願います。
140:139
10/06/14 19:13:32
追記、DBはOracle 11gです。
141:NAME IS NULL
10/06/14 20:11:58
こうかな?
select "ID",
min("ROOT_START"),
"END"
from (select "ID",
connect_by_root "START" as "ROOT_START",
"END"
from "TableName"
where connect_by_isleaf = 1
connect by "ID" = prior "ID"
and "START" = prior "END" + 1
)
group by "ID", "END"
order by "ID", "END"
;
142:NAME IS NULL
10/06/14 20:47:22
今気づいたけどサブクエリにしなくてもいいんだな
select "ID",
min(connect_by_root "START"),
"END"
from "TableName"
where connect_by_isleaf = 1
connect by "ID" = prior "ID"
and "START" = prior "END" + 1
group by "ID", "END"
order by "ID", "END"
;
143:NAME IS NULL
10/06/14 21:39:38
○○idという列が主キーになる時が多いですが、
それ以外が主キーになる時ってあんまりないんですか?
144:NAME IS NULL
10/06/14 22:18:35
設計によりますが、
どの列も主キーになりうります。
145:NAME IS NULL
10/06/14 22:23:46
どっちかっつーと○○idという列は主キーにするために作ることが多いと思う
別にそうでなければならないわけではない
146:143
10/06/14 22:37:51
>>144-145
thx
147:139
10/06/14 22:40:28
>>142
thx
葉から根を参照するようにすればいいのか・・・。
根を基準に見ていたから気づかなかったよ
148:NAME IS NULL
10/06/15 05:53:35
すみません
SELECT user_id FROM member_m WHERE user_id = {$user_id} AND password = {$password}"
これはphpのソースなんですが
{ } は多分SQL側に渡されると思うのですが、なにか意味があるのでしょうか?
149:NAME IS NULL
10/06/15 06:22:12
>>148
すれ違いだか、{ } はSQL側へは渡らない。
$a="hoge";echo "a={$a}"; ってして見りゃわかる。
意味とか、その例だけだとプログラマ側の癖みたいなものだが、
詳しくはPHP関係のスレでどーぞ。
150:NAME IS NULL
10/06/15 06:50:28
>>149
ありがとうこざいます
perlだと ${a} だったので先入観がありましたorz
スレ違い申し訳ありませんでした
151:NAME IS NULL
10/06/16 05:38:06
2つの列の値の重複を調べたいのですが
aとbは重複なしの値にしたいのです。
SELECT COUNT(a, b) FROM test WHERE a = '入力データ1' OR b = '入力データ2'
これで結果が 0行 ならデータを追加としたいのです。
aかb片方だけだと上手くいくのですがエラーがでます。
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 ' b
どうしたらいいのでしょうか
152:NAME IS NULL
10/06/16 06:24:09
>>151
結果が0行か否かなら、
SELECT EXISTS(SELECT * test WHERE a = '入力データ1' OR b = '入力データ2');
でboolが返るが、行数が欲しいのなら、
SELECT COUNT(1) FROM test WHERE a = '入力データ1' OR b = '入力データ2';
でいける。COUNT(1)の他にSUM(1)でもいいが。
153:151
10/06/16 16:05:45
>>152
ありがとうこざいます!
154:NAME IS NULL
10/06/18 03:57:32
質問です。
Oracle10gです。
部門の親子関係を示す以下のようなテーブルがある。
親部門ID 子部門ID 子部門の区分
1 2 0
1 3 1
3 4 0
3 5 1
5 6 0
7 8 0
7 9 1
9 10 0
ある親部門IDを指定し、その部門以下の階層に含まれる部門のうち区分が0となっているものを取得したい。
上の例だと部門ID=1と指定した場合2,4,6を取得したい。
よろしくお願いします。
155:NAME IS NULL
10/06/18 06:12:15
>>154
Oracle10gって再起クエリ使えたっけ?
カラム名やテーブル名を以下のように変えて書くけど、
親部門ID=p_id
子部門ID=c_id
子部門区分=c_sec
部門テーブル sector
WITH RECURSIVE Temp(p_id,c_id,c_sec) AS
(SELECT T1.* FROM sector AS T1 WHERE p_id=1
UNION ALL
SELECT T2.* FROM sector AS T2 WHERE T2.p_id = T1.c_id)
SELECT * FROM Temp WHERE c_sec=0;
156:NAME IS NULL
10/06/18 07:14:01
Oracleの場合はCONNECT BY
>>142を参考に、あと>>154の場合はSTART WITHも使う
詳しくは
URLリンク(otndnld.oracle.co.jp)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5164日前に更新/116 KB
担当:undef