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

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

SQL質疑応答スレ 10問目

1 :NAME IS NULL:2010/05/25(火) 21:49:31 ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 9問目
http://pc11.2ch.net/test/read.cgi/db/1252492296/


2 :NAME IS NULL:2010/05/25(火) 21:50:33 ID:???
SQL言語リファレンス一覧
Oracle Database
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/toc.htm
Microsoft SQL Server
http://msdn.microsoft.com/ja-jp/library/bb510741%28v=SQL.105%29.aspx
IBM DB2 Database
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/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://oraclesqlpuzzle.hp.infoseek.co.jp/
http://www.techscore.com/tech/sql/


3 :NAME IS NULL:2010/05/25(火) 21:51:14 ID:???
過去スレ
SQL質疑応答スレ 8問目
http://pc11.2ch.net/test/read.cgi/db/1236253554/
SQL質疑応答スレ 7問目
http://pc11.2ch.net/test/read.cgi/db/1223525474/
SQL質疑応答スレ 6問目
http://pc11.2ch.net/test/read.cgi/db/1210940477/
SQL質疑応答スレ 5問目
http://pc11.2ch.net/test/read.cgi/db/1193486961/
【帰ってきた】SQL質疑応答スレ 4問目
http://pc11.2ch.net/test/read.cgi/db/1176553195/
【帰ってきた】SQL質疑応答スレ 3問目
http://pc11.2ch.net/test/read.cgi/db/1160458216/
【帰ってきた】SQL質疑応答スレ 2問目
http://pc8.2ch.net/test/read.cgi/db/1141622643/
【帰ってきた】SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1124178925/
SQL質疑応答スレ Part 2
http://pc8.2ch.net/test/read.cgi/db/1103113155/
SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1056973582/


4 :NAME IS NULL:2010/05/25(火) 21:51:55 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:2010/05/25(火) 21:52:36 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:2010/05/25(火) 21:53:17 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:2010/05/25(火) 21:54:00 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/technology/pub/articles/oracle-database-11g-top-features/11g-pivot.html


8 :NAME IS NULL:2010/05/26(水) 05:20:59 ID:bivGLNrt
さぐぇ

9 :NAME IS NULL:2010/05/26(水) 21:13:53 ID:???
>>1


10 :NAME IS NULL:2010/05/26(水) 21:38:51 ID:???
質問です。

・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:2010/05/26(水) 21:47:00 ID:???
>>10
カレンダーテーブルを別途用意してOUTER JOIN

てかこれもFAQにしたほうがよかったかも?

12 :10:2010/05/26(水) 22:01:56 ID:???
>>11
薄々そんな気はしてたんですが、これが一番ですよね。
ありがとうございました。

13 :NAME IS NULL:2010/05/26(水) 22:57:21 ID:???
まあテーブルでもいいけどそこだけなら当月の日付一覧を検索するサブクエリでいいしょ。

14 :10:2010/05/27(木) 22:22:26 ID:PcEBL+w/
>>13
うわ、それ気になります!!

例えば今月の日付一覧を出力するSQLってどう書くんでしょう。
お願いします。

15 :NAME IS NULL:2010/05/27(木) 22:59:16 ID:???
アンケート生成システムを作っているのですが、
アンケート項目数が可変なのでアンケートテーブルを別途作り
さらに回答項目数(チェックボックスとか)も可変なので回答項目テーブルも作りました。

アンケートテーブル→アンケート項目テーブル→回答項目テーブル
という感じで紐づいてます。
ユーザさんが(会員制ではないためユーザテーブルはありません)回答したログはどこに置こうかと悩んで
結局回答ログテーブルを回答項目テーブルと紐付けて
1.ユーザID(回答時に暫定的に割り振る) 2.回答項目ID 3.テキストエリアの場合の回答用カラム
として作成しました。

精一杯考えて結局上記のようになったのですが
これだと例えばあるアンケートの回答一覧をユーザごとに出したい場合
アンケートIDから全ての項目IDを割り出してその項目ID全てに紐づいた回答項目IDを出し
その回答項目IDから回答テーブルを検索しなくてはならず煩雑です。

他の方法としてはアンケートテーブルに質問1 質問2 質問3...と数十個カラムを足すしか思いつかないのですが
何かいい方法がないでしょうか。

16 :NAME IS NULL:2010/05/27(木) 23:08:55 ID:???
回答項目テーブル、回答テーブルにアンケートID項目をつくる。

17 :NAME IS NULL:2010/05/27(木) 23:14:14 ID:???
ご回答ありがとうございます。そうします。こんな長い質問読んでくださりありがとうございます。
しかも以下間違ってました。読みづらくてごめんなさい。
×アンケート項目数が可変なのでアンケートテーブルを別途作り
○アンケート項目数が可変なのでアンケート項目テーブルを別途作り

18 :NAME IS NULL:2010/05/28(金) 00:01:52 ID:???
>>15
もしかしてjoinを知らない?

19 :NAME IS NULL:2010/05/28(金) 00:09:32 ID:???
>>18
知ってます。in句が重なるとパフォーマンスも落ちるし
もうちょっと簡潔に出来る方法ないかな…と思ってお聞きしました。

20 :NAME IS NULL:2010/05/28(金) 16:48:05 ID:???
>>19
もしかしてjoinを理解してない?
inなんて使う所が思い浮かばないんだが

つか、自分で考えたテーブルレイアウトとSQL書いてみ


21 :NAME IS NULL:2010/05/28(金) 21:16:30 ID:???
INNER JOINで質問。
2つのテーブルに同じ名前のフィールドがある時、結合するとどうなるか、どこかに解説はないでしょうか。
PHPからMySQLでやってみて、そのフィールド名のデータを取ったら片方のデータは取り出せた。もう片方は取り出せない。
phpMyAdminで試してみたら結果には両方のフィールドが入っています。
好きな方のデータを取り出すにはどうやったら良いのでしょうか。テーブル名.フィールド名だとエラーでした。

22 :NAME IS NULL:2010/05/28(金) 22:03:51 ID:???
まさか列名はテーブル名で修飾できるって知らないのか?

23 :NAME IS NULL:2010/05/28(金) 22:50:47 ID:???
それが何故か上手くいかないんで。
テーブル名付きで指定すると、そんな名前ありませんみたいなエラーが出ちゃう。

24 :NAME IS NULL:2010/05/28(金) 23:19:29 ID:0+Zm+ajr
ぐだぐだ書いてないでそのSQL晒した方が早いんでね?

25 :NAME IS NULL:2010/05/29(土) 00:59:17 ID:???
うまくいくのでSQL待ちだな

26 :NAME IS NULL:2010/05/29(土) 03:56:39 ID:???
テーブル名に別名つけてるのにその別名で修飾してないと予想

27 :NAME IS NULL:2010/05/29(土) 06:32:44 ID:???
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:2010/05/29(土) 07:05:12 ID:???
id以外にキーはないのか?

29 :NAME IS NULL:2010/06/02(水) 06:50:35 ID: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:2010/06/02(水) 07:12:31 ID:???
宿題は自力でやれ

31 :NAME IS NULL:2010/06/02(水) 09:18:29 ID:???
答えられる人がいないスレw



32 :NAME IS NULL:2010/06/02(水) 09:36:11 ID:???
まあ、質問テンプレ全部守れとは言わないが
ここはエスパーに回答してもらうスレじゃないんでな

33 :NAME IS NULL:2010/06/02(水) 11:29:29 ID:???
元のテーブル構成まで推測しろとw

34 :NAME IS NULL:2010/06/02(水) 11:32:13 ID:???
学校の宿題は自分でな。

35 :NAME IS NULL:2010/06/02(水) 22:59:15 ID:???
だめだw
1はまず間違いないだろうが2と3は別解がありすぎるw

36 :NAME IS NULL:2010/06/02(水) 23:25:18 ID:???
>>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:2010/06/03(木) 00:30:50 ID:???
俺の質問に誰か答えてくれよ

38 :NAME IS NULL:2010/06/03(木) 00:31:40 ID:???
質問どれだよw

39 :NAME IS NULL:2010/06/03(木) 13:53:58 ID:???
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:2010/06/03(木) 13:59:31 ID:???
>>39
maindataテーブルとitemdataテーブルをitemlistテーブルを媒介にしてinner join
あとは普通に検索条件をかければいい

41 :39:2010/06/03(木) 15:15:55 ID:???
>>40
ありがとうございます。

・・・でも、そのSQLの書き方が判りません…
大変申し訳ありませんが、サンプルをご提示いただけると助かります。
よろしくお願いいたします。

42 :NAME IS NULL:2010/06/03(木) 16:20:14 ID:???
ああ縦を横にしようとしているのか

43 :NAME IS NULL:2010/06/03(木) 18:07:05 ID:???
>>39
>>7

44 :NAME IS NULL:2010/06/03(木) 18:28:19 ID:???
>>39
つ GROUP_CONCAT

45 :39:2010/06/03(木) 19:50:07 ID:???
>>44
ありがとうございました。
おかげさまで、目的を達成する事ができました。


46 :NAME IS NULL:2010/06/03(木) 21:29:20 ID:???
テーブルの主キーを日付にする時、一般論としてDate型で持つのとNumber(14)やNumber(17??年くらいからのミリ秒・・16桁くらい?)で持つのとで速度に差は出ますか?
? <= xx_date and xx_date < ? のように範囲検索を多用する場合です。
データベースはMySQLかPostgreSQLだと思ってください。

47 :NAME IS NULL:2010/06/03(木) 23:29:21 ID:???
厳密には当然違いはある。一般論としては悩むだけムダ。

48 :NAME IS NULL:2010/06/04(金) 19:36:50 ID:???
【質問テンプレ】
・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:2010/06/05(土) 09:06:58 ID:???
放置されてる質問はわかる奴がここにはいないってことか
手頃な金額で依頼したSQL書いてくれるサービスないかな

50 :NAME IS NULL:2010/06/05(土) 15:17:12 ID:???
>>48
INSERTは一件ずつにする。
INSERTしたら
SELECT LAST_INSERT_ID() AS LAST


51 :NAME IS NULL:2010/06/05(土) 19:47:59 ID:IU+phbd/
【質問テンプレ】
・DBMS名とバージョン
 postgresql 8.2.4

・説明
 left join や right join を例えばsybaseでのwhere句の式"*="ように
 postgresqlでも符号であらわすことはできるのでしょうか?
 (テンプレに沿ってなくてすみません。)

52 :NAME IS NULL:2010/06/05(土) 20:47:31 ID:???
出来ないんじゃね。メリットないし。
OracleとSQLServer(sybase)だけだろうな。

53 :NAME IS NULL:2010/06/05(土) 22:40:48 ID:???
【質問テンプレ】
・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:2010/06/05(土) 23:23:59 ID:???
>>53
試してないけど↓が見つかった
http://www.seiji-tsubosaki.net/CHRONICLE/CONTENTS/contents03/contents_03.html#sect5

55 :NAME IS NULL:2010/06/05(土) 23:37:35 ID:???
最大でも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:2010/06/06(日) 00:24:26 ID:???
SQLでデータを「作りたがる」人は相変わらずいるもんだね。

57 :NAME IS NULL:2010/06/06(日) 03:16:00 ID:???
まあ、なんでもSQLでやりたくなる気持ちはわからんでもないが...
>>11も言ってるけど、本気でFAQのテンプレ化したほうがいいかもな

ただ、PostgreSQLみたいに連番生成する関数がもっとほかのDBに広まってもいいとも思う

58 :NAME IS NULL:2010/06/06(日) 08:27:10 ID:???
PostgreSQLは新しい実装に積極的だよね。
果敢にチャレンジし続けるイメージがある。

59 :53:2010/06/06(日) 10:07:57 ID:???
>>54-55
ありがとうございます

60 :NAME IS NULL:2010/06/06(日) 19:29:43 ID:sC7klrj/
create databaseとcreate schemaのsqlがあるわけですが、
database=schemaじゃないんですか?

61 :NAME IS NULL:2010/06/06(日) 19:37:25 ID:???
違う。

62 :60:2010/06/06(日) 19:59:13 ID:sC7klrj/
それじゃ、スキーマって何なんですか?

63 :NAME IS NULL:2010/06/06(日) 20:02:47 ID:???
心と心の間を埋めるものだよ

64 :NAME IS NULL:2010/06/06(日) 20:04:06 ID:???
SQL92 には CREATE DATABASE なんて存在しないな。

65 :60:2010/06/06(日) 20:24:09 ID:sC7klrj/
そんじゃ、ユーザー=スキーマってことでおk?

66 :NAME IS NULL:2010/06/06(日) 20:47:23 ID:???
厳密には違うが、ユーザー=スキーマな実装もあるかもしれない

67 :60:2010/06/06(日) 20:59:25 ID:sC7klrj/
>>66
それだけわかれば十分だよ
厳密な意味はそのうち勉強することにする

thx

68 :NAME IS NULL:2010/06/06(日) 21:48:50 ID:???
>>62
「テーブルを作った人」くらいの感覚でいいよ。

69 :NAME IS NULL:2010/06/06(日) 22:44:45 ID:???
昔受けた講習で「スキーマとはテーブルなどの所有者のことです」って
臆面もなく説明されたことがあったな

70 :NAME IS NULL:2010/06/07(月) 01:32:16 ID:???
>>65
スキーマはオブジェクトの集合。
Oracleのようにユーザとスキーマが一対一で不可分の場合は
ユーザ=スキーマで差し支えないけど、
SQL Serverのようにユーザとスキーマが別々に定義されていて、
それぞれを結び付けるようなデータベースもある。

71 :NAME IS NULL:2010/06/07(月) 19:43:29 ID:???
【質問テンプレ】
・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:2010/06/07(月) 19:59:01 ID:???
ヒント:OUTER JOIN

73 :NAME IS NULL:2010/06/07(月) 20:18:17 ID:???
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:2010/06/07(月) 20:36:29 ID:???
>>73
こんな単純にできたんですね・・・
2時間試行錯誤してた自分ェ・・・
ありがとうございました。


75 :NAME IS NULL:2010/06/07(月) 21:56:16 ID:???
mysqlでsqlの勉強をしているところなのですが、
alter databaseでdbの名前を変えられないんですか?

76 :NAME IS NULL:2010/06/07(月) 22:17:46 ID:???
RENAME DATABASE xdb TO ydb

77 :NAME IS NULL:2010/06/07(月) 23:01:55 ID:???
>>76
thx

78 :NAME IS NULL:2010/06/09(水) 00:34:22 ID:???
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:2010/06/09(水) 02:23:38 ID:???
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:2010/06/09(水) 18:53:04 ID:???
MYSQLやSQLITEでTIMESTAMP型の比較ってどうやって書くのでしょうか?
条件に現在の時間から3時間以内のデータを取り出す等のようなSQL文を書きたいのですが。
ただ現在の時間からというのなら
select * from hoge where time < CURRENT_TIMESTAMP
で良さそうなんですが、時間の指定がよくわかりません。

81 :NAME IS NULL:2010/06/09(水) 20:09:13 ID:???
そのDBMSで試してないけど、たとえば
'2010/06/09 02:23:38'::timestamp

82 :NAME IS NULL:2010/06/09(水) 21:11:50 ID:???
>>80
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html

83 :NAME IS NULL:2010/06/09(水) 21:26:44 ID:???
create databaseでデータベースを作成したわけですが、
rootでデータベースを作成しました
rootでshow tables;をすると作ったデータベースが見えるのですが、
一般ユーザからはshow tables;をしてもデータベースが見えません

なんでですか?
dbms:mysql 5

84 :NAME IS NULL:2010/06/09(水) 21:51:26 ID:???
権限がないからです
そしてSQL言語でない、MySQL固有のコマンドの質問はスレ違いです

85 :NAME IS NULL:2010/06/09(水) 21:52:18 ID:???
>>84
そうですか

86 :NAME IS NULL:2010/06/09(水) 23:04:49 ID:???
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:2010/06/09(水) 23:11:22 ID:???
>>86
>>4

88 :78:2010/06/09(水) 23:45:21 ID:???
>>79
レス遅れて申し訳ありません。

なるほど、こんな書き方があったんですね。


明日早速試してみます。
ありがとうございました。


89 :NAME IS NULL:2010/06/10(木) 00:26:53 ID:???
>>87
ありがとうございます。
>>4はテーブルが1つの場合で、>>86は2つの場合ですが、
やり方は同じですか?

4行目の「from TableName A」の部分をテーブル2つにする方法が
わからなくて困っています。

from table1 A,table2 C とか
from table1,table2 A とか
やってみましたが、エラーが出ます。

90 :86、89:2010/06/10(木) 00:45:34 ID:???
度々すみません。

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:2010/06/10(木) 00:50:22 ID:???
table2に>>4を適用して、その結果とtable1を結合すればいいんじゃね?

92 :NAME IS NULL:2010/06/10(木) 00:51:03 ID:???
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:2010/06/10(木) 01:00:03 ID:???
>>91-92
ありがとうございます。
>>92さんのSQL文はどちらも正しく動きました!
下のほうがスッキリしているので、じっくり見て仕組みを考えてみたいと思います。
こういうのをさっと書けるようになりたいですけど、もっと慣れないと混乱して無理っぽいです。
精進します。

94 :NAME IS NULL:2010/06/10(木) 04:00:00 ID:???
>>92
GROUP BYは要らないだろ。
WHERE b.id2 = (SELECT max(id2) FROM table2 WHERE table2.id1 = a.id1)

95 :NAME IS NULL:2010/06/10(木) 12:47:18 ID:???
>>94
おうふ
全くそのとおりでござる


96 :NAME IS NULL:2010/06/10(木) 15:06:59 ID:???
教えてください
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:2010/06/10(木) 16:22:37 ID:???
countが重複したときは?


98 :NAME IS NULL:2010/06/10(木) 16:57:32 ID:???
count のtop3 ってのはトータルでのトップ3なのか、
(dept,place)でのくくり ごとのトップ3なのか?

99 :NAME IS NULL:2010/06/10(木) 18:02:31 ID:???
>>97
重複は稀すぎるので、今回考えなくてかまいません

>>98
>>96の出力例みればわかってもらえると思ったのですが
>(dept,place)でのくくり ごとのトップ3なのか?
こちらです



100 :NAME IS NULL:2010/06/10(木) 18:46:52 ID:???
>>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:2010/06/10(木) 18:57:36 ID:???
>>100
>お前の出力例ではトップ3は全部の組み合わせで同じだから判断できねえだろうが
ここの意味がわからなくてイラッっとしてますが
ものすごく正解のSQLいただいたので、土下座して感謝します
まじでありがとうございました


102 :NAME IS NULL:2010/06/10(木) 19:01:05 ID:???
>>101
お前もう来るな。

103 :NAME IS NULL:2010/06/10(木) 19:15:43 ID:???
「重複は考えなくていい」もそうだが、仕様とは何かをまずわかってないんだろうな

104 :NAME IS NULL:2010/06/10(木) 19:34:40 ID:X6f9EMRL
>イラッっとしてますが


www

105 :NAME IS NULL:2010/06/10(木) 23:52:11 ID:???
俺もイラッとしたw

もちろん
>お前の出力例ではトップ3は全部の組み合わせで同じだから判断できねえだろうが
がわからないからだ。

106 :NAME IS NULL:2010/06/11(金) 00:49:06 ID:???
日付順で並べ替えて10件目から20件目までUPDATEしたい場合
どう書けばいいでしょうか?
LIMIT 10,20が使えないぽい

107 :NAME IS NULL:2010/06/11(金) 01:20:16 ID:???
UPDATE table1 a
SET column1 = 'hoge'
WHERE a.主キー IN (table1の日付順の10件目から20件目までの主キーを取得するSELECT文)

108 :NAME IS NULL:2010/06/11(金) 22:44:13 ID:???
table as a
table a
この2つってどう違うんでしょうか?

ついでに、そういう細かいことがわかるサイトも
教えていただけると助かります。

109 :NAME IS NULL:2010/06/11(金) 23:59:30 ID:???
その2つは同じなのでそういう細かいことって言われても何とも答えづらい。
>>2を見ればDBMSごとの文法は知ることができるし
http://savage.net.au/SQL/ で標準SQLの正しい文法が分かる。

110 :NAME IS NULL:2010/06/12(土) 00:06:10 ID: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:2010/06/12(土) 00:51:44 ID:???
SQLServerはそんなまともじゃないSQLでも動くんだな。

112 :NAME IS NULL:2010/06/12(土) 01:03:47 ID:???
>>109
ありがとうございます。
読んで勉強します!

113 :NAME IS NULL:2010/06/12(土) 02:33:36 ID:???
>>110,111
SQL Serverでも上のSQLはそのままじゃ動かないぞ
ONが多いのとANDが抜けてるとしても、そもそもその二つのSQLは同じ結果じゃないと思うが
なにがしたいのかいまいちよくわからん

それぞれのDBMSのバージョンいくつだ?
とりあえず full join バグ あたりでググってみるとなんかあるかもよ

114 :NAME IS NULL:2010/06/12(土) 02:34:29 ID:???
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:2010/06/12(土) 02:39:03 ID:???
2回投げるのが楽そうだけど、どうしても一回でやりたいのかなぁ

116 :NAME IS NULL:2010/06/12(土) 02:51:54 ID:???
最初は二回に分けてたけど、レコードが数十万件あるから一回で済ましたほうが効率良いかと思いまして・・・

117 :NAME IS NULL:2010/06/12(土) 02:58:00 ID:???
>>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:2010/06/12(土) 03:18:13 ID:???
>>117
二つ流すのははっきり率悪いだろう・・・。

>>114
そのSQLでしょうがないんじゃね。

119 :NAME IS NULL:2010/06/12(土) 09:53:54 ID:d+6B+4E8
msdnで聞くのが吉
http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/threads

120 :NAME IS NULL:2010/06/12(土) 09:59:45 ID:???
すなおに二つにします。
皆さんありがとうございました

121 :NAME IS NULL:2010/06/12(土) 10:02:18 ID:???
あ、まだどっちがパフォ良いか試してないんでそれから検討します。

122 :NAME IS NULL:2010/06/12(土) 11:15:33 ID: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:2010/06/12(土) 11:32:54 ID:???
・まずACCESS文法って造語が意味分からない
・結果の2行目に"くくく"が表示されないのが意味分からない
・定数との外部結合をする意味がわからない
・行選択のための条件をWHERE句でなくON句で書く意味がわからない

124 :NAME IS NULL:2010/06/12(土) 11:39:04 ID:???
実行結果が(いいい,くくく)じゃ無いのはおかしくないか?
なにがしたいのか不明だ。どう上手くいかなかったんだよ
外部結合である必要ないんじゃないのか?

125 :NAME IS NULL:2010/06/12(土) 12:00:02 ID:???
>まず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:2010/06/12(土) 12:03:46 ID:???
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:2010/06/12(土) 12:22:16 ID:???
>>126
ありがとうございます
まあぶっちゃけ実行結果はどうでもよくてOracle形式と等価なmdb用SQLさえ
わかればよかったんで適当でした
すいません

ただFROM句に副問合せを含むとDAOからの実行が出来なくなる気が・・・
(似たようなSQLでmdbのSQLビューからは実行できたのにDAOからは出来なかったことあり)
ともあれありがとうございます
参考にします

128 :NAME IS NULL:2010/06/12(土) 12:32:52 ID:???
サンプルが不適切なんで要件が捻じ曲がった可能性があるけど
まあ質問者の自業自得だな

129 :NAME IS NULL:2010/06/12(土) 13:59:38 ID:???
つかそれなら本人がダメだったって言ってるSQLで行ける気がするんだがな

130 :NAME IS NULL:2010/06/13(日) 19:03:28 ID:???
alter tableで列にnot null制約を追加したいのですが、
modify 列名 データ型 not null
と、わざわざデータ型を入力しないと駄目なのでしょうか?
いちいちデータ型を記入するのは面倒なんですが

131 :NAME IS NULL:2010/06/13(日) 19:31:24 ID:???
少なくともOracleではデータ型は書かなくてもいいんだけど
DBMSは何なの?

132 :130:2010/06/13(日) 21:41:34 ID:???
>>131
mysqlを使っています

133 :NAME IS NULL:2010/06/13(日) 21:42:00 ID:bWmBmCbn
mysqlと見た

134 :NAME IS NULL:2010/06/14(月) 06:43:40 ID:???
>>121
そもそもそのSQLってしょっちゅう流すわけじゃないでしょ?
移行かなんかのバッチだよね。
もしそうなら、高々数十万件の更新の処理なんてバッチとしてはすぐ終わる部類だし、
せっせとCASE文書いて漏れがないかを検証する作業がもったいないと思わんかね。

135 :NAME IS NULL:2010/06/14(月) 07:22:12 ID:???
>>134
しょっちゅう流します

136 :NAME IS NULL:2010/06/14(月) 12:24:45 ID:???
>>135
設計見直した方がいいんじゃねえか

137 :NAME IS NULL:2010/06/14(月) 13:02:55 ID:???
どう見直すんだろw

138 :NAME IS NULL:2010/06/14(月) 13:45:08 ID:???
まあ、設計はスレ違いだし、提示されてない前提条件もあるのかもしれんが
たとえば
初めからCD1を分割しておけば、一部切り出して別コードにするなんて不要
毎回UPDATEしないで、UPDATE後の値を取得できるVIEWをつくるなりトリガで更新する
とか

139 :NAME IS NULL:2010/06/14(月) 19:08:55 ID:???
期間の抽出について相談です。

元情報
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:2010/06/14(月) 19:13:32 ID:???
追記、DBはOracle 11gです。

141 :NAME IS NULL:2010/06/14(月) 20:11:58 ID:???
こうかな?
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:2010/06/14(月) 20:47:22 ID:???
今気づいたけどサブクエリにしなくてもいいんだな
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:2010/06/14(月) 21:39:38 ID:???
○○idという列が主キーになる時が多いですが、
それ以外が主キーになる時ってあんまりないんですか?

144 :NAME IS NULL:2010/06/14(月) 22:18:35 ID:???
設計によりますが、
どの列も主キーになりうります。

145 :NAME IS NULL:2010/06/14(月) 22:23:46 ID:???
どっちかっつーと○○idという列は主キーにするために作ることが多いと思う
別にそうでなければならないわけではない

146 :143:2010/06/14(月) 22:37:51 ID:???
>>144-145
thx


147 :139:2010/06/14(月) 22:40:28 ID:???
>>142
thx
葉から根を参照するようにすればいいのか・・・。
根を基準に見ていたから気づかなかったよ

148 :NAME IS NULL:2010/06/15(火) 05:53:35 ID:???
すみません
SELECT user_id FROM member_m WHERE user_id = {$user_id} AND password = {$password}"

これはphpのソースなんですが
{ } は多分SQL側に渡されると思うのですが、なにか意味があるのでしょうか?


149 :NAME IS NULL:2010/06/15(火) 06:22:12 ID:???
>>148
すれ違いだか、{ } はSQL側へは渡らない。
$a="hoge";echo "a={$a}"; ってして見りゃわかる。
意味とか、その例だけだとプログラマ側の癖みたいなものだが、
詳しくはPHP関係のスレでどーぞ。

150 :NAME IS NULL:2010/06/15(火) 06:50:28 ID:???
>>149
ありがとうこざいます
perlだと ${a} だったので先入観がありましたorz

スレ違い申し訳ありませんでした


151 :NAME IS NULL:2010/06/16(水) 05:38:06 ID:???
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:2010/06/16(水) 06:24:09 ID:???
>>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:2010/06/16(水) 16:05:45 ID:???
>>152
ありがとうこざいます!


154 :NAME IS NULL:2010/06/18(金) 03:57:32 ID:???
質問です。
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:2010/06/18(金) 06:12:15 ID:???
>>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:2010/06/18(金) 07:14:01 ID:???
Oracleの場合はCONNECT BY
>>142を参考に、あと>>154の場合はSTART WITHも使う
詳しくは
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/queries.html#1719

157 :NAME IS NULL:2010/06/18(金) 07:44:54 ID:???
階層クエリって結構使うのかね。
練習になるからもっとこういう問題出して欲しいわw

158 :NAME IS NULL:2010/06/18(金) 08:06:43 ID:???
再起クエリってなんだよ > 俺 < 再帰クエリだった

>>157
部品展開とか、メールや掲示板のツリーとかぐらいしか思い浮かばん。
以前、隣接リストで入れ子集合やってみたけど、スッキリしなくてめんどいだけだった。
階層構造って、入力する人がどこに入れりゃいいのか迷うのよね。
最近ならタグ(ラベル)的扱いの方が、楽なのかも。

159 :NAME IS NULL:2010/06/18(金) 16:33:02 ID:DdYe8KWn
再帰SQLは、oracleの11gのR2から使えるそうだ。
11gのR1までは、階層問い合わせを使うしかない!!!

select 子部門ID
from テーブル
where 子部門の区分 = 0
start with 親部門ID= ある親部門ID
connect by prior 子部門ID= 親部門ID


ところで、これは参考になったお。
http://codezine.jp/article/detail/4847

160 :NAME IS NULL:2010/06/18(金) 18:31:37 ID:???
ID | mail
----------------------
というテーブルがあったとして複数のIDのmailを取得するには

where ID = '***' OR ID = '***'
と OR で繋げていくのでしょうか?

161 :NAME IS NULL:2010/06/18(金) 19:28:02 ID:???
その複数のIDはどこで定義されているんだ?

とりあえず ID in ('***','***', ... )とか
ID in (select ID from 条件のテーブル) みたいなやり方もあるぞ


162 :NAME IS NULL:2010/06/18(金) 19:46:55 ID:???
ありがとうこざいました!
IDは別テーブルです

163 :NAME IS NULL:2010/06/19(土) 01:03:48 ID:mva1Tcfi

Oracleなんですが下記のSQLが通りません。
問題は★部分で、ここのNVLを外すか、内部結合にすれば
通ります。

しかしNVLで変換は必要です。また外部結合にもできない。
どういうSQLを組み立てたら良いのでしょうか?

SELECT main.*, sub.*
FROM maintbl main
, subtbl sub
WHERE main.depertment = 'hogehoge'
 AND sub.fkey (+) = main.key
 AND NVL(sub.date,'20990101') (+) <= '20100510'(★)



164 :NAME IS NULL:2010/06/19(土) 07:57:26 ID:???
NVL(sub.date(+),'20990101') <= '20100510' じゃないのか?

165 :NAME IS NULL:2010/06/19(土) 08:12:41 ID:???
>>164
NVL部分にも(+)書かないと内部結合になっちゃうようです。

166 :NAME IS NULL:2010/06/19(土) 08:46:00 ID:???
>>163
>, subtbl sub

ここの部分を

, (SELECT fkey, NVL(sub.date,'20990101') AS date FROM subtbl) sub
にすりゃ通るだろうけど。

167 :NAME IS NULL:2010/06/19(土) 09:10:02 ID:mva1Tcfi
>>166
こんな感じですかね。

SELECT main.*, sub.*
FROM maintbl main
, (SELECT fkey,NVL(date,'20990101') as date FROM subtbl) sub
WHERE main.depertment = 'hogehoge'
 AND sub.fkey (+) = main.key
 AND sub.date (+) <= '20100510'

条件付けをしないでサブクエリを書いてしまっても、
速度的には問題ないのですかね?

今回の場合、fkeyにはindexが貼ってあるのですが、
サブクエリにしたテーブルをさらに結合した場合、
indexは有効なんでしょうか?




168 :NAME IS NULL:2010/06/19(土) 09:10:37 ID:???
内部結合になるって言う意味がわからん
どういうデータでどういう結果が欲しいんだ?

169 :NAME IS NULL:2010/06/19(土) 09:15:47 ID:???
なんで>>164じゃダメなのかワカンネ

それかもっと素直に
 sub.fkeyが存在しない場合は結果に含める
 sub.fkeyが存在してdateがnullの場合は含めない
 sub.fkeyが存在してdateがnullでない場合は'20100510'以下
ってことだとして最後の行を
 and (sub.fkey is null or sub.date <= '20100510')
にするとか

170 :NAME IS NULL:2010/06/19(土) 09:28:56 ID:???
パフォーマンス的なものは今どきのDBMSなら意外とうまくやってくれることが多いけど
実際にプラン見てみないと分からんね

171 :NAME IS NULL:2010/06/19(土) 09:29:58 ID:???
>>167
テーブル側のカラムに関数をかましてる時点で(NVL(date,'20990101')のこと)
subtblの全レコードを舐めるのが確定なので、FROM句サブクエリ、WHERE句サブクエリとも速度には期待できない。

172 :NAME IS NULL:2010/06/19(土) 09:48:06 ID:???
>>164
すいません、詳細を見落としていました。

NVL(sub.date(+), ・・・
なんですね。
こんな書き方もあるんですか。

NVL(sub.date,'20990101') (+) <= '20100510'
これは試して内部結合になっちゃったのは確認したのですが
>>164さんのやり方はまだ試してないです。

>>171
sub.fkeyはPKになっていて、これだけで
一意に定まるんですよ。あとは、そのレコードが有効か
無効かを日付で判断したいだけです。
それでも全件検索になるんですかね?


173 :NAME IS NULL:2010/06/19(土) 10:28:42 ID:???
それじゃ AND sub.fkey (+) = main.key の(+)はどういう意味なんだよw

174 :NAME IS NULL:2010/06/19(土) 10:47:26 ID:???
だから、どういうデータでどういう結果が欲しいんだ
ちょっと例だして書いてみろよ
内部結合になるとか意味不明だぞ

175 :NAME IS NULL:2010/06/19(土) 10:59:20 ID:???
てか結合条件と検索条件の区別がついてない?
Oracle記法じゃなくてOUTER JOIN ・・ ON ・・ WHEREでやりたい事を書き直してみ。

176 :NAME IS NULL:2010/06/19(土) 11:14:32 ID:???
まあそんな感じか
外部結合した上でその行を全部はじく検索条件書いてその結果だけみて
内部結合になってると言ってると予想

そもそも
NULL <= '20100510' は成立しないし
'20990101'<= '20100510' も成立しないんだが
NVL(sub.date,'20990101')<= '20100510'な理由もわからん
sub.date <= '20100510' でいいんじゃないか

177 :NAME IS NULL:2010/06/20(日) 17:47:01 ID:Pj6iNEOz
質問させてください。

・DBMS名とバージョン
MySQL 5.0.27-1

・テーブルデータ
DATE    | DATA
------------+----------
2010-06-01 | aaa
2010-06-02 | bbb
2010-06-03 | ccc
2010-06-04 | ddd
2010-06-05 | eee
2010-06-06 | fff
2010-06-07 | ggg

・欲しい結果
最新3件を昇順で。
DATE    | DATA
------------+----------
2010-06-05 | eee
2010-06-06 | fff
2010-06-07 | ggg

・説明
select DATE, DATA from TABLE order by DATE desc limit 3;
とすれば、最新3件を降順で取得できますが、
できれば降順でなく昇順で最新3件を取得したいです。

178 :NAME IS NULL:2010/06/20(日) 18:01:55 ID:???
も一度ソートすればいいだけじゃないの?

179 :NAME IS NULL:2010/06/20(日) 18:22:42 ID:???
MySQLで未検証だけど、SELECT * FROM (そのSQL) ORDER BY date とか

180 :NAME IS NULL:2010/06/20(日) 19:33:10 ID:???
select * from
(select DATE, DATA from TABLE order by DATE desc limit 3) t
order by DATE;


181 :177:2010/06/20(日) 23:41:17 ID:Pj6iNEOz
>>178-180
ありがとうございます。select結果をselectし直す方法でうまくいきました!ありがとうございます

182 :NAME IS NULL:2010/06/21(月) 01:29:44 ID:???
SELECTやFROMのようなキーワードを大文字、
テーブル名やカラム名を小文字
で書くように学んだけど、
>>180みたいにその逆の書き方をするのは何か意味があるの?

183 :NAME IS NULL:2010/06/21(月) 01:33:32 ID:???
大文字より小文字のほうが見やすい
ならたくさんある方を小文字にすれば、見やすいってことだ


184 :NAME IS NULL:2010/06/21(月) 03:44:13 ID:???
大文字はうるさいよ

185 :NAME IS NULL:2010/06/21(月) 06:31:06 ID:???
>>182
カラム名を大文字表記で定義してるからでしょ。

186 :NAME IS NULL:2010/06/21(月) 06:33:23 ID:???
>>183-185
オッケーわかった、ありがとう

187 :NAME IS NULL:2010/06/21(月) 06:41:48 ID:???
DATEとか予約語だしなw

188 :NAME IS NULL:2010/06/24(木) 01:30:52 ID:???
学校でSQLの授業とっててこんな問題が出たけど理解不能だったんで助けてくだしあ。
どなたかお願い致します。

全くもって意味が分からなかった\(^o^)/
コンピュータの意味処理ってどういう意味なんですかねぇ・・・

>XMLについて、その概要をコンピュータの意味処理という視点から書いて下さい。
>また、実際にどのような分野で使われていますか?
>具体例を一つあげて説明してください。

XMLスレで聞こうと思ったら最終書き込みが2009年とか見てスッ、って帰ってきた。

189 :NAME IS NULL:2010/06/24(木) 01:48:24 ID:???
意味は意味解析や構文解析でぐぐれ。
あとSQL質疑応答とXMLはカスリもしてないw
というかXMLとデータベースが全く関係ないのでこんな過疎板の過疎スレでなくてプログラミング板にでもいくといい。w

190 :NAME IS NULL:2010/06/24(木) 02:32:07 ID:???
意味処理って単語は初めて聞いたな。
まあスレチ

191 :sage:2010/06/24(木) 07:25:52 ID:S+fksH8m
>>189
あとSQL質疑応答とXMLはカスリもしてないw <- 真.
というかXMLとデータベースが全く関係ないので <- 偽.


192 :NAME IS NULL:2010/06/24(木) 07:30:29 ID:???
いや、関係ないだろ。

193 :NAME IS NULL:2010/06/24(木) 07:41:43 ID:???
>>191
データ保持の実装がXMLだろうが実ファイルだろうが関係なかろう。
RDBのスレでOSのファイルシステムについての質問はありなのか?

194 :NAME IS NULL:2010/06/24(木) 08:11:23 ID:???
質問自体はスレチつうより板違いだろうけど、
「XMLとデータベースが全く関係ない」と言い切るのはおかしいだろ。

>>193
データベースに適したFSは? とか、データベース専用FSについて
なんてのはありなんじゃね。

195 :NAME IS NULL:2010/06/24(木) 08:12:02 ID:???
EsTerra

196 :NAME IS NULL:2010/06/24(木) 22:49:04 ID:???
ほとんど関係ない。でいいよ。スレ違いだから、この話題はそろそろ終了な。

197 :NAME IS NULL:2010/06/25(金) 22:07:41 ID:???
・DBMS名とバージョン
VB2008でOLEDBを使ってOracle10gに繋いでます。

・テーブルデータ
どの部品にはどの部品が使われてて〜といううような、
部品の構成を表す、下記のような親子関係と必要数のテーブルがあります
-------------
OYA KO KAZU
-------------
A   B  1
A   G  1
B   C  1
B   F  1
C   D  1
C   E  1
G   C  2
G   H  1


ツリーで表記すると、
A
├B
│├C
││├D
││└E
│└F
└G
 ├C
 │├D
 │└E
 └H

Aという部品は、BとGの部品で出来ている。
Bという部品はCとFの部品で出来ている〜という感じです。

・欲しい結果
これを階層のレベルと、それぞれの子の合計数を出したい。
ここでいうBの下のCは1なので、DもEも1だが、
Gの下のCは2なので、DもEもx2されて2になる
----------------
LV KO  GOUKEI
----------------
1  B   1
2  C   1
3  D   1
3  E   1
2  F   1
1  G   1
2  C   2
3  D   2
3  E   2
2  H   1


今は、プログラム側で親から子を見る所をサブルーチンで組み、回帰処理でループさせてるので、
リクエストが多く、あまりにも酷いかなぁ。。。と。
色々サンプルを見てconect byとかよく似てるんで、何かやり方があるのかな?と思い質問してみました。

198 :NAME IS NULL:2010/06/25(金) 22:31:19 ID:???
答えじゃないけど、

>回帰処理でループさせてるので

「再帰」な。

199 :NAME IS NULL:2010/06/25(金) 22:34:28 ID:???
これでGOUKEIの結果をアプリ側で演算する・・・とか?(格好悪っ)

select level as LV
,    KO
,    sys_connect_by_path(KAZU, '*') as GOUKEI
from  TableName
start with OYA = 'A'
connect by prior KO = OYA
;

200 :NAME IS NULL:2010/06/25(金) 23:06:47 ID:???
JDK1.4とオラクル9iです

TESTのテーブルから下の結果を得たいのですが可能でしょうか?

1カラム目はIDで
2カラム目は開始日で
3カラム目は終了日です


テーブルTEST
a,20110403,20110611
b,20110505,20110721

結果
a,201104
a,201105
a,201106
b,201105
b,201106
b,201107

201 :NAME IS NULL:2010/06/25(金) 23:09:59 ID:???
不可能とは言いませんがアプリ側でやったほうがいいです

202 :200:2010/06/26(土) 00:56:49 ID:???
>>201
レスありがとうございます。

方法を教えてもらいたいです。



203 :NAME IS NULL:2010/06/26(土) 02:13:51 ID:???
SQLはデータを生成するためのものではありません
やっぱりこれFAQに入れようぜ

204 :NAME IS NULL:2010/06/26(土) 08:18:42 ID:???
>>200
Javaでしょ?
20110403、20110611を日付変換して
FOR 201104 TO 201106 EACH 1 MONTH
とかでいいんじゃない

205 :NAME IS NULL:2010/06/26(土) 08:45:51 ID:???
>>202
select distinct ID
,        to_char(add_months(to_date(substr(開始日, 1, 6), 'YYYYMM'), level - 1), 'YYYYMM')
from TEST
connect by add_months(to_date(substr(開始日, 1, 6), 'YYYYMM'), level - 1) <= to_date(substr(終了日, 1, 6), 'YYYYMM')
order by 1,2
;
テーブルの規模によっては非常に残念なパフォーマンスになると思う

206 :NAME IS NULL:2010/06/26(土) 14:44:02 ID:???
>>53,>>55あたりを参考にFAQ書いてみた

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

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

   20100601
   20100602
    ・
    ・
    ・
   20100630

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

どうしてもやりたければ以下のような方法もなくはないですが、
これを見て意味が分からない人は使わないほうが良いでしょう。
(意味が分かる人はなおさら使いません。)

select to_char(to_date('201006', 'YYYYMM') + NUM, 'YYYYMMDD')
from (select row_number() over (order by 1) - 1 as NUM from all_catalog)
where to_date('201006', 'YYYYMM') + NUM < add_months(to_date('201006', 'YYYYMM'), 1)
;

select to_char(to_date('201006', 'YYYYMM') + level - 1, 'YYYYMMDD')
from dual
connect by to_date('201006', 'YYYYMM') + level - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※後者はOracle限定です。他のDBMSの場合はconnect byの代わりに
 再帰問合せを使えばできるかもしれません。

207 :NAME IS NULL:2010/06/26(土) 15:12:13 ID:???
初心者なんですけど、エラーを調べるコマンドってありますか?

208 :NAME IS NULL:2010/06/26(土) 15:23:24 ID:???
マニュアル見ればいいじゃない

209 :NAME IS NULL:2010/06/26(土) 15:27:10 ID:???
>>206
後半のどうしてもってとこのSQLいらなくね?

どうしてもやりたいなら再帰SQLでできなくもないです
ぐらいでいいと思う

>後者はOracle限定
前者もall_catalogが存在して必要な行数以上の行をもってないと無理
実質ORACLE専用だろ
ダミーテーブルと結合させるのはSQLの手段としては間違ってると思う

210 :NAME IS NULL:2010/06/26(土) 16:05:34 ID:???
いらんよね。逆に、>>206の通りにやったけどできません、とか
MySQLで同じことするにはどうすればいいですか?なんて
質問が出そう。

211 :NAME IS NULL:2010/06/26(土) 16:07:34 ID:???
ちょっと修正した

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

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

   20100601
   20100602
    ・
    ・
    ・
   20100630

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

どうしてもやりたければ以下のような方法もなくはないですが、
こんなSQLを書いているとセンスを疑われます。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
 微妙なところでしょう。)

select to_char(to_date('201006', 'YYYYMM') + NUM, 'YYYYMMDD')
from (select row_number() over (order by 1) - 1 as NUM from all_catalog)
where to_date('201006', 'YYYYMM') + NUM < add_months(to_date('201006', 'YYYYMM'), 1)
;

select to_char(to_date('201006', 'YYYYMM') + level - 1, 'YYYYMMDD')
from dual
connect by to_date('201006', 'YYYYMM') + level - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※いずれの例もOracleの場合です。
 他のDBMSの場合でもどのみちお奨めしません。

212 :NAME IS NULL:2010/06/26(土) 16:39:34 ID:???
俺も別に要らんと思うが、WITH RECURSIVEなら! と思ってみたがLIMIT付けないと無限ループする。
LIMITクエリって相変わらず処理系依存? 以下、PostgreSQL用

WITH RECURSIVE Temp(datedata) AS
(SELECT to_timestamp('201006','YYYYMM')
UNION ALL
SELECT datedata+interval'1 day' FROM Temp)
SELECT to_char(datedata,'YYYYMMDD') FROM Temp
LIMIT EXTRACT(day FROM to_timestamp('201006','YYYYMM')+interval'1 month -1 day');

>>211にも書かれてあるが、PostgreSQLならgenerate_seriesを使った方が楽。
ま、こんなのも出来るって参考程度に。


213 :NAME IS NULL:2010/06/26(土) 17:20:50 ID:???
LIMITじゃなくて普通にWHEREじゃダメなのか?

214 :212:2010/06/26(土) 18:05:55 ID:???
>>213
可能だった。

WITH RECURSIVE Temp(datedata) AS
(SELECT to_timestamp('201006','YYYYMM')
UNION ALL
SELECT datedata+interval'1 day' FROM Temp WHERE datedata <to_timestamp('201006','YYYYMM')+interval'1 month -1 day')
SELECT to_char(datedata,'YYYYMMDD') FROM Temp

そうか、最後の行にWHERE句ではなくて、再帰される分のところに入れりゃいいのか。

>>200は9iだそうなのでWITH RECURSIVEがつかるのかな、
でもその質問でWITH RECURSIVEをつかった解はまだわからない。

215 :212:2010/06/26(土) 18:17:40 ID:???
でけた。

WITH RECURSIVE Temp(mark,startdate,enddate) AS
(SELECT mark,startdate,enddate FROM testtable
UNION ALL
SELECT mark,(startdate+interval'1 month')::date,enddate FROM Temp
WHERE date_trunc('month',startdate)<date_trunc('month',enddate))
SELECT mark,to_char(startdate,'YYYYMM') FROM Temp ORDER BY mark;

date_truncってひょっとしてPostgreSQL依存な関数をつかっているが、
Oracleにも似たような関数あるっしょ。

216 :212:2010/06/26(土) 18:24:38 ID:???
> (startdate+interval'1 month')::date
PostgreSQL表記がここにも残っていた。
DATE型+INTERVAL型=TIMESTAMP型になるので、DATE型にキャストしている。
startdateがTIMESTAMP型ならキャスト不要。
他なら、適当にキャスト演算子or関数つかってくれ。

連投スマソ

217 :NAME IS NULL:2010/06/26(土) 18:31:31 ID:???
Oracleでwithを使った再帰問合せが書けるのは11g(R2?)からかな
recursiveキーワードはつけない(というかキーワードじゃない)
日付の演算も違うけど面倒臭いんで書かない

218 :197:2010/06/26(土) 22:42:12 ID:???
>>198
再帰デスね、、寝ぼけてました。。

>>199
ありがとうございます。
参考にさせてもらいますー。

219 :212:2010/06/26(土) 23:36:59 ID:???
>>217
わりぃ、上で出ていたけど、アルファベット表記のところしか覚えてなかった。
g->h->i でiの方が新しいと思ったが、9iと11g-R2じゃ11g-R2の方が新しいんだね。

ところで、WITH RECURSIVEが使えるOracleで比較的簡単そうな以下のようなSQLでもダメなの?
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100)
SELECT sum(n) FROM t;
--PostgreSQLのマニュアルより

220 :NAME IS NULL:2010/06/26(土) 23:56:40 ID:???
>>219
ダメなの?って11gなら通るよ。
ただしrecursiveキーワードは要らないのと
valuesを使ったTable Value Constructorは使えない。

WITH t(n) AS (
SELECT 1 FROM DUAL
UNION ALL
SELECT n+1 FROM t WHERE n < 100)
SELECT sum(n) FROM t;

221 :212:2010/06/27(日) 00:14:52 ID:???
>>220
サンクス。
なるほど、そういうことなのね。

222 :211:2010/06/27(日) 21:29:59 ID:???
さらに修正した
(ダミーテーブルを使うのはいくらなんでもアレなのでボツ、
 代わりに再帰問合せにした)

(問)
年月(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)
;

select to_char(to_date('201006', 'YYYYMM') + level - 1, 'YYYYMMDD')
from dual
connect by to_date('201006', 'YYYYMM') + level - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※いずれの例もOracleの場合です。(前者は11gR2以降)
※再帰問合せをサポートするDBMSなら前者を適当に改変すれば動きますが
 どのみちお奨めしません。

223 :NAME IS NULL:2010/06/27(日) 21:51:11 ID:jCqDQodk
これでいいじゃん

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

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

   20100601
   20100602
    ・
    ・
    ・
   20100630


224 :NAME IS NULL:2010/06/27(日) 21:53:35 ID:jCqDQodk
コピペ失敗した

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

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

   20100601
   20100602
    ・
    ・
    ・
   20100630

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

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

225 :222:2010/06/27(日) 22:13:38 ID:???
ちなみにSQLサンプルを残した理由は
・可能であるものをわざわざ隠す必要もないので
・「再帰問合せを使って書くってどうやるんですか?」と聞かれるのが一番ウザいので
・FAQに再帰問合せのサンプルがないので
 (そしてわざわざ再帰問合せのFAQを捏造するのもアレなので)
・せっかく書いたので ←実は最大の理由

226 :NAME IS NULL:2010/06/27(日) 22:25:17 ID:???
withはともかく、connect byみたいな特定のDBMSに強く依存するものをテンプレに乗せるのはどうなんだ

227 :222:2010/06/27(日) 22:40:11 ID:???
確かにそれは一理あるね
connect byのほうはなくてもいいかも

そういう意味では日付演算もDBMSにかなり依存するんで
問いの選び方としてイマイチっちゃイマイチなんだけど
実際に多い問いなんでこれはしょうがないな

228 :NAME IS NULL:2010/06/27(日) 23:25:07 ID:???
俺的にはテンプレならありなんだけどな。> 処理系依存
>>4も処理系によってはもっと簡素に書けるわけだし、ひとつのDBMSだけじゃなくて
汎用、Oracle、MS-SQL、PostgreSQL、MySQL.... って並んでると便利かも。
ただ、テンプレが太ってしまうので、どこかWikiなんぞに書ければいいが。

229 :NAME IS NULL:2010/06/29(火) 02:42:30 ID:???
質問です。
今から11gのbronzeやりはじめようこてこての初心者なんですが
11gインスコしてもSQL plusが起動しません。
実行したら一瞬SQL plusの画面がふわっと出てすぐ消えちゃいます。

補足
・インストールは警告無視してました。
・OSはVistaのビジネス(対応してる)
っス。よろしくおながいするッス

230 :NAME IS NULL:2010/06/29(火) 06:06:33 ID:???
>>229
スレ違い

231 :NAME IS NULL:2010/06/29(火) 07:20:08 ID:gwfYytti
tbl1にnum1,num2,id1,id2,id3
tbl2にid,name,ssというフィールドがあるとして
SELECT name, num1, num2, id1, id2, id3, time FROM tbl1, tbl2
WHERE num1 = 1
AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga")
上記のようなSQLを
特定のフィールドが他の行と重複してたら抜かすというのはどうやればいいでしょうか?
単にdistinctつけるだけだとどれかひとつでも重複していなかったら抽出されますよね。
id1,id2,id3が他のレコードのid1,id2,id3と重複してたら
検索結果に入れないみたいな感じにしたいのですが。
MYSQLです。

232 :NAME IS NULL:2010/06/29(火) 07:27:15 ID:???
>>231
まずtbl1とtbl2をクロス結合してるところで要件ミスか実装ミスの可能性大。

>>229
コマンドプロンプトを起動してからsqlplusを叩いてエラーメッセージを見れ。
あと仮想マシンでいいからLinuxいれろ。

233 :NAME IS NULL:2010/06/29(火) 13:34:11 ID:gwfYytti
>>232
レスありがとうございます。
えと、AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga")の部分で内部結合のつもりなんですが
tbl1.id1 = tbl2.id
もつけないといけないんでしょうか。
あと、要件ミス、実装ミスってことは、そういう重複の取り除き方はありえないってことでしょうか?


234 :NAME IS NULL:2010/06/29(火) 13:46:03 ID:gwfYytti
すいませんなんか難しく考えていましたがGROUP BYでいいんですね・・・

235 :NAME IS NULL:2010/06/29(火) 14:22:39 ID:???
できたようでよかった。
その質問をするときは重複判定しないカラムの扱いも書いとかないと困るよ。

236 :NAME IS NULL:2010/06/29(火) 22:49:22 ID:???
カレンダー作るのってアンチ多いのね。
カレンダーテーブルを作るとしても大して変わらないだろ。

237 :NAME IS NULL:2010/06/30(水) 14:58:43 ID:vqtVeRmY
すいません、初心者なのですが教えてください。
sqlplusにて
SQL>!ls
と打つと「ls」コマンドが実行されると思うのですが、
自宅のPCに、書籍の付録のオラクルをインストールして実行しても「SP2-0042:不明なコマンドです」
と言われてしまいます。
「!」を認識させるにはどのようにすれば良いのでしょうか?

238 :NAME IS NULL:2010/06/30(水) 15:50:59 ID:???
>>237
スレ違いだが。

! は、Unix(Linux)の場合のみ使える。
Windowsの場合は、$
どちらも、hostコマンドの省略形。

239 :NAME IS NULL:2010/06/30(水) 16:10:23 ID:???
おまけにwinだったら、ふつうはlsは入ってないわな。

240 :NAME IS NULL:2010/06/30(水) 16:44:43 ID:???
>>238
ありがとうございました。出来ました。

241 :NAME IS NULL:2010/06/30(水) 17:02:04 ID:???
Powershell経由で起動してたら、lsあるな。

242 :NAME IS NULL:2010/06/30(水) 22:08:37 ID:???
vistaからls使えた気がする

243 :NAME IS NULL:2010/07/04(日) 12:13:46 ID:???
すみません質問です。
Accessのクエリで

SELECT CASE pref_name
WHEN '徳島' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
ELSE 'その他' END AS district,
SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
WHEN '徳島' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '高知' THEN '四国'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
ELSE 'その他' END;
というSQLを実行したいのですが、構文エラーとなってしまいます。
SQLの達人という参考書からそのままコピッただけのなので、
普通に考えてエラーが出るはずがないのですが、どうでしょうか??
助けてくださいお願いいたします。

244 :NAME IS NULL:2010/07/04(日) 12:21:24 ID:???
AccessのSQLでは、Case Whenが使えない。IIfとかで代用しろ

245 :NAME IS NULL:2010/07/04(日) 12:42:30 ID:???
>>244
そうなんですかぁ。。。
素早い回答どうも有り難うございました!

246 :NAME IS NULL:2010/07/04(日) 20:54:07 ID:???
主キーってインデックスが自動的に作成されるって書いてるけど、実際はインデックスを明示して作らない速くならない様なんだけど本当のところはどうなの?

247 :NAME IS NULL:2010/07/04(日) 20:58:27 ID:???
DB次第。SQL には関係ないからスレ違いだな。

248 :NAME IS NULL:2010/07/05(月) 22:22:34 ID:03f+1PMv
TABLE test
id | data
---+------
100 | AAA

TABLE hoge
id | value
---+------
100 | 10
100 | 20

TABLE 100
id |val1| val2
---+---+----
100 | 20 | 40
100 | 30 | 60

SELECT a.id, test.data, a.cnt + b.cnt + c.cnt
FROM
(SELECT id, SUM( aa.val1 ) cnt FROM (SELECT id, val1 FROM `100`)aa)a,
(SELECT id, SUM( bb.val2 ) cnt FROM (SELECT id, val2 FROM `100`)bb)b,
(SELECT id, SUM( value ) cnt FROM hoge WHERE id = 100)c,test
WHERE a.id = c.id AND test.id = 100

欲しい結果
id data a.cnt + b.cnt + c.cnt
----------------------------
100 AAA 180

やむなくMySQLのバージョンが5.0.77-logから5.1.22-rcに変更することになり、
5.0.77-logで動作していた上記のSQLを実行すると
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
と怒られてしまいます。。。
今も色々試しているのですがGROUP BYをうまく使えません。
申し訳ないのですが教えて頂けませんか><

249 :NAME IS NULL:2010/07/05(月) 22:27:22 ID:???
idがuniqueじゃないのって初めて見た・・・

250 :NAME IS NULL:2010/07/05(月) 22:36:01 ID:???
>>249
色々省略してます><

251 :NAME IS NULL:2010/07/05(月) 23:15:14 ID:???
>>248
test.id = hoge.id = `100`.id で連結してvalueとval1,val2を全て合計するってことでいいのかな?

SELECT test.id,test.data,T1.cnt+T2.cnt FROM test JOIN
(SELECT id,SUM(val1)+SUM(val2) AS cnt FROM `100` GROUP BY id)AS T1 ON test.id = T1.id JOIN
(SELECT id,SUM(value) AS cnt FROM hoge GROUP BY id )AS T2 ON test.id = T2.id WHERE test.id = 100;

テーブル名に`100`ってしているから、実使用とは意味が違うSQLになっているかもしれん。

252 :NAME IS NULL:2010/07/05(月) 23:15:45 ID:???
>(SELECT id, SUM( aa.val1 ) cnt FROM (SELECT id, val1 FROM `100`)aa)a,
                          ↑
ここの部分のサブクエリはなんか意味あるのか?

253 :NAME IS NULL:2010/07/06(火) 00:17:02 ID:???
どうやったらこんなテーブル構造になるのかが不思議だ

254 :NAME IS NULL:2010/07/06(火) 00:32:16 ID:???
>>251
ありがとうございます><
欲しい結果を得ることが出来ました!

>>252
まったくその通りですね、大切な部分を省略してしまいました。。。
実際は日付で降順ソートして上位100件の合計値が欲しかったのです。

SELECT test.id, test.date, T1.cnt + T2.cnt
FROM test JOIN
(SELECT id, SUM( VC.val1 ) + SUM( VC.val2 ) AS cnt FROM (SELECT id, val1, val2 FROM `100` ORDER BY date DESC LIMIT 100) AS VC GROUP BY id) AS T1 ON test.id = T1.id JOIN
(SELECT blog_id, SUM( value ) AS cnt FROM hoge WHERE id = 100 GROUP BY id) AS T2 ON test.id = T2.id
WHERE test.id = 100;

>>253
恥ずかしいです><
でも実際はもう少しちゃんとした構造だと・・・思いますよ!w

皆様ありがとうございました。

255 :NAME IS NULL:2010/07/06(火) 16:10:21 ID:wdn3FAny
同一テーブルで、自分自身を除く前回の履歴を結合したいです
SQLServer2005

設備
X

生産履歴
履歴ID 設備 製造ロット ロット枝番 状態
10 X 002 2  生産中
09 X 002 1  完了
08 X 001 1  完了

設備と生産履歴から設備稼働状況を表示
SELECT * FROM 設備
LEFT OUTER JOIN 生産履歴
ON 設備.設備=生産履歴.設備
AND 生産履歴.状態='生産中'

設備稼働状況 ※これに前回ロットを表示したい。
設備  製造ロット ロット枝番 前回ロット
X 002     2 001

製造ロット002が完了したら
設備 製造ロット ロット枝番 前回ロット
X NULL NULL 002
となる。


LEFT OUTER JOIN
SELECT MAX(製造ロット) AS MAX製造ロット
FROM 生産履歴 生産履歴前回
WHERE 製造ロット<>生産履歴.製造ロット※2
GROUP BY 設備

※2で引っかかる。
どなたか回答よろしくお願いします。

256 :NAME IS NULL:2010/07/06(火) 17:22:49 ID:???
>>255
「ひとつの設備に対して生産中の履歴は最大でひとつ」ということにして

SELECT *,(SELECT MAX(製造ロット) FROM 生産履歴 WHERE 設備=T1.設備 AND COALESCE(ロット<T2.ロット,TRUE) AS 前回ロット
FROM 設備 AS T1
LEFT JOIN (SELECT * FROM 生産履歴 WHERE 状態='生産中') AS T2 ON T1.設備=T2.設備;

で、いけるかな? SQL鯖で動くかどうかはしらね。

257 :NAME IS NULL:2010/07/07(水) 00:44:11 ID:???
>>255
別解
SELECT
E.設備,
(select MAX(製造ロット) from 生産履歴 group by 設備) AS 製造ロット
,P.ロット枝番,
(MAX(p.ロット枝番) over(partition by E.設備,P.製造ロット)) -1 AS 前回ロット番号
FROM 設備 E LEFT OUTER JOIN 生産履歴 P ON E.設備= P.設備
AND P.状態='生産中

ただしMSSQL2008で。
2005でover句が使えるかは知らん。

258 :NAME IS NULL:2010/07/07(水) 04:02:32 ID:???
>>255
前回ロットの定義があいまいだが
生産中でない製造ロットの最大値でいいのか?
それなら
SELECT *,
(SELECT MAX(製造ロット) from 生産履歴 where 設備=T.設備 and 製造ロット<>T.製造ロット) as 前回ロット
 FROM 設備
LEFT OUTER JOIN 生産履歴 T
ON 設備.設備=T.設備
AND T.状態='生産中'
でいいんじゃね?
前回ロットは履歴IDを見てとか言うなら2行目を適当に

259 :259:2010/07/07(水) 04:14:54 ID:???
ああ、違う
SELECT *,
(SELECT MAX(製造ロット) from 生産履歴 where 設備=S.設備 and 状態<>'生産中') as 前回ロット
 FROM 設備 S
LEFT OUTER JOIN 生産履歴 T
ON S.設備=T.設備
AND T.状態='生産中'
こっちで

260 :259:2010/07/07(水) 04:21:15 ID:???
>>259の名前は258で...
TV見ながらやるとミスだらけだなorz

261 :NAME IS NULL:2010/07/07(水) 06:48:31 ID:???
>>259
それは枝番違いが引っかかるから明確にNG。

俺も考えたけど>>256で正解と思う。
これの面倒なのは最新が生産中の時と完了の時とで前回ロットの取り方が違うことだよな
・・COALESCEでの回避は、こんなとこにロジック埋めこんでいいのか悩む。

262 :NAME IS NULL:2010/07/07(水) 07:22:50 ID:???
IF文で数値以外っていう条件にしたいんだけど、どう指定するのが良いの?

263 :NAME IS NULL:2010/07/07(水) 09:19:58 ID:???
IF文って?w

264 :NAME IS NULL:2010/07/07(水) 15:48:25 ID:???
それは数字のみで構成された文字列かどうかの判断をしたいということ?

>>263
IF文知らないの?スレ違い感は否めないけど。

265 :NAME IS NULL:2010/07/07(水) 20:40:02 ID:???
>>261
自演?動かないだろこれ。

266 :263:2010/07/07(水) 21:03:04 ID:???
あースマンPL/SQLってここ駄目なの?

聞きたかったのは、たとえばだけどselectで取ってきたものを数値か文字列かで
結果を分岐させたいんだけど、条件をどうすれば数値か文字列か判断できるのか
わからんかったんだわ。

267 :NAME IS NULL:2010/07/07(水) 21:17:20 ID:???
>>264
俺は263じゃないが、ここSQLスレだしな
俺はSQLのIF文はしらない

>>265
ためして無いけど、COALESCE使えて真偽値返すDBなら動くような気はする
トリッキーだけどよく考えたコードだと思う
と思って良く見たら、ASの前に閉じかっこが1個ぬけてるな

まあ、なんにせよ、JOINしてるテーブルに別名つけて、セレクトリストに
カッコつきで単一行返す相関クエリ書けばできるんじゃないかと

268 :NAME IS NULL:2010/07/07(水) 21:47:52 ID:???
COALESCE(ロット<T2.ロット,TRUE) のとこを
ロット<COALESCE(T2.ロット,'DUMMY') とかすりゃどこでも動く

カッコが足りないから動かない(キリッ じゃ勉強不足だぞ

269 :256:2010/07/07(水) 22:11:31 ID:???
ほんとだ、括弧が足りない...orz
COALESCEもCOALESCE(製造ロット<T2.製造ロット,TRUE)だったな。

>>267
ここのスレにいると、結構トリッキーなSQLでないと解けない場合が多い気がする。
COALESCEをこんな使い方したのも初めてだしw
頭の体操ってことで、結構好きなんだけどね。

>>268
ダミー文字列とか99999みたいな数値を使うのが嫌でCOALESCE(ロット<T2.ロット,TRUE)を思いついたが、
CASE文とかDB依存関数なんてのもありってことで。

270 :NAME IS NULL:2010/07/07(水) 23:05:31 ID:???
SQLServerなら>>268のいう
ロット < COALESCE(T2.ロット,'DUMMY')が正解。TRUEなんてかけるの?

271 :256:2010/07/08(木) 00:05:22 ID:???
少なくともPostgreSQLなら書ける。
しかし、後ろのTRUEで引っかかるのか?
手前の条件の方がダメなのかと思ってたわ。
あえて括弧でくくって、COALESCE((ロット<T2.ロット),TRUE)でも無理なのかな?
あとは、CASE文を試してみるとか、
CASE WHEN T2.ロット IS NULL THEN TRUE WHEN ロット<T2.ロット THEN TRUE ELSE FALSE END

272 :NAME IS NULL:2010/07/08(木) 02:39:46 ID:???
>>266
正確に書かないからだよ
PL/SQLだってことすら書いてないからな
DBMSはORACLEで
selectで取ってきたものってのが
VARCHAR2型であったとして(仮定が多いな)

if replace(translate(data,'1234567890','0000000000'),'0') is null then
数値の処理
else
文字の処理
end if;

もっとスマートな方法があるかもしれんが
こんなところでいかが?

273 :NAME IS NULL:2010/07/08(木) 10:41:53 ID:???
>>270-271
それが動く前提は、>>267で言う真偽値返すってとこだな
PostgreSQLは論理値データ型ってのがある。TRUEはこの型として判定されてるはず

>>266,272
オラクルでPL/SQLなら、TO_NUMBERしてエラー出るかどうか見ればいいんじゃね
まあ、PL/SQLはオラクル固有なんで、オラクル関係のスレで聞けってことかと

274 :NAME IS NULL:2010/07/09(金) 00:54:55 ID:BIBrIfiz
・DBMS名とバージョン
postgres sql

・テーブルデータ
2010/06/10,20:30
と格納されている、varchar型列

・欲しい結果
[2010/06/10],20:30
とUPDATEするバッチを作成する。

・説明
上記処理を実行するバッチ処理をフルスクラッチで作成します。
UPDATE文の書き方は判るのですが、どういう設計にしようか迷っています。

自分が最速で実装するなら、.net使って書くのですが、いかんせん仕事でして
今後の保守性を考えるとExcelマクロでSQLファイルを生成してデータバッチを
出力するようにした方がいいのでしょうか?

有識者に聞けということなんでしょうけど、いかんせん一人だけの仕事でして
実装方法で迷っています。

275 :NAME IS NULL:2010/07/09(金) 01:19:15 ID:???
>>274
スレ違い。PostgreSQLスレで聞いても違うっぽい気がする。
保守性なんて、運用する会社や担当者のレベルで考え方違うだろうし、
そもそもなんで、時刻をvarcher型で入れてるの? って話になる。
素直にtimestamp型にして取り出すとき摘便に書式を変えればいい。

ちなみに、挙げられたデータと欲しい結果だけ見れば、UPDATE一文で済んで不変。
そこに仕事とか、保守性云々がどう絡むのか、うまくつかめません。

276 :NAME IS NULL:2010/07/09(金) 16:16:58 ID:01dNrJEc
MySQL5を使用しています。


以下のようなテーブルがあります。

itemテーブル
item_id name color
1 商品1 3
2 商品2 12
3 商品3 7

colorテーブル
color_id name
1 赤
2 青
4 緑
8 黒

item.colorの部分は、ビット演算の概念を使って
3なら赤+青
12なら緑+黒
7なら赤+青+緑
の色を持っていることを意味します。

これを結合の段階で、以下のように色名を取得することは可能なのでしょうか?

1 商品1 赤
1 商品1 青
2 商品2 緑
2 商品2 黒
3 商品3 赤
3 商品3 青
3 商品3 緑

277 :NAME IS NULL:2010/07/09(金) 17:23:50 ID:???
>>276
MySQL5で試せてないけど、ビット演算の概念を使って取り出せばいいと思うんだ。

select item_id, item.name, color.name
from item cross join color
where item.color & color_id = color_id
order by item_id, color_id;

278 :276:2010/07/09(金) 18:36:38 ID:01dNrJEc
>>277
結合にビット演算子を使うのは頭にありませんでした。
MySQL5で見事に取得できました。
ありがとうございました。

279 :NAME IS NULL:2010/07/17(土) 08:55:41 ID:???
・DBMS名とバージョン
Oracle Database 10g 10.2.0.

SQLの実行計画で、
select count(1) from TBL_A
とした場合はSORT (AGGREGATE)が表示されるのに、
select col_a, col_b from TBL_A
などの場合にはSORT (AGGREGATE)が表示されないのはなぜでしょうか?

280 :NAME IS NULL:2010/07/17(土) 10:52:21 ID:???
前者は集約関数を使っているから、後者は使っていないから
むしろ何が疑問なのか分からない

281 :NAME IS NULL:2010/07/17(土) 11:41:13 ID:???
>>279
Oracle10gのプランナがバカ! とは言わないけど、洗練度に欠けるのかな。

以下、勝手な推測だが、
集約関数の場合、GROUP BYと併用する場合が多くて、
GROUP BYの実行には一旦ソートしてからまとめるようになっている。
だから、最終的には必要ないのだが、集約関数を見つけた時点で、
ソートしちゃった! ってところかと。

282 :NAME IS NULL:2010/07/17(土) 12:11:03 ID:???
SORT AGGREGATE と表示されても、実際は AGGREGATE しているだけで
SORT はしてないと思う。
ちなみに GROUP BY の場合は SORT GROUP BY とか
HASH GROUP BY とか表示される。

283 :NAME IS NULL:2010/07/18(日) 10:55:54 ID:wToLq7/Q
MYSQL5で
テーブルA
create table A( id int , name_id int, word varchar(128) , primary key ( id ) , index ( name_id ) )
テーブルB
create table B( id int, cid1 int, cid2 int , cid3 int , primary key ( id ) )
テーブルC
create table C( id int, name varchar(128) , primary key ( id ) , unique ( name ) )
こんな感じのテーブルを作成しました。テーブルAのname_idはテーブルBのidと、テーブルCのidはテーブルBのcid1〜cid3と関連します。
テーブルAのname_id,wordとテーブルBのcd1〜cd3をテーブルCのnameで置き換えた値で取り出したいのですが、どう書けばいいでしょうか?


284 :NAME IS NULL:2010/07/18(日) 11:10:54 ID:???
select A.name_id,
    A.word,
    C1.name,
    C2.name,
    C3.name
from  A
   inner join
    B
    on A.name_id = B.id
   inner join
    C as C1
    on B.cid1 = C1.id
   inner join
    C as C2
    on B.cid2 = C2.id
   inner join
    C as C3
    on B.cid3 = C3.id
;

285 :NAME IS NULL:2010/07/18(日) 11:14:27 ID:wToLq7/Q
>>284
おお。。。なるほど。そう書くんですね。ありがとうございます!
今まで正規化考えないでひとつのテーブルにまとめてたのを、
正規化勉強し始めてテーブル分けたものの簡単な取り出し方しかわかりませんでした。

286 :NAME IS NULL:2010/07/19(月) 00:47:59 ID:???
いや正規化できてねぇしw

287 :NAME IS NULL:2010/07/19(月) 01:05:28 ID:hKSUB/U7
えっ

288 :NAME IS NULL:2010/07/19(月) 15:56:24 ID:CQO73cD2
えっ

289 :NAME IS NULL:2010/07/19(月) 16:52:37 ID:???
なにそれこわい

290 :NAME IS NULL:2010/07/20(火) 00:29:41 ID:???
同じテーブルの同じ項目でで内部結合や外部結合する必要性(意味)はありますか?


291 :NAME IS NULL:2010/07/20(火) 01:36:00 ID:???
ある

292 :NAME IS NULL:2010/07/20(火) 07:17:41 ID:???
>>283はテーブルBが非正規化じゃないの

293 :NAME IS NULL:2010/07/20(火) 12:20:20 ID:???
>>292
んなことはスキーマ定義からだけでは判断できん。

294 :NAME IS NULL:2010/07/20(火) 12:26:56 ID:???
cid1〜3がどういう意味かによって正規形と言える場合もあるし
言えない場合もある

295 :NAME IS NULL:2010/07/20(火) 23:36:33 ID:???
C.id → B.id1
C.id → B.id2
C.id → B.id3
なんだから繰り返し項目。非正規化。

296 :NAME IS NULL:2010/07/20(火) 23:54:03 ID:???
質問です。SQL内に同じ計算式が2回出るときにすっきりする方法ありませんか?
例えば、現在値/その最大値というカラムがあり、現在値を増やすようなケースで

update TABLE set 現在値 = IF( 現在値+複雑な計算 => 最大値, 最大値, 現在値+複雑な計算 )
とすれば実現はできるのですが、この複雑な計算を2回書きたくないです(バグの元だし)。

尚、DBMSはMySQLです。
また、可読性よりはパフォーマンスを重視したいので、
上記よりもパフォーマンスで劣る方法しか無いようならあきらめます。

297 :296:2010/07/21(水) 00:04:41 ID:???
=> は >= に訂正。なんという素人ミス…。
なんかNVLとかIFNULL的な、SETMAX(複雑な計算, 最大値)とかいう関数があったら楽なんだけど。

298 :NAME IS NULL:2010/07/21(水) 00:33:18 ID:???
>>295
一般的に正規化されていない可能性が高いが
特殊な要件がある可能性もあるんで、今でている条件だけでは判断できない
ということを、>>293-294が言ってくれてるんだが理解できないのか?

>>296
当然その複雑な計算ってのは行ごとに値が変わるんだよな
可読性もとめるならビュー作っとけばいいんじゃね
パフォーマンスは、計算列に対する実態を保持するようなビュー(またはテーブル)
作れるならともかく、普通のビューなら落ちると思うけど

299 :296:2010/07/21(水) 01:09:36 ID:???
行ごとに値が違います。さらに言うと最大値も固定じゃないので、
カラムの制約な何かで最大値を制御できたとしても(出来るのか知らんけど)そういうのもNG。

やっぱ選択肢の一つはビューですよね…。もっとお手軽なのないかな。

300 :NAME IS NULL:2010/07/21(水) 01:44:29 ID:???
>>295
「繰り返しグループ」について正しく理解していないようだから詳しく。

属性の集まりが「繰り返しグループ」と呼ばれるのは一般的にその属性の
集まりがタプルではなく、単に何かの値の集合を意味する時。
この場合は「個々の属性値はatomic」という第一正規形の定義から間接的
に外れてしまうためこれは排除すべしとされている(歴史的にはCoddによる
元の第一正規形の定義に後付されたルール)。

例えばcid1〜cid3が「新郎、新婦、仲人」という「人名のタプル」だったり
「出発地、経由地、到着地」という「地名のタプル」だったりする場合は、
cid1〜cid3は繰り返しグループではなく、第一正規形を満たす。

cid1〜cid3が「趣味1、趣味2、趣味3」だと「趣味の集合」を意味している
「かもしれない」ので繰り返しグループ「かもしれない」。
それでも例えば趣味は常に正しく3種類入力し、その順序にも意味がある、
という仕様であればこれもまたタプルであって繰り返しグループではない。

要するにcid1〜cid3の属性名が似てるとか同じ外部キー制約を持っている
云々は正規形を判断する傍証にはなっても本質的には何の意味も無い。
実際にはcid1〜cid3が意味するところが解らないと第一正規形かどうかは
判断できないし、これはスキーマ定義からは読み取れない、ってことを
皆は言っている。ながなが。

301 :NAME IS NULL:2010/07/21(水) 03:00:30 ID:???
「好きな趣味」「嫌いな趣味」「どっちでもない趣味」とかでいいだろ

302 :NAME IS NULL:2010/07/21(水) 03:27:12 ID:???
>>301が何を言いたいのかまったく理解できない…。

「実際の仕様は本人しかわからない」という話をしてるのに
「仕様はこうでいいだろ」ってどういう意味だ?

303 :NAME IS NULL:2010/07/21(水) 05:58:48 ID:???
正規化はスレ違いってこともわからない馬鹿。

304 :NAME IS NULL:2010/07/21(水) 07:02:38 ID:???
>>299
やるじゃん

>>303
プッ

305 :NAME IS NULL:2010/07/21(水) 13:59:34 ID:???
>>299
複雑な計算結果を保持するカラムを作り、その内容を
トリガで行が挿入/更新されるたびに計算してセットする

現在値を更新する処理のパフォーマンス的には有利かもしれない
(現在値の更新でトリガが走るなら作り方に注意がいる)
普通に行を挿入/更新するパフォーマンスは若干落ちる

後はこれぐらいしか思いつかん

つかこの質問にしても、正規化の話にしても
設計はスレ違いだよな、ここ

306 :296:2010/07/21(水) 15:45:07 ID:???
SQLレベルでの解決ができるならこのスレ、と思ったけど
設計レベルでになるとスレ違いになるので難しいところ。

>>305
用途ごとのクエリの頻度次第では
トリガは一考の価値ありですね。ありがとうございます。

307 :NAME IS NULL:2010/07/21(水) 22:42:10 ID:???
CTE使えないの?

308 :296:2010/07/21(水) 22:52:44 ID:???
>>307
ググっても情報が少なめでよくわかりませんが
どうやらMySQLは非対応のようです。

309 :NAME IS NULL:2010/07/24(土) 01:52:58 ID:???
>>299
サブクエリでいいじゃん。

310 :NAME IS NULL:2010/07/24(土) 01:55:31 ID:???
良くわかんないけど、サブクエリでダメなら、RowIDで結合すれば?

311 :NAME IS NULL:2010/07/24(土) 14:48:57 ID:QZVGATrx
すみません、教えてください。

テーブルAとテーブルBがあり、
テーブルAには、1〜1000万までの連番を格納しています。連番はキーです。
テーブルBの方には、その連番の開始値と連番数が格納されています。

開始値 | 連番数
---------------
  1001 | 100   ←1001から1100までの意味
  5001 | 100   ←5001から5100までの意味
  9001 | 100   ←9001から9100までの意味

テーブルBで指定されている連番に一致するレコードを
テーブルAから取得するにはどのように書けばよいでしょうか。
上記の例だと300件取得する形になりますが、
テーブルBにも1万件程度のレコードがあります。

DBMSはOracle10gです。

312 :NAME IS NULL:2010/07/24(土) 15:10:34 ID:???
キー >= 開始値 and キー < 開始値 + 連番数

でいいでしょ。

313 :NAME IS NULL:2010/07/24(土) 19:26:01 ID:???
>>311
between使えという神の啓示のような例題だな

314 :NAME IS NULL:2010/07/24(土) 20:02:46 ID:???
>>312-313
SQLすべて書いてやれば?
1000万行x1万行のJOINや1000万行xIN(1万行)は避けたいところ。
再帰SQLなら1万行+取得行分のインデックス検索だが、10gはconnect byか。


315 :NAME IS NULL:2010/07/24(土) 20:15:29 ID:???
>>311

こんなんはどうだろうか?遅いかもしれんが

select * from A A1 where
  exists (
    select * from B where
      exists (
        select * from A A2 where
          A2.key = A1.key
          A2.key >= B.開始値 and
          A2.key < B.開始値 + B.連番数)
        )
  )

あ、ちなみに俺は>>312でも>>313でもない

316 :NAME IS NULL:2010/07/24(土) 20:23:32 ID:???
ベーシックなのから書けよ

select A.*
from  A
    cross join
    B
where  A.キー between B.開始値 and B.開始値 + B.連番数 - 1
;

317 :314:2010/07/24(土) 20:26:09 ID:???
>>315
EXISTSは2重にしなくとも
SELECT * FROM A WHERE EXISTS (SELECT * FROM B WHERE A1.key BETWEEN 開始値 AND 開始値+連番数-1);
でいけると思う。
EXISTSでもインデックス検索じゃねーから、遅いでしょうね。

318 :314:2010/07/24(土) 20:28:17 ID:???
>>317
A1.keyはA.keyの間違い。

319 :315:2010/07/24(土) 20:31:45 ID:???
>>317
あ、ほんとだ。なんか頭沸いてた・・・

320 :314:2010/07/24(土) 20:50:47 ID:???
SELECT A.* FROM A LEFT JOIN B ON A.key BETWEEN B.開始値 AND B.開始値+B.連番数-1 WHERE B.開始値 IS NOT NULL;
Oracleは持っていないので、通るのかどうかわからないが、
これなら、1000万行+1万行ですみそうな気がする。

321 :NAME IS NULL:2010/07/24(土) 20:52:46 ID:???
>>313
BETWEENって
MIN <= Value < MAX
って可能なの?最小値、最大値にイコールが入ってるパターンしかダメなんじゃなかったっけ

322 :NAME IS NULL:2010/07/24(土) 21:31:35 ID:???
>>320
わざわざOUTER JOINしてチェックする意味ある?
素直にINNER JOINで良い気がするんだが

OUTER JOINってINNER JOINより遅いイメージなんだがそんなことない?

323 :314:2010/07/24(土) 21:47:29 ID:???
>>322
Σ(゜д゜;)
なんか、Nested Loopを回避したくて、なんとなくINNER JOINを避けたけど、
いわれてみりゃ、そんな根拠ないなw
俺も頭の中、偏ってる。

324 :NAME IS NULL:2010/07/26(月) 19:08:08 ID:???
CentOSのMySQLを5.0系から5.1.49にアップデートしました。
そして、service restart mysqldとしたところ、起動せず、ログに以下の記録が残っていました。
100726 18:54:05 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
100726 18:54:50 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
100726 18:54:50 [Note] Plugin 'InnoDB' is disabled.
/usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
100726 18:54:50 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
100726 18:54:50 [ERROR] /usr/libexec/mysqld: unknown option '--skip-bdb'
100726 18:54:50 [ERROR] Aborting
100726 18:54:50 [Note] /usr/libexec/mysqld: Shutdown complete
100726 18:54:50 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
書いてある通りに、mysql_upgradeをやってみたのですが、
mysqlcheck: Got error: 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) when trying to connect
とでて、起動しませんでした。
どうすれば起動するようになりますか?

325 :NAME IS NULL:2010/07/26(月) 19:23:06 ID:???
スレ違い。MySQLスレへGo

326 :NAME IS NULL:2010/07/26(月) 19:36:54 ID:???
分かりました。
そっちで聞いてきます。

327 :NAME IS NULL:2010/07/26(月) 22:30:48 ID:???
ID 名前   カテゴリID 数字 日付
1 たぬき  1      5 7月3日
2 たぬき  1      8 7月4日
3 かっぱ  2      3 8月5日
4 きつね  3      9 1月3日
5 きつね  3      5 9月3日
のようなテーブルで
カテゴリIDごとでさらに名前ごとに数字の最小値を求めたいのですがどう書けばいいでしょうか?
この場合だとID1、3,5が取り出せるようにしたいのですが。
MYSQL5.1を使っています。

328 :NAME IS NULL:2010/07/26(月) 22:32:50 ID:???
>>327 >>4

329 :NAME IS NULL:2010/07/26(月) 22:34:34 ID:???
>>328
すみません >>4を見て自分で試そうとしたのですが、
むずかしすぎてわかりませんでした。

330 :NAME IS NULL:2010/07/26(月) 22:36:48 ID:???
あきらめろ。

331 :NAME IS NULL:2010/07/26(月) 22:45:06 ID:???
そこをなんとか

332 :NAME IS NULL:2010/07/26(月) 23:03:29 ID:???
>>329
まず最初に、「最小の数字」がすでに分かっている固定値(5とか3とか)だとするSQLを書く

次に最小値を求めるSQLを書く

やったね!

333 :NAME IS NULL:2010/07/27(火) 00:32:17 ID:???
>>327
select A.ID from テーブル A
join (select カテゴリID,名前,min(数字) as 最大数字 from テーブル group by カテゴリID,名前 ) B
 on A.カテゴリID=B.カテゴリID and A.名前=B.名前 and A.数字=B.最大数字

指定条件でダブりがあったりNULLがあったりした場合はどうなるかしらね

334 :NAME IS NULL:2010/07/27(火) 00:50:39 ID:???
でんすらんく

335 :NAME IS NULL:2010/07/27(火) 17:38:55 ID:???
品目 日付
-------------------------------
酢だこ 7/20
酢だこ 6/20
まだこ 7/21
まだこ 7/1
まだこ 6/25
大だこ 7/1
いか 6/20

こんな感じのテーブルがあり、品目名に"だこ"を含むデータを出現頻度の高い順に取り出そうとしていますが、
select 品目,日付 from table where 品目 in (select 品目 from table 品目 like '%だこ%' group by 品目 order by count(品目) desc;
で、やってみたのですが、遅すぎて使えませんでした。

何かいいやり方は無いでしょうか? お願い致します。

336 :NAME IS NULL:2010/07/27(火) 18:50:49 ID:???
like は前方一致じゃないとインデックスを使えない。
「○○だこ」のパターンがあらかじめ全部分かっていれば
 where 品目 in ('酢だこ','まだこ','大だこ')
などにすればインデックス(があれば)使ってくれるはず。

337 :NAME IS NULL:2010/07/27(火) 18:59:14 ID:???
>>335
いまいち何がやりたいかわからんな
select 品目,count(*) as 件数 from table where 品目 like '%だこ%'
group by 品目 order by count(*) desc
とかじゃダメなのか?

338 :NAME IS NULL:2010/07/27(火) 20:41:43 ID:???
個人的に気になったんで調べてみたけど
今どきはどのDBMSも無償オプションなり何なりで
全文検索機能提供してるのね。
日本語全文検索がどの程度使い物になるかは
やってみないと分からんけど。

339 :NAME IS NULL:2010/07/27(火) 21:03:06 ID:???
>>335
この手の検索を今だけ刹那的に行うのか、定型作業として頻繁に
行うのかわからないけど、後者であれば普通にカテゴリを管理した
マスタ表を用意するのが無難かと。

品目  カテゴリ
==========
酢だこ  たこ
まだこ  たこ
大だこ  たこ
たこ   たこ
いたこ  ひと
いか   いか
はまぐり かい
やきぐり くり


340 :NAME IS NULL:2010/07/27(火) 23:14:51 ID:???
>>335
品目の重複が多いのなら、HAVINGが早いかも。

SELECT T1.* FROM Table AS T1 JOIN
(SELECT 品目,count(品目) AS cnt FROM Table GROUP BY 品目 HAVING 品目 like '%だこ%') AS T1
USING(品目)
ORDER BY cnt DESC;

341 :NAME IS NULL:2010/07/27(火) 23:16:09 ID:???
>>340
2行目の(サブクエリ) AS T1 は AS T2の間違い。
スマソ。

342 :NAME IS NULL:2010/07/27(火) 23:43:56 ID:???
mysqlです。
レコードの削除処理でlimitを使用した残りを全て削除するようなSQLはどのように記述すればいいでしょうか


343 :NAME IS NULL:2010/07/27(火) 23:56:42 ID:???
EXCEPTでぐぐるといいことがあるかもしれんよ

344 :NAME IS NULL:2010/07/28(水) 00:25:12 ID:???
MySQLでEXCEPT使えるようになったっけ?

>>335のデータで最新日付3件を残して他を削除
DELETE FROM Table AS T1 WHERE 3< (SELECT count(*) FROM Table T2 WHERE T1.日付 < T2.日付);
でも、3件目の7/1が2件あるから、4件残ってしまう。
そもそもこれもMySQLで動くかどうかも不明。

345 :342:2010/07/28(水) 23:11:05 ID:???
>>343
mysqlに打ちのめされました

346 :NAME IS NULL:2010/07/29(木) 17:52:57 ID:VSFhFikc
はじめまして
データベースの勉強中です(基本情報技術者試験)

SQLの問題で 選択と射影の違いをよく問われます

・選択 条件に合った行を抽出
・射影 特定の列を抽出

(例)
表 syain(syanid,syainmei,age)

例1 select * from syain where age >= 20
(syain表から、ageが20以上の行を抽出しているので選択)

例2 select syainmei from syain
(syain表から、syainmeiの列のみ抽出しているので射影)

ということですが 以下の例だと

例3 select syainmei from syain where age >= 20

syainmeiという特定の列を指定して さらに ageが20以上という条件もあります

参考書やネットで調べてみると where条件があれば「選択」という意見と
特定の列を指定していれば「射影」という意見に分かれているようです


例3の場合 選択と射影 どちらと見るべきなのでしょうか?
アドバイスよろしくお願いします


347 :NAME IS NULL:2010/07/29(木) 23:31:28 ID:???
>>346
射影は重複も省くからdistinctしなきゃいけないよ。
それをぬきにしても射影や選択は関係演算のプリミティブな単位だから、例3は射影と選択を使っているといえる。

348 : [―{}@{}@{}-] NAME IS NULL:2010/07/30(金) 02:53:36 ID:???
デジタル工房です
只今オープン価格中
http://gekiyasu.issekinicho.com



349 :NAME IS NULL:2010/07/30(金) 04:12:28 ID:9Np/J98F
>>346
選択(制限)や射影といった関係代数の演算は算数の足し算引き算
かけ算割り算と一緒で組み合わせて使うことができるんだよ〜

なので正解は「選択してから射影」だね。「射影してから選択」
ではないので要注意。

350 :39:2010/07/30(金) 07:10:30 ID:???
「選択」とか「射影」とか初めて聞いた。
勉強になりました。

by 開発技術者歴10年

351 :NAME IS NULL:2010/07/30(金) 07:21:28 ID:???
射影って普通、高校の数学で習わないか

352 :NAME IS NULL:2010/07/30(金) 07:33:40 ID:???
射精なら・・・

353 :NAME IS NULL:2010/07/30(金) 08:23:23 ID:???
>>351
今は大学に行かないと習わない。

354 :NAME IS NULL:2010/07/30(金) 08:37:25 ID:???
>>353
顔面蒼白…日本って想像以上にやばくなってんだな

355 :346:2010/07/31(土) 01:19:24 ID:A1610sXI
>>347
>>349
>>352

ありがとうございました
どっちかである必要はないのですね

すっきりしました

356 :NAME IS NULL:2010/08/02(月) 17:12:02 ID:6clj2YAP
次のようなSELECTをするケースではどのようなSQLが妥当でしょうか?

・テーブルAとBをJOINしたい
・テーブルCとDをJOINしたい
・A+BとC+DはLEFT JOINしたい

とりあえず次のような2ケースは思いつくのですが、

【2回LEFT JOINする】
SELECT *
FROM A
JOIN B USING( key_ab )
LEFT JOIN C USING( key_ac )
LEFT JOIN D USING( key_cd )

これだと理論的には1回でいいはずのLEFT JOINが2回になりパフォーマンスがもったいない気が。

【CDをサブクエリにする】
SELECT *
FROM A
JOIN B USING( key_ab )
LEFT JOIN (
SELECT *
FROM C
JOIN D USING( key_cd )
) CD USING( key_ac )

これはこれでしなくてもいいサブクエリにしてるようでやはりパフォーマンスが。
他に方法はあるでしょうか。

357 :356:2010/08/02(月) 17:16:25 ID:???
情報不足でした、DBMSはMySQL5です。
標準SQLとして気になるところですが、さしあたってMySQLでできればいいです。

358 :NAME IS NULL:2010/08/02(月) 18:02:36 ID:???
>>356
SELECT * FROM
A JOIN B USING(key_ab)
LEFT JOIN
(C JOIN D USING(key_cd)
USING(key_ac);

標準なのか、MySQLで動くのかも知らないけどね。

359 :NAME IS NULL:2010/08/02(月) 18:04:10 ID:???
括弧ひとつ抜けてた
(C JOIN D USING(key_cd))

最初のも括弧で括った方が、後からわかりやすそう。
(A JOIN B USING(key_ab))

360 :356:2010/08/02(月) 18:25:55 ID:???
動いた!括弧でくくるだけの話だったとは…試したことあったと思ったんだけどなぁ。
ありがとうございました!

361 :NAME IS NULL:2010/08/02(月) 20:14:10 ID:???
いやまて、動いた動かなかったレベルの話なのか?
パフォーマンス的にはFROM句サブクエリはいいもんじゃないぞ。

362 :356:2010/08/02(月) 21:34:30 ID:???
>>361
え、FROM句サブクエリってのは>>356の後者のことであって
括弧でくくるのはサブクエリにはならないでしょ?
explainしてみた限りじゃ大丈夫そうですが。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)