SQL質疑応答スレ 6問目

このエントリーをはてなブックマークに追加
1NAME IS NULL
参考リンク
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/

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

質問テンプレ
・DBとバージョン
・テーブルデータ
・欲しい結果
・説明
2NAME IS NULL:2008/05/16(金) 21:22:37 ID:???
過去ログ

SQL質疑応答スレ http://pc8.2ch.net/test/read.cgi/db/1056973582/
SQL質疑応答スレ Part 2 http://pc8.2ch.net/test/read.cgi/db/1103113155/
【帰ってきた】SQL質疑応答スレ http://pc8.2ch.net/test/read.cgi/db/1124178925/
【帰ってきた】SQL質疑応答スレ 2問目 http://pc8.2ch.net/test/read.cgi/db/1141622643/
【帰ってきた】SQL質疑応答スレ 3問目 http://pc11.2ch.net/test/read.cgi/db/1160458216/
【帰ってきた】SQL質疑応答スレ 4問目 http://pc11.2ch.net/test/read.cgi/db/1176553195/
SQL質疑応答スレ 5問目 http://pc11.2ch.net/test/read.cgi/db/1193486961/
3NAME IS NULL:2008/05/16(金) 21:23:43 ID:???
よくある質問

(問)
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
;
4NAME IS NULL:2008/05/16(金) 21:24:48 ID:???
よくある質問

(問)
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
;
5NAME IS NULL:2008/05/18(日) 10:58:59 ID:6+oG6BiD
インデックスの勉強がしたいのですが、
どういった方法がいいでしょうか?
たとえばインデックスの効果が体感できる
勉強方法とか教えてください。
6NAME IS NULL:2008/05/18(日) 13:20:40 ID:???
今時のPC性能だと趣味で勉強するレベルのデータ量では体感は不可能だと思うが。
7NAME IS NULL:2008/05/18(日) 13:38:41 ID:???
INDEXが有ることでSELECTが遅くなる
と紹介されることが多いけど、自分でも体験してみたいです。
8NAME IS NULL:2008/05/18(日) 13:53:04 ID:???
INDEXが有ることでSELECTが遅くなるなんてどこで紹介されてるんだ?

それはともかく、手っ取り早くテストデータ作るなら
PostgresとかMySQLについてるベンチマークでいいんじゃね?
9NAME IS NULL:2008/05/18(日) 17:29:02 ID:???
間抜けなインデックスが足を引っ張る、なんてのはあるけどね。
最近のおりこうさんなオプティマイザだと、そうそうないんじゃないかな
10NAME IS NULL:2008/05/18(日) 17:45:53 ID:???
前スレからのつづきで
auto_increment振ってみたらやっぱ順番バラバラで
auto_incrementフィールドの連番を振りなおしたい

やりたいことは
今あるテーブルのあるフィールドを昇順として
auto_incrementフィールドに1から連番をつけたいです。
お願いします(>_<)
11NAME IS NULL:2008/05/18(日) 17:47:22 ID:???
>>10
たぶん、DB によるんだろうけど、一般的な解としては
同じ構造のテーブルに入れ直す、ってとこじゃない?
1210:2008/05/18(日) 17:52:52 ID:???
別のテーブルを作るってこと?
名前は変えたくないんでできれば、今のテーブルを更新したいです。

色々調べてみてUPDATEとかRowNumでできそうな気がしたけど、わからんかったorz
13NAME IS NULL:2008/05/18(日) 17:54:36 ID:???
別のテーブルに入れた後、元のテーブルを削除して、
新しいテーブルを元の名前にすればOK

テンポラリテーブルを使ってもいいし。
1410:2008/05/18(日) 18:09:27 ID:???
ごめん。別のテーブルに入れるとこがわからん

CREATE TEMPORARY TABLE TmpTable SELECT * FROM SrcTable ORDER BY timestamp;
DROP TABLE SrcTable;
CREATE TABLE SrcTable AS SELECT * FROM TmpTable;
SrcTable:元テーブル
timestamp:並び替えに使うフィールド
これだとauto_incrementフィールドまでまんまコピーされてしまうし。
15NAME IS NULL:2008/05/18(日) 18:23:41 ID:???
auto_incrementをやめればいい
1610:2008/05/18(日) 18:29:59 ID:???
そっか。ちょっと調べてみまふ
ありがとう
17NAME IS NULL:2008/05/18(日) 21:32:48 ID:toQ3X+jn
こんなSQL作りたいのですが、お力を下さい。

社員表
社員番号 社員名 入社日
001      A 19950401
002   B 19960401
003      C 19950401

講座表
講座ID  講座名  開講日
aaaa   会計   20080501
bbbb   会計   20080601
cccc   エクセル 20080701

受講表
講座ID   社員番号
aaaa    001
aaaa    002
aaaa 003

ある講座名に該当する講座を取っている社員を全員列挙かつ入社年で絞込み、
または、誰も取っていなければ空行を出力したいです。

例えば講座名を「会計」、入社日を「19950401」で絞り込む場合、

講座ID 講座名 社員番号 社員名
aaaa  会計  001    A
aaaa  会計  003    C
bbbb  会計  (空)    (空)

と出力したいです。

あるいは「エクセル」と「19960401」で絞り混むと
講座ID 講座名  社員番号 社員名
cccc  エクセル (空)    (空)

これを自動化するため、1回のSQLで済ませたいのですが、
どのように書いたら良いでしょうか。

取ってる社員がいる場合といない場合とで、別々なSQLなら
簡単なのですが、1回となると難しくて困っています。
18NAME IS NULL:2008/05/18(日) 22:06:26 ID:???
>>17
UNION
19NAME IS NULL:2008/05/18(日) 22:29:45 ID:toQ3X+jn
ありがとうございます。

UNIONって、前半と後半で、
selectするデータの項目数があってないとダメですよね。

後半、社員番号と社員名にあたる列が空になるような
SQLはどう書いたら良いでしょうか・・・?

(csvに吐いて処理するので、カラム数が合って欲しいです)
20NAME IS NULL:2008/05/18(日) 22:38:17 ID:???
あー、ごめんごめん。

講座表と受講表を LEFT JOIN して、その結果と社員表を
INNER JOIN すれば OK だね
21NAME IS NULL:2008/05/18(日) 23:18:37 ID:toQ3X+jn
>その結果と社員表を INNER JOIN すれば OK だね

ありがとうございました。
副問い合わせ使いますよね?

何が難しいって、2つの表の結合なら、
外部結合すれば勝手に空のカラムが出るけど、

この場合みたいに、
中間的な表を介して3つの表で外部結合させる時の
空カラムの出し方が分かりませんでした。
22NAME IS NULL:2008/05/18(日) 23:52:20 ID:???
> 外部結合すれば勝手に空のカラムが出るけど、

join の left, right, inner, outer の意味わかってる?
23NAME IS NULL:2008/05/19(月) 00:10:17 ID:LUgEweM8
えーと

>講座表と受講表を LEFT JOIN して、
>その結果と社員表を INNER JOIN すれば OK だね

これの、1行目の結果が

講座ID 講座名 社員番号
aaaa   会計   001
aaaa   会計   003
bbbb   会計   (空)

ってな感じまでは分かりました。

select 講座ID、講座名、社員番号 from
講座表 LEFT JOIN 受講表
ON 講座表.講座ID = 受講表.講座ID

という感じ。

2行目が分かっていません…
24NAME IS NULL:2008/05/19(月) 00:43:52 ID:???
適当に書いてみた。
あってるかは知らん。

SELECT
 J.講座ID,
 K.講座名,
 J.社員番号
 S.社員名
 FROM
  講座表 K LEFT JOIN
  受講表 J ON K.講座ID = J.講座ID
  LEFT JOIN 
 (
 SELECT
   S.社員番号,
   S.社員名,
  FROM
   社員表 S
  WHERE
   S.入社日 = :入社日
 )S
 ON J.社員番号 = S.社員番号
 WHERE
 K.講座名 = :講座名
25NAME IS NULL:2008/05/19(月) 10:31:56 ID:???
受講表と社員表を先にINNER JOINしないとダメだね。

select 講座ID, 講座名, 社員番号, 社員名
from (select *
    from 講座表
    where 講座名 = '会計'
   )
   left outer join
   (select *
    from 受講表
       inner join
       社員表
       using (社員番号)
    where 入社日 = '19950401'
   )
   using (講座ID)
;
26NAME IS NULL:2008/05/19(月) 15:27:36 ID:???
すみません質問です
現在SQLServer2000とVisualStudioC#を使用して開発を行っています
サーバーが1台、クライアントが複数台で、各クライアントからは以下の処理を実行しています


1. テーブルから、ロックされていない未処理のデータを1件抽出
SELECT TOP 1 * FROM テーブル WHERE 処理フラグ=0 AND ロック=''

2. 取得した1レコードのキーを元にupdateを実行
UPDATE テーブル SET ロック='クライアントID' WHERE 処理フラグ=0 AND ロック='' AND キー='SELECTで取得したキー'

3. UPDATEの処理件数が1件であれば成功とし、SELECTで取得したキーを元にゆっくり編集作業を行う

4. 編集処理完了後、ロックフィールドを空にし、処理フラグを立てて更新する


上記の処理を繰り返すことにより、全レコードを重複なく編集することが目的だったのですが、
極まれに同じレコードを編集してしまうことがあるで困っています。手元の環境では再発しないので検証ができないもので…

上記の処理に何かまずい所があるのでしょうか?
27NAME IS NULL:2008/05/19(月) 15:42:17 ID:???
>>26
2の時点で一旦COMMITすれば起きないんじゃない?

ただ、3〜4が失敗した場合に2がロールバックされないという
新たな問題が発生することになるけど。
28NAME IS NULL:2008/05/19(月) 16:19:45 ID:???
返信ありがとうございます

書き忘れましたが、トランザクション処理は特に指定していません
なので、UPDATE処理終了後は自動的にCOMMITされている…という解釈でいいんですよね?
明示的にトランザクションで挟んだほうがいいんでしょうか?

ちなみに分離レベルはデフォルトのREAD COMMITEDです
29NAME IS NULL:2008/05/19(月) 23:35:05 ID:???
表のとある項目から、後ろから3桁目の数字が0である項目を抜き出したいのですがどうすればよいのでしょうか?
likeを使ったりしてるのですがわかりません。
30NAME IS NULL:2008/05/19(月) 23:46:13 ID:???
>>28
http://msdn.microsoft.com/ja-jp/library/ms187373.aspx

READPAST
他のトランザクションによってロックされている行を、データベース エンジンが読み取らないことを指定します。
多くの場合、この指定はページにも適用されます。
データベース エンジンは、ロックが解除されるまで現在のトランザクションをブロックする代わりに、
行やページをスキップします。
READPAST は、READ COMMITTED 分離レベルまたは REPEATABLE READ 分離レベルで実行中の
トランザクションでのみ指定できます。
SNAPSHOT 分離レベルで実行中のトランザクションにおいてこのオプションを指定する場合、
UPDLOCK や HOLDLOCK など、ロックが必要な他のテーブル ヒントと組み合わせて指定する必要があります。
READPAST を指定すると、行レベルとページ レベルの両方のロックがスキップされます。
READPAST は、UPDATE ステートメントまたは DELETE ステートメントで参照されるテーブル、
および FROM 句で参照されるテーブルで指定できます。UPDATE ステートメントで READPAST を指定した場合、
ステートメント内での指定場所にかかわらず、更新対象データ特定のためのデータ読み取り時にだけ適用されます。
INSERT ステートメントの INTO 句では、テーブルに READPAST を指定することができません。

READPAST を使用する読み取り操作はブロックを行いません。
READPAST を使用する更新操作や削除操作は、外部キーやインデックス付きビューの読み取り時、またはセカンダリ
インデックスの変更時にブロックを行う場合があります。

たとえば、テーブル T1 に整数型の列が 1 つあり、値 1、2、3、4、5 が格納されているとします。
このテーブルに対してトランザクション A で値 3 を 8 に変更し、この変更をまだコミットしていない間に
SELECT * FROM T1 (READPAST) を実行すると、取得される値は 1、2、4、5 となります。
READPAST は主に、SQL Server テーブルを使用する作業キューの実装時に、ロックの競合を減らすために使用します。
READPAST を使用するキュー リーダーは、他のトランザクションによってロックされたキュー エントリを、
ロックが解除されるまで待たずにスキップして、次に使用可能なキュー エントリへ進みます。
31NAME IS NULL:2008/05/19(月) 23:54:02 ID:???
>>29
ヒント:
SELECT
 SUBSTRING(RIGHT(T.COL1,3),1,1)
  FROM TABLE T

SQLServerならこれで右から3桁目がわかる。
varcharだけどね。
32NAME IS NULL:2008/05/20(火) 00:03:13 ID:???
>>29
WHERE ある項目 LIKE '%0__'
ある項目が数値型なら文字列型にキャストする
33NAME IS NULL:2008/05/20(火) 13:08:54 ID:???
>>31-32
ありがとうございます。
しかしうちはoracleな上、likeは使わずにやってみろと言われ頭がパンクしそうです(´・ω・`)
文字列の変換がヒントだと言われたのですが……アウアウ
34NAME IS NULL:2008/05/20(火) 13:28:57 ID:???
>>33
WHERE SUBSTR(ある項目, -3, 1) = '0'
35NAME IS NULL:2008/05/20(火) 22:46:19 ID:???
AさんとBさんの表がありまして
それぞれ葉抜けな日付のレコードに
AKとBKで1=出勤日 0=休日 NULL=未入力
で登録されたデータがあります

こいつから
A
ADATE AK
-------------------
2008/05/01 1
2008/05/03 1
2008/05/04 0
2008/05/05 1
2008/05/06 NULL

B
BDATE BK
-------------------
2008/05/02 1
2008/05/04 0
2008/05/06 0
2008/05/08 1
2008/05/08 NULL

↑こんな感じでA/BDATEにKEYがあります。
指定日(文字列で与えます)から誰かが出勤している5日分のリストを
ORACL10gのSQL1発で出力したくSQLを書いてみました
(登録されていない日はそれぞれ出勤日扱い)
が、20日先の限定になってしまいましたので
限定をつけない方法を教えてください

指定日=2008/05/03 の場合の抽出結果
-------------------
2008/05/03
2008/05/05
2008/05/06
2008/05/07
2008/05/08
となるようにしたいのです。

取りあえず頭に浮かんだSQL
select SDATE from (
select SDATE
from( (select to_date(指定日,'yyymmdd')+0 as SDATE from dual)
union(select to_date(指定日,'yyymmdd')+1 as SDATE from dual)
union(select to_date(指定日,'yyymmdd')+2 as SDATE from dual)
--省略--
union(select to_date(指定日,'yyymmdd')+20 as SDATE from dual)
)CL
left outer join A on A.ADATE=CL.SDATE
left outer join B on B.BDATE=CL.SDATE
where NVL(A.AK,1)=1 or NVL(B.BK,1)=1
order SDATE
) rownm<=5

よろしくお願いします。
3635:2008/05/20(火) 22:51:18 ID:???
ごめんなさい書きもれました
AK、BK=NULLも出勤日扱いです
37NAME IS NULL:2008/05/20(火) 23:19:23 ID:???
2008/05/07 も結果に入れたいってところに無理があるような。
ありえる日付を全て列挙した別テーブルを用意するのが常道じゃね?
38NAME IS NULL:2008/05/20(火) 23:20:41 ID:???
検証はしてない。
っていうかこのテーブルの作りはないだろ・・・。

SELECT
TOP(5)
FROM
(
SELECT
 A.ADATE AS TDATE
FROM A A
WHERE A.AK = 1
 OR A.AK IS NULL

UNION

SELECT
 B.BDATE AS TDATE
FROM B B
WHERE B.BK = 1
 OR B.BK IS NULL
)T
T.TDATE < :指定日
ORDER BY
TDATE DESC
39NAME IS NULL:2008/05/20(火) 23:21:27 ID:???
5/7もいれるのか!
40NAME IS NULL:2008/05/20(火) 23:46:47 ID:???
>>29
> 表のとある項目から、後ろから3桁目の数字が0である項目を抜き出したい

そもそもその項目の型はなんなのよ?

文字列型なら >>31>>33 でいいと思う。

>>33 に「文字列の変換がヒント」とか書いてるとこみると数値型かな?

だとすると後から3桁目って要するに百の位を言ってるのか?

1桁や2桁しかない時 (要するに 99 以下) の時はどうするんだ?

要するにやりたいことをちゃんと書け。

>>35
select top 5 SDATE from (
 select ADATE as SDATE from A
 where to_date(指定日,'yyymmdd') <= ADATE and NVL(AK, 1) = 1
 union
 select BDATE as SDATE from B
 where to_date(指定日,'yyymmdd') <= BDATE and NVL(BK, 1) = 1
)
order by SDATE

Oralce には top がないかもしれないが、そこは自分で何とかするように。

# と言うか、A さんと B さんで別々の表になってるというその設計を見直した
# ほうがいいと思うが。
# せめて、フィールド名ぐらいはあわせるとか...。
41>>40:2008/05/20(火) 23:50:49 ID:???
>>37, >>39
> 2008/05/07 も結果に入れたいってところに無理があるような。

ほんとだ、見落としてたよ。

>>37 の言う通り、日付マスタ用意するかストアドで動的に生成する
ぐらいしか思いつかない。
4235:2008/05/21(水) 00:26:42 ID:???
皆さんレスありがとうございます。
そうなんです。
2008/05/07 も結果に入れたい仕様なんです^^;
未来方向に確実に入力するのかは客次第で致し方ないとして

私の、数少ない経験でも
歯抜けな複数のカレンダーって何事?
もーテーブル設計のミスとしか思えないのですが
客が既設に拘りテーブルの統合や新設(特にマスター系)を極端に嫌うので...
#マスターが増えれば自分の仕事が増えるからいやだと嫌がったので
#自動でマスターを更新しますって言っても聞きいれてもらえなかった
43NAME IS NULL:2008/05/21(水) 21:07:07 ID:???
やはり馬鹿がコンピュータを使うとろくな事がないな w
44NAME IS NULL:2008/05/21(水) 21:29:11 ID:nC22OcKa
とある企業サイトでこんな文がでてきました
これはSQLインジェクションとかセキュリティの脆弱性につながりますか?

ORA-24374: define not done before fetch or execute and fetch
select seq,title,to_char(reg_date,'YYYY.MM.DD'),read_cnt,contents,vc_text from tb_corp_news where seq =
45NAME IS NULL:2008/05/21(水) 22:21:20 ID:???
>>42
歯抜けがせいぜいn日、とか、AとBを組み合わせると歯抜けがなくなる、
ならどうにかなるのでは
46NAME IS NULL:2008/05/21(水) 23:20:35 ID:???
バカがコンピュータでやってくる
4735:2008/05/21(水) 23:49:16 ID:???
>>45 様ありがとうです。

レコードがまったくなくても
出勤扱いで指定日から5日は必要なのですトホホ...

やっぱSQL1発はむりですかね?

#取りあえず30日の未来方向をMAXとすることで
#了解を取り付けたのですが...
#客がやっぱ不味いよーっていいそうなので
#VB側で処理を組んでおくつもり^^;

48NAME IS NULL:2008/05/22(木) 00:21:18 ID:???
手入力の無い日は自動入力するような仕組みを入れたほうがいい。
49NAME IS NULL:2008/05/22(木) 00:34:43 ID:???
>>47
勝手な予想だが、再帰使えば何とかなるような気がする。

気のせいかもしれないけど。
50NAME IS NULL:2008/05/22(木) 00:35:14 ID:???
>>49
親フィールドってなによ?
51NAME IS NULL:2008/05/22(木) 20:06:24 ID:???
UNIONなどは使用せずに以下のような
結果を1回の問い合わせで取得することは可能でしょうか?

テーブルのデータ
Col1 Col2 Col3
------------ ------------- --------------
AAA 100 200

取得結果
Col1 ColA
------------ -------------
AAA 100
AAA 200


52NAME IS NULL:2008/05/22(木) 21:21:48 ID:???
検証なし。

SELECT
T.COL1,
CASE WHEN
ROWCOL%2 = 0 THEN T.Col2
ELSE
T.Col3
END ColA
(
SELECT
A.Col1,
A.Col2,
A.Col3
FROM TABLE A,
TABLE B
)T
53NAME IS NULL:2008/05/22(木) 21:25:31 ID:???
ROWCOLってなんだ・・・・
ROW_NUMBER() OVER(ORDER BY Col1)
の間違い。
54NAME IS NULL:2008/05/22(木) 21:45:43 ID:???
「UNION などは使用」しない理由を書いた方がいいんじゃないか。
55NAME IS NULL:2008/05/22(木) 21:50:35 ID:???
>>54
UNIONを使用したくない理由は
実際は該当のレコードを取得するのに
相当コストの高いSQLになってしまうので
検索を複数回実行させたくないからです。

ちなみにDBはSQL Serverです。

>>52さんのSQLで実験中です。

できなそうですかね?
56NAME IS NULL:2008/05/22(木) 22:13:35 ID:I7jcq5Mc
すみません、教えてください><

アクセスを使っている初心者です。
以下の表から、「結果」のような表示をするにはどうしたらいいでしょうか?
やりたいことは、
商品コード2に値がある場合、商品コード2 から商品名を呼び出して表示、
商品コード2に値がない場合、商品コード2 とその商品名を 空 で表示
したいのです。

今日一日探したのですが、方法がわかりませんでした。
外部結合とか、やってみたのですが、わかりません。

どうかお願いします。
(見にくくてすみません)

受注表

受注番号_:_顧客コード_:_商品コード1_:_商品コード2_:
---------------------------------------------------
10001____:___001______:___102______:___103_______:
10002____:___002______:___101______:_____________:
10003____:___003______:___101______:___102_______:


顧客表

顧客コード_:_顧客名
---------------------
001________:_KUROKIYA
002________:_ONSIDE
003________:_FIRST HOUSE


商品表

商品コード_:_商品名 :
---------------------
101________:_BEER___:
102________:_JUICE__:
103________:_TEA____:


結果

受注番号:顧客コード:顧客名:商品コード1:商品名:商品コード2:商品名:
-------------------------------------------------------------------------
10001___:___001____:_KUROKIYA_____:___102____:_JUICE__:___103______:_TEA__:
10002___:___002____:_ONSIDE________:___101____:_BEER___:____________:______:
10003___:___003____:_FIRST HOUSE:___101____:_BEER___:___102______:_JUICE:
57NAME IS NULL:2008/05/22(木) 22:18:52 ID:???
>>55
>>52はテーブルデータが2行のときしかうまくいかないんじゃないのか?
ちなみに俺はUNIONしか思いつかんけど。

>>56
「外部結合」のキーワードまで辿り着いてるのに何でできないんだ?
58NAME IS NULL:2008/05/22(木) 22:34:41 ID:???
>>56
外部結合をやってみた、その内容を書いてみてもらえますか?
59NAME IS NULL:2008/05/22(木) 22:35:31 ID:???
Jet って Left Outer Join ってできたっけ?
60NAME IS NULL:2008/05/22(木) 22:38:51 ID:???
Jetかどうかで左右されるレベルじゃなくね?
6156:2008/05/22(木) 22:47:53 ID:???
早速のレスありがとうございます!!!!

JOIN操作の構文エラーになります。↓
(そもそも違う部分が間違っているかもしれませんが…)

SELECT
受注表.受注番号,
受注表.顧客コード,
顧客表.顧客名,
受注表.商品コード1,
商品表.商品名,
受注表.商品コード2,
商品表.商品名
FROM
((受注表
LEFT JOIN 商品表
ON 受注表.顧客コード=顧客表.顧客コード)
LEFT JOIN 商品表
ON 受注表.商品コード1=商品表.商品コード)
LEFT JOIN 商品表
ON 受注表.商品コード2=商品表.商品コード
62NAME IS NULL:2008/05/22(木) 22:58:11 ID:???
お、>>52の改変でできたかも。(>>51のやつね。)
ただしテーブルデータが1行しかないときは無理。

select Col1,
    case RN when 1 then Col2 else Col3 end as ColA
from (select A.*,
       row_number() over (partition by A.Col1 order by A.Col2) as RN
   from "TableName" A, "TableName" B
   )
where RN <= 2
;

しかしまあCROSS JOINよりは素直にUNIONしたほうが速いだろうねえ。。。
6356:2008/05/22(木) 23:00:36 ID:???
まちがえました!

FROM の中、

((受注表
LEFT JOIN 顧客表
ON 受注表.顧客コード = 顧客表.顧客コード)

商品表ではなく、顧客表です。

しかし、商品コード2が空白のため、
えらーになってしまいます。

64NAME IS NULL:2008/05/22(木) 23:05:52 ID:???
>>63
商品表は2つ別々にJOINしないといけないからエイリアスがいる

select ...
受注表.商品コード1,
A.商品名,
受注表.商品コード2,
B.商品名
from 受注表
left join 顧客表 on ...
left join 商品表 A on 商品コード1 = A.商品コード
left join 商品表 B on 商品コード2 = B.商品コード
65NAME IS NULL:2008/05/22(木) 23:21:20 ID:???
>>55
UNIONのコストが高くなるのが嫌ならUNION ALLをつかいなさい。
66NAME IS NULL:2008/05/22(木) 23:24:52 ID:???
>>62のやつ、後ろのTableName Bを2行のダミーテーブルにすれば
意外と使えるかもしれんと、今ふと思った。
67NAME IS NULL:2008/05/22(木) 23:30:40 ID:???
SELECT
T.Col1,
T.ColA
FROM
(
SELECT
Col1,
Col2 AS ColA,
'1'
FROM
TABLE

UNION ALL
Col1,
Col3 AS ColA,
'2'
FROM
TABLE
)T
68NAME IS NULL:2008/05/22(木) 23:34:38 ID:???
>>55
> 相当コストの高いSQLになってしまうので

ちゃんと測定した?

って言う前に、そんなこと心配するならテーブル構造
見直した方がいいんじゃないかと...。
6956:2008/05/22(木) 23:46:58 ID:???
>>64
ありがとうございます!
何度もすみません、レスを拝見して、
SELECT ...
受注表.商品コード1, A.商品名,
受注表.商品コード2, B.商品名
FROM ((受注表
LEFT JOIN 顧客表...)
LEFT JOIN 商品表 A ON 商品コード1 = A.商品コード)
LEFT JOIN 商品表 B ON 商品コード2 = B.商品コード

と、書きましたが、うまくいきません。

「商品コード1 = A.商品コード」のところにフォーカスがあたって、
エラーになります。間違っているのはどこでしょう??(;_;)

70NAME IS NULL:2008/05/23(金) 01:13:11 ID:???
検証なし。
SELECT
受注表.商品コード1, A.商品名,
受注表.商品コード2, B.商品名
FROM ((受注表 J
LEFT JOIN 顧客表 K ON J.顧客コード = K.顧客コード)
LEFT JOIN 商品表 A ON K.商品コード1 = A.商品コード)
LEFT JOIN 商品表 B ON K.商品コード2 = B.商品コード
7156:2008/05/23(金) 01:49:54 ID:???
>>70
できました!!!!
これで眠れます(;_;)
本当にありがとうございました!!!!


SELECT
受注表.受注番号,
受注表.顧客コード,
顧客表.顧客名,
受注表.商品コード1, A.商品名,
受注表.商品コード2, B.商品名
FROM ((受注表 受注表
LEFT JOIN 顧客表 顧客表 ON 受注表.顧客コード=顧客表.顧客コード)
LEFT JOIN 商品表 A ON 受注表.商品コード1=A.商品コード)
LEFT JOIN 商品表 B ON 受注表.商品コード2=B.商品コード;
72NAME IS NULL:2008/05/23(金) 04:21:22 ID:psBkKcpD
ID,親のID,コンテンツ
というような構造でフォルダのような階層を表現しているとき、
あるIDを与えて、そこから上の階層のIDを一気に取得する方法ってありますか?
ファイルのパスを取得するような形です。
73NAME IS NULL:2008/05/23(金) 04:33:28 ID:???
>>72
「SQL CONNECT BY」あたりでググる。
74NAME IS NULL:2008/05/23(金) 04:52:24 ID:psBkKcpD
>>73
ありがとう。
7555:2008/05/23(金) 17:15:09 ID:???
結局>>67みたいなSQLで処理することにしました。

>>68さん
実行プランで測定しましたよ。
実行時間も抽出に2分くらいかかります。

テーブル定義は既存システムの改修なので手が出せません。

みなさん、いろいろありがとうございました。
76NAME IS NULL:2008/05/23(金) 17:33:13 ID:???
ORACLE10g(10.1.0.2.0)使ってます

こんなのあるとしまつ。
SELECT TRUNC(num * rate, 0) FROM DUAL;

変数内を見ると
num=3600000
rate=0.37777777777・・・・

返ってくる値は、1360000
なぜにと思い、つらつらやっていると


SELECT TRUNC(3600000 * 0.37777777777777777777777777777777777777, 0) FROM DUAL;
----------
1359999

SELECT TRUNC(3600000 * 0.377777777777777777777777777777777777777, 0) FROM DUAL;
----------
1360000

これって何でですの?
77NAME IS NULL:2008/05/23(金) 17:40:50 ID:???
単なる浮動小数点演算の誤差だろJK
7876:2008/05/23(金) 18:39:36 ID:???
>>77
あれだと、Numberで38桁、、、誤差だろJK
で話終わっちゃうよなぁ確かに。
79NAME IS NULL:2008/05/23(金) 21:27:07 ID:???
Oracleだからという話ではないな。
80NAME IS NULL:2008/05/23(金) 23:26:36 ID:???
IEEE754でぐぐると何か分かるかも
81NAME IS NULL:2008/05/24(土) 02:00:03 ID:???
そんなアメリカの規格、知りませんのだ(><)
8276:2008/05/24(土) 02:09:41 ID:???
>>80
オイラ宛てでしたか。退社直後でした。すみません。
調べておくですわ。

データ30万件強のうち数件程度ありやがったが
ダメな場合の法則性みたいのが分かんね。
83NAME IS NULL:2008/05/24(土) 02:23:58 ID:???
有効桁数というか、精度というか。
ま、テストデータ作ればすぐ分かるよ。
8476:2008/05/24(土) 04:25:51 ID:???
>>83
というか、ナンバー型とフロート型を掛けたらナンバー型に暗黙変換かかって
切り捨て部分が四捨五入になった
でいいっすか。

これで月曜の報告はのりきろうかと。
ついでに電卓片手に1円違うというのは勘弁してと言うわ。
85NAME IS NULL:2008/05/24(土) 13:42:17 ID:???
>>84
銀行は1円合わないと銀行内を怒号が飛び交うというのに。
金がらみのシステムやるなら1円の差を馬鹿にしてはいけないよ。
86NAME IS NULL:2008/05/24(土) 13:44:41 ID:???
つーか完全に仕様不備ですな
87NAME IS NULL:2008/05/24(土) 14:58:51 ID:???
Oracle的には仕様で、使う側が勘違いしている典型的な例だな。
88NAME IS NULL:2008/05/24(土) 15:23:06 ID:???
>>74
勘定系ならその言い訳した時点で全てが終わる。
素直にあやまっとけ。
89NAME IS NULL:2008/05/24(土) 15:33:58 ID:???
勘定系やってるヤツでこんなバカいたらマッハでクビになると思うが。
90NAME IS NULL:2008/05/24(土) 16:44:59 ID:???
IEEE754じゃなくて十進化浮動小数点の問題だろう。
指数部が10進数としての仮数部の小数点の位置を示すタイプの型。
Truncする前に既に 1359999.999... が丸まって桁が上がってるものと思われる。

91NAME IS NULL:2008/05/24(土) 17:46:16 ID:/or0WR4U
質問です。SQL Server 2005を使用しています。
aテーブルの行を並び替える時に
bテーブルの内容に左右されて
結果を表示したいのですが、どんなSQL文があるのでしょうか?

aテーブル
No Class Num Data
-----------------
1  A    03  data
2  A    01  data
3  A    02  data
4  B    01  data
5  B    02  data
6  C    03  data
7  C    04  data
8  C    01  data
9  C    02  data

bテーブル
Class ClassLevel
-----------------
A     2
B     3
C     1

結果
8 C 01 data
9 C 02 data
6 C 03 data
7 C 04 data
2 A 01 data
3 A 02 data
1 A 03 data
4 B 01 data
5 B 02 data

よろしくお願い致します。
92NAME IS NULL:2008/05/24(土) 17:49:42 ID:???
>>91
結合して ORDER BY
93NAME IS NULL:2008/05/24(土) 18:31:38 ID:???
検証なし。
SELECT
 A.No,
 B.Class,
 A.Num
 A.Data
 FROM
  a A,
  b B
 WHERE
  A.Class = B.Class
 ORDER BY
  B.Class,
  A.Num

INNER JOINでもいい
94NAME IS NULL:2008/05/24(土) 18:35:44 ID:???
検証なし。INNER JOIN
SELECT
 A.No,
 B.Class,
 A.Num
 A.Data
 FROM
  a A INNER JOIN b B
    ON A.Class = B.Class
 ORDER BY
  B.Class,
  A.Num
95NAME IS NULL:2008/05/24(土) 21:08:03 ID:???
>>85
あはぁん、言われるような気がしたわ

他からも指摘されてるので皆にも謝っておくわ、すまん

あんま詳しく書けんが今回はヘッダにしかない金額を明細へある比率で振り分け、余った金額は1件目に乗っけるってとこで
幸い総額は誤りがないのと明細毎で出す金額じゃないんで特に問題になってない

が、なんでこうなるのかって説明は自分もそうだが聞いてる方もついてこれんと思う

96NAME IS NULL:2008/05/24(土) 22:15:31 ID:???
>余った金額は1件目に
むかし、実際の事件で銀行の金利計算で、小数点第1位以下を全部自分の口座に送るという
プログラムを作った奴がいてな、
その発見されかたも面白いんだが、小数点以下まできっちり計算する強欲なおばあさんの指摘でわかったそうだ。
97NAME IS NULL:2008/05/24(土) 23:09:27 ID:???
サラミうめえw
98NAME IS NULL:2008/05/24(土) 23:43:01 ID:???
俺、ビーフジャーキー
99NAME IS NULL:2008/05/24(土) 23:45:15 ID:???
>95
勘定系で端数がある場合は明細サマリと総額とが合わない前提で「雑損雑役」とかに仕訳すると思われる。
無理して合わせてると却って会計担当者から指摘されそうな気が
100NAME IS NULL:2008/05/25(日) 00:49:35 ID:???
>>96
それ知ってる。
むかしかぁ、リアルタイムだったな確か。

金額が大きすぎて怖くなったと新聞に出てたんで、自首だと思ってたわ
101NAME IS NULL:2008/05/25(日) 09:05:30 ID:???
多通貨会計なシステムやっていると端数の問題はかならず出てくるんだけど、
その端数用の勘定科目を用意してちゃんと説明しないと、
監査の時にウダウダ言われる。

ただまあ、日本円だけで動いているシステムならそれくらいちゃんとヤレって希ガス
102NAME IS NULL:2008/05/25(日) 11:47:54 ID:???
>>100
あの手の事件は一回だけじゃなくて、外国とかも含めていくつかある。
103NAME IS NULL:2008/05/25(日) 11:51:51 ID:???
>>102
とてつもない金額になるんだろうね。
104NAME IS NULL:2008/05/25(日) 18:24:36 ID:???
Mysql4.0で
2008-07-31
2009-06-31
2008-10-31
というレコードがあります。
ある基準日からのこのレコードとの差分日数の合計値を割り出したいのですが、
どのようなSQL文を使えば可能でしょうか?

たとえば、基準日を2008-06-30とした場合、
上記3つのレコードの場合、求めたい答えは
2008-07-31 - 2008-06-30 = 31
2009-06-30 - 2008-06-30 = 365
2008-10-31 - 2008-06-30 = 123
で519日となります。
105NAME IS NULL:2008/05/25(日) 19:06:59 ID:???
検証なし
SELECT
DATEDIFF(expr,expr2)
106NAME IS NULL:2008/05/25(日) 19:25:43 ID:???
>>104
SUM(TO_DAYS(DateColumn) - TO_DAYS(基準日))
107NAME IS NULL:2008/05/25(日) 19:49:54 ID:???
検証なし

SELECT
SUM(A.DAYS)
FROM
(
SELECT
 DATEDIFF(:基準日,T.COL:) AS DAYS
TABLE T
)A
108NAME IS NULL:2008/05/26(月) 13:20:37 ID:???
oracle使ってます。

ID1   ID2
001   001
001   002
001   003
001   004
002   005
002   006
……   ……

という表があって、このあとID1はランダム、ID2はそのまま続きます。
その中でID1が複数ある場合を抜き出すにはどうすればいいですか?
109NAME IS NULL:2008/05/26(月) 13:42:03 ID:???
その例で言うと、実際に抜き出すとどういうデータになるの?
110NAME IS NULL:2008/05/26(月) 23:10:38 ID:???
エスパー&検証なし
SELECT
T.ID1,
T.ID2
FROM
TABLE T
HAVING COUNT(ID1) > 1
111NAME IS NULL:2008/05/26(月) 23:25:59 ID:???
「検証なし」の人の回答がほぼ毎回間違っている件
112NAME IS NULL:2008/05/26(月) 23:31:59 ID:???
発言通りじゃないですか。
113NAME IS NULL:2008/05/27(火) 02:30:55 ID:???
>>111
しかもエスパーだから手がつけられないな
スプーン曲げます!って言ったら胴体が切断されるぜ
114NAME IS NULL:2008/05/27(火) 03:10:33 ID:???
>>110
GROUP BY ...
無理に書かなくてもいいんじゃ?
115NAME IS NULL:2008/05/27(火) 10:38:49 ID:???
質問者のあいまいなところを無理やり解釈したところがエスパーなんだろうけど
答え出ないから質問者の意図した通りかも検証できないなw
11691:2008/05/27(火) 11:33:41 ID:98WRggUu
>>92,93,94
ありがとう!!!
117NAME IS NULL:2008/05/27(火) 17:30:05 ID:+iz1hIp5
MySQL

tableA
A_ID name_v1 ...
-----------
1   あいうえお
2   かきくけこ
3   さしすせそ
4   たちつてと
5   なにぬねの


tableB
B_ID name_v2 A_ID_copy ...
-----------
1  カキクケコ 2
2  ナニヌネノ 5
3  アイウエオ 1
4  タチツテト 4
5  サシスセソ 3

A_ID は A_ID_copyと対応しています。
tableA.name_v1をlike %検索文字列% で絞込みし、それに対応したIDのものだけをtableBから引っ張りたいのですが
実際に何か文字列を入れて走らせると関係のないレコードまで引っかかってしまいます。

すぐに思いついたのは次です。 ついでにname_v1も欲しいのでそれも加えてあります。
select
  tableB.B_ID, tableB..... (select tableA.name_v1 from member where tableA.A_ID = tableB.B_ID) as A_name
from
  tableA, tableB
where
  tableA.name_v1 like '%検索文字列%'
;

神様ご教示お願いします。
118NAME IS NULL:2008/05/27(火) 17:37:58 ID:???
文字コードの設定どうなってる?
119NAME IS NULL:2008/05/27(火) 18:00:23 ID:+iz1hIp5
>>118
OSは近年のFedoraでecho $LANGするとja_JP.UTF-8

MySQLのmy.cnfにもdefault-character-set=utf-8

PHP(SymfonyのCriteria)から叩いていますが、php.iniはちょっと怪しい
;mbstring.language = Japanese
;mbstring.internal_encoding = UTF-8
;mbstring.http_input = auto
;mbstring.http_output = Shift_JIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
;mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_encoding = On

怪しいとはいえ、Criteriaにぶち込む直前の検索文字列の文字コードを出力
したらUTF-8と出ました。

また、tableB.name_v2をlike '%ほげ%' で検索している処理はうまく動いているので
文字コードは大丈夫なんじゃないかと。 後だし情報失敬。
120NAME IS NULL:2008/05/27(火) 18:30:18 ID:???
>A_ID は A_ID_copyと対応しています。
>tableA.name_v1をlike %検索文字列% で絞込みし、それに対応したIDのものだけをtableBから引っ張りたいのですが

これだけだったら
select B_ID from tableB as B inner join tableA as A on (A.A_ID = B.A_ID_copy)
where (A.name_v1 like '%検索文字列%')
だけの話だと思うが、何故にサブクエリ…
121NAME IS NULL:2008/05/27(火) 18:49:19 ID:???
select * from tableB where A_ID_copy in (select A_ID from tableA where name_v1 like '%検索文字列%')
むしろこうするけどな。
122NAME IS NULL:2008/05/27(火) 20:07:39 ID:???
>>121
コスト意識しようぜ
123NAME IS NULL:2008/05/27(火) 21:07:58 ID:+iz1hIp5
>>120-122
ありがとうございます。
明日会社に着き次第試してみます。
124NAME IS NULL:2008/05/27(火) 21:18:37 ID:???
>>122
え?>>120>>121はlikeで複数レコードにマッチした場合の挙動違うよ。
distinctつけないと同じにはならないし、求める結果はdistinct付きのほうでしょ?
そうするって事はソートのコストがかかるよね?
125NAME IS NULL:2008/05/27(火) 21:32:50 ID:???
と思ったが、Bの内容も抽出したいのね。俺がバカでした。
126NAME IS NULL:2008/05/27(火) 21:33:56 ID:???
Aだし。吊ってくるorz
127NAME IS NULL:2008/05/27(火) 21:41:58 ID:???
何が言いたいのかよく分からんが
select B.* from tableB as B inner join tableA as A on A.A_ID = B.A_ID_copy where A.name_v1 like '%検索文字列%'

select * from tableB where A_ID_copy in (select A_ID from tableA where name_v1 like '%検索文字列%')
は一緒だろ?
後者のほうが遅そうってのは確かだけど。

ちなみに前者より
select B_ID from tableB as B inner join (select A_ID from tableA where name_v1 like '%検索文字列%') as A on A.A_ID = B.A_ID_copy
のほうがさらに速いかもしれん。(変わらんかもしれん。)
128123:2008/05/28(水) 13:48:53 ID:???
試してみました。
どれも何とか使えそうです。
今回は>>120のを改変して使わせていただきます。

データが数件しかないのであまり参考になりませんが、
>>121のが、他のクエリよりも5〜10msほど遅いようです。
>>120>>127の三つ目はほとんど変わらないっぽい。

本当に助かりました。
ありがとうございます。
129NAME IS NULL:2008/05/28(水) 15:02:12 ID:???
>>128
Aの複数レコードにマッチするような検索してみるとどうなる?
%だけでもいいけど。
130NAME IS NULL:2008/05/28(水) 19:28:04 ID:???
下記2種のテーブルを使い、
期間を指定してID毎に、上半期(1〜6月)の合計、下半期(7〜12月)の合計を
実行結果のような感じで表示させたいですがどうすればよいでしょうか?
勉強始めてつまってしまいました。
オラクルです

■SYAIN TABLE
----------------
ID NAME
----------------
1 aaaa
2 iiii
3 uuuu
4 eeee

■JUCHUU TABLE
---------------------------
ID YEAR MONTH SAL
---------------------------
1 2000 4 1000
1 2000 4 2000
1 2000 8 1500
2 2000 4 1000
2 2000 8 1000
3 2000 1 1000
4 2001 2 2000
4 2002 7 1000
5 2008 12 2000

■実行結果
-----------------------------------------
ID NAME KAMIHANKI SIMOHANKI
---------------------------------------
1 aaaa 3000 1500
2 iiii 1000 1000
3 uuuu 2000
4 eeee 2000 1000



*期間を指定してID毎に合計することはできました。

SELECT SYAIN.ID , SYAIN.NAME,
SUM(JUCHUU.SAL)
FROM SYAIN LEFT JOIN JUCHUU ON SYAIN.ID = JUCHUU.ID
WHERE (YEAR||LPAD(MONTH,2,0)) >= 20001
AND (YEAR||LPAD(MONTH,2,0)) <= 200501
GROUP BY SYAIN.ID,SYAIN.NAME,SYAIN.BUSHO_ID,JUCHUU.YEAR,JUCHUU.MONTH

----------------------------
ID NAME SUM(JUCHUU.SAL)
------------------------------
1 aaaa 4500
2 iiii 2000
3 uuuu 1000
4 eeee 3000
131NAME IS NULL:2008/05/28(水) 19:40:05 ID:???
132NAME IS NULL:2008/05/28(水) 20:18:57 ID:???
さすがに>>4だけじゃアレなんでもう少しヒント:
sum(case when MONTH <= 6 then SAL else 0 end) as KAMIHANKI

ところで例えば2000年の上期と2001年の上期は足すんか?

あと、その例だとLEFT JOINはINNER JOINでも一緒。
(そのWHERE句だとJUCHUU側がNULLのものは消えちゃう。)
それと、GROUP BY書きすぎ。
133NAME IS NULL:2008/05/28(水) 22:25:05 ID:???
検証有り(MS)
期間指定せず、社員毎年毎半期毎の合計値
SYAINは適当にinner joinしてくれ

SELECT
 T.ID,
 T.YEAR,
 SUM(T.KAMIHANKI) AS KAMIHANKI,
 SUM(T.SIMOHANKI) AS SHIMOHANKI
FROM
(
  SELECT
    J.ID,
    J.YEAR,
    CASE WHEN J.MONTH < 6 THEN SUM(J.SAL) ELSE 0
    END KAMIHANKI,
    CASE WHEN J.MONTH > 6 THEN SUM(J.SAL) ELSE 0
    END SIMOHANKI
   FROM JUCHUU J
   GROUP BY
    J.ID,
    J.YEAR,
    J.MONTH
 )T 
 GROUP BY
  T.ID,
  T.YEAR
134NAME IS NULL:2008/05/28(水) 23:12:13 ID:???
検証ありでも間違っている件
135NAME IS NULL:2008/05/29(木) 00:46:09 ID:???
あってんじゃね?
136NAME IS NULL:2008/05/29(木) 00:56:27 ID:???
ヒント:6
137NAME IS NULL:2008/06/01(日) 00:12:33 ID:???
上半期でも下半期でもない6月になりましたよ。
138NAME IS NULL:2008/06/01(日) 00:17:00 ID:???
6月のことはなかったことに
139NAME IS NULL:2008/06/01(日) 15:31:08 ID:???
ID | NAME | OLD_ID
--+-----+------
1 | taro  | 0    
2 | jiro   | 1    
3 | saburo | 2    
4 | shiro  | 0    
5 | goro   | 3    

上のようなテーブルから、以下のように
OLD_IDが0でなければ、OLD_IDに対応するNAMEを出力
OLD_IDが0ならば、かわりに(たとえば)空白文字を出力

a.ID | a.NAME | a.OLD_ID | b.NAME
---+-------+-------+---------
1   | taro    | 0     | ""
2   | jiro     | 1     | taro
3   | saburo  | 2     | jiro
4   | shiro   | 0     | ""
5   | goro    | 2     | jiro

というSQL文を作りたいのですが、どのように分岐させたらよいでしょうか。
環境はMySQL5.0です。よろしくお願い致します。
140NAME IS NULL:2008/06/01(日) 15:33:39 ID:???
>>139
元の表を訂正

ID | NAME | OLD_ID
--+-----+------
1 | taro  | 0    
2 | jiro   | 1    
3 | saburo | 2    
4 | shiro  | 0    
5 | goro   | 2 ←3ではなく2でした
141NAME IS NULL:2008/06/01(日) 16:15:15 ID:???
>>139
case
142NAME IS NULL:2008/06/01(日) 16:36:48 ID:???
検証なし。
MySQLは使ったことが無い。
NVL、ISNULLに対応するのがIFNULLらしい。

SELECT
  T1.ID,
  T1.NAME,
  T1.OLD_ID,
  IFNULL(T2.NAME,'')
 FROM
 TABLE T1 LEFT JOIN TABLE T2 ON
 T1.OLD_ID = T2.ID
143NAME IS NULL:2008/06/01(日) 16:56:03 ID:???
>>142
nullじゃなくて「0」。

case T1.OLD_ID when '0' then '' else T2.NAME
144NAME IS NULL:2008/06/01(日) 17:00:34 ID:???
>>142
> MySQLは使ったことが無い。

それ以前に、回答するレベルじゃない。

JOIN が必要かどうか >>139 をちゃんと読み直すように。
145NAME IS NULL:2008/06/01(日) 17:04:09 ID:???
JOIN は必要だろ?
146NAME IS NULL:2008/06/01(日) 17:34:45 ID:???
JOINは要るな。つーかこういうケースは>>142で十分じゃね?
何かの間違いでIDが0のレコードが入らない限りは
147>>145:2008/06/01(日) 17:41:15 ID:???
>>142, >>145-146
ああすまん、全然勘違いしてた。m(_._)m
148>>144:2008/06/01(日) 17:43:02 ID:???
名前欄間違ってるし... orz
>>145>>144
149NAME IS NULL:2008/06/01(日) 18:56:37 ID:???
>>141-148
>>142さんのSQL文で動きました
どうもありがとうございました
150NAME IS NULL:2008/06/01(日) 20:24:16 ID:???
151NAME IS NULL:2008/06/01(日) 21:07:03 ID:???
アッー!
152NAME IS NULL:2008/06/03(火) 19:41:01 ID:???
1から研修中の者です。

先輩同士が、SUMをかけるか否かという話をしている時に、
「かけてもかけなくても結果は同じだろうし、
主キーとの関係から考えても、このカラムはGROUP byに入れない方がいい」と言っているのを盗み聞きました。

主キーとGROUP化との関連なんてあるんですか?
盗み聞いたもので、情報も少ない上、先輩にも聞けなくて困ってます。
153NAME IS NULL:2008/06/03(火) 19:49:45 ID:???
>>152
予想されることはいくつかあるが、ここで聞くには情報不足。
その先輩とやらに確認して来い。
154152:2008/06/03(火) 19:56:48 ID:???
>>153
そこを何とか・・・。
ヒントとか、キーワードだけでいいんで、お願いします・・・。
先輩と言っても、完全な自社の人じゃなくて、
ちょっと聞きにくすぎます・・・。
155NAME IS NULL:2008/06/03(火) 20:24:29 ID:???
>>152
情報が少ないんでしょ?で、こっちは研修内容すら知らないわけで、
>>152よりも情報が少ない状態だ。
それでなにをどうすればいいんだ?
SUMをかけるか否かという議論に対して、どちらでも結果は同じって
意見が出るような元の状態が把握できない。
156152:2008/06/03(火) 20:45:08 ID:jK/ipXPe
ですよね・・・すみません。
お時間とらせてしまって申し訳ないです。
ありがとうございました。
157NAME IS NULL:2008/06/03(火) 20:50:59 ID:???
GroupByに入れても入れなくてもSumに影響はない→一意に特定する為のキーではない
GroupByは全表走査されるからindexがない(と思われる)ものは入れたくない
158NAME IS NULL:2008/06/03(火) 22:05:16 ID:???
オラクル使ってます。

アクセスした日付のうち平日だけ抽出しろということなんですが、

表1                 表2
アクセス日時           休日
------------------------------------------
08/01/01/00:00:00 08/01/01
08/01/11/12:12:12 08/01/02
……                ……
------------------------------------------

という感じで表1と2で日時の表記が違う上に結合が出来なくて困ってます。
なぜ結合が出来ないかというと、それもまた同じ理由で時間まで表記されているものとそうでないものがあるからです。
どうぞご教授ください。
159NAME IS NULL:2008/06/03(火) 22:08:12 ID:???
>>158
日付が文字列で入ってるってこと?
to_dateで変換して結合できないかな。
160NAME IS NULL:2008/06/03(火) 22:08:55 ID:???
必要な部分だけ切り取る or 付け加える
161NAME IS NULL:2008/06/03(火) 22:27:09 ID:???
>>159
date型なんですが、どうやらあとから追加したものらしく昔の記録は日付までしか入ってないんですよね。
それが理由で結合できないっぽいです。

>>160
そのやり方がわからなくて_| ̄|○
TRUNCを使うとか……
162NAME IS NULL:2008/06/03(火) 22:31:20 ID:???
左から8桁 substring で切り取って、TO_DATE してでOKだろ?
163NAME IS NULL:2008/06/03(火) 22:40:10 ID:???
>>161
平日だけ抽出したベタのアクセスログが欲しいのか
平日だけ抽出してから何らかの集計をするのか。

前者なら両方to_charでYY/MM/DDとしてからJOINするしかないような
気がするけど、後者なら日ごとに一旦集計してからJOINすれば速いかも。
164NAME IS NULL:2008/06/03(火) 22:40:58 ID:???
Oracleにdate_truncって無いのかな?
date_trunc('day',表1.アクセス日時) = date_trunc('day',表2.休日)
なんで平日だけ抽出するのに休日のカラムと結合するのかは知らんが。
165NAME IS NULL:2008/06/03(火) 22:47:11 ID:???
>>162
メモった。

>>163
平日にアクセスした数が知りたいんです。
イメージ的には全アクセス-休日=平日という感じ。

>>164
休日しかないからです_| ̄|○
166NAME IS NULL:2008/06/03(火) 22:47:47 ID:???
>>164
休日マスタと外部結合して、休日じゃないなら平日ってことかと。
祝祭日とか、組織固有の休日とかあるし。
167NAME IS NULL:2008/06/03(火) 22:48:54 ID:???
結合というか、not in (select ...) でいいな。
168NAME IS NULL:2008/06/03(火) 22:54:07 ID:???
not inなんか使うSEとかPGとは仕事したくない
169NAME IS NULL:2008/06/03(火) 22:56:16 ID:???
>>168
なんで?
170NAME IS NULL:2008/06/03(火) 22:59:05 ID:???
>>166
Exactly

>>167
出来ればそうしたいんです(´・ω・`)
171NAME IS NULL:2008/06/03(火) 23:08:27 ID:???
>>168
俺も気になる。なんで?
172NAME IS NULL:2008/06/03(火) 23:12:44 ID:???
where not exists (
select * from 休日
where 休日の日付 = to_date(to_char(アクセス日時, 'YY/MM/DD'), 'YY/MM/DD')
)

とかは?
173NAME IS NULL:2008/06/03(火) 23:29:33 ID:???
not in とかパフォーマンスは少し考えれ
174NAME IS NULL:2008/06/03(火) 23:36:08 ID:???
>>173
それじゃ、今回のケースはどうすんの?
175NAME IS NULL:2008/06/04(水) 00:01:02 ID:???
(NOT) IN は基本的にテーブルスキャンだからだろ。
抽出したいテーブルの各行毎に、条件判断でテーブルスキャンする。

で、大概 (NOT) EXISTSに置き換え可能。こちらもインデックスが効かないと
テーブルスキャンしてしまうけどな。

SELECT * FROM 表1 WHERE NOT EXISTS
(SELECT * FROM 表2 WHERE 表2.休日 = CAST(表2.アクセス日時 AS DATE));

表2.休日 にインデックスを張ってればいい。
176NAME IS NULL:2008/06/04(水) 00:01:19 ID:???
>>174
not inはほとんどの場合(NULLを考慮する必要がない場合)、
not existsに書き換え可能。
そしてほとんどの場合not existsのほうが速い。

最近のオプティマイザは賢いから速度は変わらない場合もあるけど
まあひとつのセオリーだし。
177175:2008/06/04(水) 00:07:32 ID:???
間違えた(´・ω・`)
SELECT * FROM 表1 WHERE NOT EXISTS
(SELECT * FROM 表2 WHERE 表2.休日 = CAST(表1.アクセス日時 AS DATE));

訂正ついでに、この場合は表2.休日がDATE型の場合な。
表2.休日がTIMESTAMP型だったり文字列型だったりする場合は
DATE型に変換する関数インデックスをはっとく。
178172:2008/06/04(水) 00:23:15 ID:???
>>177
ORACLEってDATE型に時分秒はいってるんでないの?
んで、date_truncもないっぽいのでto_date(to_char())としたんだけど。。
勘違いも甚だしかったかしらorz
179NAME IS NULL:2008/06/04(水) 00:41:39 ID:???
Oracle の DATE 型には時分秒が入る。
date_trunc はないけど、trunc で時分秒を切り捨てられる。
180175:2008/06/04(水) 00:46:57 ID:???
>>178
いや、俺もOracle使いじゃないので...。

>>179
DATE型に時分秒が入るとなると表2.休日もtruncしておいた方が良さそうだな。
181NAME IS NULL:2008/06/04(水) 01:55:00 ID:???
>>179
なる。truncってのがあるのね。
それ使ってやるのがらくぽ。
182NAME IS NULL:2008/06/04(水) 13:56:16 ID:???
158です。
177さんのやり方でできました。
みなさんありがとうございます。

んが、追加の課題が。
これは月毎の数を出さないといけないのですが(count(アクセス))、また別の表のフラグ(表3.flag=0……有効)に合致してないといけないのです。
さらに、それがその月にちゃんと動いてたかどうか(例えば2001年1月時点)を見ろといわれて涙目。
普通にflag=0だと現時点だから当時がどうだったかを出せと。


\(^o^)/
183NAME IS NULL:2008/06/04(水) 14:13:56 ID:???
>>182
>>177のやり方でできたんだ?
オラクルのバージョンとかによるのかな。>DATE型に時分秒の件

当時がどうだったかを出すのはよくあることだね。履歴もってる?
無いなら無理ぽいかなー
184NAME IS NULL:2008/06/04(水) 23:39:00 ID:???
履歴ないと無理だろ
185NAME IS NULL:2008/06/05(木) 16:00:33 ID:Qw3M5a9X
第1キーは重複可能、第2キーは第1キーに対して
重複不可みたいなテーブルを作りたいのですが
テーブル制約で指定可能ですか?
DBMS:SQL Server2000

可能な場合どうしていすればいいのでしょう?


第1キー:第2キー
A a
A b
A c
A d
B a
B a←これを弾きたい
B b
B c

186NAME IS NULL:2008/06/05(木) 16:12:01 ID:???
>>185
その2列をキーにすればいいだけかと
187NAME IS NULL:2008/06/05(木) 16:25:08 ID:???
>>186
ほんとだ!できた!
ありがとうごじゃいます。
知らなかったです。。
188NAME IS NULL:2008/06/05(木) 16:25:31 ID:0y2BUk44
AUTO_INCREMENTでIDを自動挿入しています。
ここで質問なんですが、あるタプルをdeleteしたらそこの番号が空白になりますよね?
一覧表示したときにIDも表示してると歯抜けになって格好悪いのですが、
IDを詰めることはできませんか?
それとも気にするべきではありませんか?
189NAME IS NULL:2008/06/05(木) 17:41:05 ID:???
>>188
気にするべきではありません

空き番号を管理したいなら削除した空き番号を管理するテーブルが必要になる。
そういった種類のIDを管理したいなら独自に番号管理のための仕掛けを持つべきで、
オートナンバーを使うべきではない。
190NAME IS NULL:2008/06/05(木) 18:34:45 ID:xXH7eX/Q
だね。
言い換えると、AUTO_INCREMENTは行削除された事を残す仕組みでもある。
191NAME IS NULL:2008/06/05(木) 20:08:57 ID:???
>>188
抽出時に連番がほしいなら連番が出るようなクエリを書けばいいと思う
192NAME IS NULL:2008/06/06(金) 11:15:54 ID:???
oracle使ってます。


データの取得をbetweenなどを使って手動でやっていたのですが、先月分を自動的に取得できるようにしろといわれました。
where句の中でどうすればいいか困っています。
ご教授よろしくお願いします。
193NAME IS NULL:2008/06/06(金) 12:00:59 ID:???
>>192
WHERE to_char(日時, 'YY/MM') = to_char(now(),'YY/MM');
194NAME IS NULL:2008/06/06(金) 12:04:40 ID:???
また違った、先月分だったな...orz
WHERE to_char(日時, 'YY/MM') = to_char(now()-interval'1 month','YY/MM');
Oracle使いじゃないので書式は違うかも。
195NAME IS NULL:2008/06/06(金) 13:44:30 ID:???
>>193-194
ありがとうございましたー。
いいヒントになって助かりました。
196NAME IS NULL:2008/06/06(金) 16:27:34 ID:???
上の人に便乗して。
オラクル使ってます。

毎週月曜に実行するSQLがあるとして、自動的に先週分のデータを取得するにはどうすればよろしいでしょうか?
to_charを使ってやりたいのですが予約語がわからず_| ̄|〇
197NAME IS NULL:2008/06/06(金) 16:30:26 ID:???
予約語がわからないってヘルプぐらい読めよ・・・
198NAME IS NULL:2008/06/06(金) 16:40:35 ID:???
>>196
思いつき、年をまたぐ週に難あり。
WHERE EXTRACT(week FROM 日時) = EXTRACT(week FROM now()-interval'1 week');
OracleにEXTRACTが無かったらdate_part()を試してみて。
199198:2008/06/06(金) 16:49:58 ID:???
疑問と老婆心
date_trunc()があれば年をまたいでいても問題ないのだけど、
WHERE date_trunc('week' , 日時) = date_trunc('week' , now()-interval'1 week');
Oracleのtruncって週単位の切り捨ては出来ないのだろうか?
200NAME IS NULL:2008/06/06(金) 20:54:14 ID:???
おまいら何でマニュアル見ないんだ?
ttp://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-02/toc.htm

先月1日: trunc(add_months(sysdate, -1), 'MONTH')
今月1日: trunc(sysdate, 'MONTH')
先週のはじめの日: trunc(sysdate - 7, 'DAY')
今週のはじめの日: trunc(sysdate, 'DAY')
201NAME IS NULL:2008/06/06(金) 23:02:10 ID:???
ごめんね、oracleほとんどしらないから、ごめんね
202NAME IS NULL:2008/06/07(土) 19:23:44 ID:???
環境:WindowsXP Access2003

以下のテーブル構成から

役職1列目 役職2列目 役職3列目 名前 住所
○商事○課 ○係係長 田中一郎 東京都
△電器△部 △課 課長 佐藤三郎 大阪府

という結果を得るクエリを作成したいのですが、
どういうSQLを書いていいのかわかりません

個人テーブル
個人ID 氏名 住所
1 田中一郎 東京都
2 鈴木二郎 神奈川県
3 佐藤三郎 大阪府
4 加藤四郎 北海道

所属テーブル
個人ID 所属ID ハガキ
1 11 TRUE
2 12 FALSE
3 13 TRUE
4 14 FALSE
ハガキのYesNo型はハガキを送るか送らないかを表しています

役職テーブル
所属ID 所属部署 順序 列
11 ○商事 1 1
11 ○課 2 1
11 ○係 3 2
11 係長 4 2
12 ×建設 1 1
12 ×部 2 2
12 部長 3 2
13 △電器 1 1
13 △部 2 1
13 △課 3 2
13 課長 4 3
順序の数字は役職の順番(所属ID 12の場合、×建設 ×部 部長が、
×部 ×建設 部長 等とならない様に)列はハガキに役職を書くときに
役職をどこで改行するかを表しています

個人テーブルと所属テーブルを分けている理由は、同じ人が違う部署に
重複して属している場合があるからです
所属テーブルと役職テーブルを分けている理由は、役職を全く持たない(例えば所属ID 14)人、
役職を5つ持つ人がいる、また、会社や役職で検索するためです

質問が不慣れなため、前提条件など足りないかもしれませんが、
指摘して頂ければ説明させて頂きますのでよろしくお願いします
203NAME IS NULL:2008/06/07(土) 19:46:21 ID:???
>>202
役職テーブルの設計が、おかしいんじゃね。まぁそれはおいといて、

SELECT
(SELECT 所属部署 FROM 役職テーブル WHERE 所属ID=所属テーブル.所属ID AND 順序=1) AS 役職1列目,
(SELECT 所属部署 FROM 役職テーブル WHERE 所属ID=所属テーブル.所属ID AND 順序=2) AS 役職2列目,
(SELECT 所属部署 FROM 役職テーブル WHERE 所属ID=所属テーブル.所属ID AND 順序=3)||
COALESCE ((SELECT 所属部署 FROM 役職テーブル WHERE 所属ID=所属テーブル.所属ID AND 順序=4),'') AS 役職3列目,
氏名,住所
FROM 個人テーブル JOIN 所属テーブル USING (個人ID) WHERE ハガキ=TRUE;

Access使いでもないので、参考程度に。
204NAME IS NULL:2008/06/07(土) 19:50:10 ID:???
>>203
ありがとうございます!
試してみてお返事しますんで、時間下さい
205NAME IS NULL:2008/06/07(土) 20:06:05 ID:???
>>202
「列」が同じやつ、例えば
 所属ID 所属部署 順序 列
 11 ○商事 1 1
 11 ○課 2 1
は連結して「役職1列目」に表示するんだよな?

同じ「列」には最大2つ、とか決まっていればできるけど
決まっていなければ無理じゃね?
206NAME IS NULL:2008/06/07(土) 20:08:53 ID:???
役職ごとに最大4件のレコードが役職テーブルにある、ってことでいいんかな。
役職を5つ持つ人については、5件のレコードを結果として出していいの?
207NAME IS NULL:2008/06/07(土) 20:20:36 ID:???
>>203
Accessでは Join のところでエラーになりました
初心者ながら USING (個人ID) がAccessでは通用しないのかなと勘ぐっています
調べますので結果は少し待ってください

>>205
お返事ありがとうございます
そうです、所属ID 11の役職1列目は ○商事○課です

>>206
お返事ありがとうございます
役職1列目、役職2列目、役職3列目それぞれに最大3レコード持つ可能性があります
役職を5つ持つ人もそれぞれ1列目、2列目、3列目に振り分けられます
ですので、順番の最大値は5、列の最大値は3です

よろしくお願いします
208NAME IS NULL:2008/06/07(土) 20:26:01 ID:???
その説明でまったくわからなくなった・・・

複数の役職を持つサンプルデータだしてよ。
209NAME IS NULL:2008/06/07(土) 20:29:55 ID:???
つまり「順序」で見ると
 1&2&3 4 5
の場合とか
 1 2 3&4&5
の場合とかあるわけ?
超ムズいな。。。

余談だが>>203はどう見ても間違ってるから試さなくていいよ。
210ぽち:2008/06/07(土) 20:32:13 ID:eFYmRsiZ

現在、VB.NET2005とSQL Server2005(Express Edition)を使用して簡単なソフトを作成しています。
50音のボタンを押すとそれに対応した画像が表示されるというものです。
50音以外に英・数字等もあるため、SQLを使用してみようと思い、作成しています。
VBもですが、SQLに関して本当に初心者です。



Imports System.Data.SqlClient '接続クラスの作成


Public Class Form1
Dim Cn As New SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=○○○;Initial Catalog=shuwa;")
Dim SQLCm As SqlCommand = Cn.CreateCommand


SQLCm.CommandText = "SELECT かな FROM shuwa WHERE 指文字 = 001 "

Dim Value As String

Cn.Open()
Value = SQLCm.ExecuteScalar
Cn.Close()

End Class

他のサイトで値の取得するためのコードとして書いてあったものを参考にして書いたのですが・・・
宣言をしているはずのSQLCm,Cn,Value,にエラー文が表示され”宣言が必要です”とでます。
いろいろいじってはみたのですが、わかりません。
どのようにして解決したらよいでしょうか?
分かる方いましたら、よろしくお願いします。

211NAME IS NULL:2008/06/07(土) 20:37:10 ID:???
>>208
所属ID 所属部署 順序 列
13    △電器   1  1
13     △部   2  2
13     △課   3  2
13     △係   4  3
13     係長   5  3

と、いうカンジになります
すいません、役職という言葉が分かりにくくさせていました
役職テーブルは所属と役職を合わせたものと言ったらわかってもらえますか
212NAME IS NULL:2008/06/07(土) 20:41:08 ID:???
>>211
ほげ商事総務部長 山田太郎
ほげ商事人事部長 山田太郎

みたいのはない、ってことでいいのね。役職が複数、ってことだから、
兼任みたいのがあるのかと思った。

>>210
スレ違い。VBスレへGo
213NAME IS NULL:2008/06/07(土) 20:41:10 ID:???
>>207
こんな感じにするしかないか

select case when 列=1 and 順序=1 then 所属部署 else null end
    & case when 列=1 and 順序=2 then 所属部署 else null end
    & case when 列=1 and 順序=3 then 所属部署 else null end as 役職1列目,
    case when 列=2 and 順序=2 then 所属部署 else null end
    & case when 列=2 and 順序=3 then 所属部署 else null end
    & case when 列=2 and 順序=4 then 所属部署 else null end as 役職2列目,
    case when 列=3 and 順序=3 then 所属部署 else null end
    & case when 列=3 and 順序=4 then 所属部署 else null end
    & case when 列=3 and 順序=5 then 所属部署 else null end as 役職3列目,
    名前,
    住所
from 個人テーブル A
   inner join
   所属テーブル B
   using (個人ID)
   inner join
   役職テーブル
   using (所属ID)
where B.ハガキ = 'TRUE'
;
214NAME IS NULL:2008/06/07(土) 20:43:54 ID:???
>>209
そうなんです、ドシロウトなもんでデータベースを作る時には正規化ということを
しないといけないという観念だけで自分なりに正規化したつもりでした

最初は所属テーブルに役職1列目、役職2列目、役職3列目を作っていましたが、
空欄が目立つ、○○会社の××部の一覧が取得できないなどの理由で
役職テーブルを作りましたが、そもそも作りが悪すぎるんでしょうか?

もしよろしければ、テーブル構成などもご指導いただけるとありがたいです
その場合スレ違いでしたら移動しますので誘導していただけると有難いです
215NAME IS NULL:2008/06/07(土) 20:45:33 ID:???
>>213
それだと無理っぽい気が。

個人テーブルと所属テーブルは 1:1で JOIN して、
役職テーブルからはサブクエリを使うしかないんじゃね?
216NAME IS NULL:2008/06/07(土) 20:47:23 ID:???
>>214
 1&2&3 4 5

 1 2 3&4&5

は、どういう条件で区別すんの? おれなら、1 2 3 4 5 で取得しておいて、
クライアントアプリなりで結合するな。
217213:2008/06/07(土) 20:51:10 ID:???
全然ダメじゃん。。。
>>213は忘れてくれ。
218213:2008/06/07(土) 21:01:18 ID:???
こうか。

select (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 1)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 2)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 3) as 役職1列目,
    (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 2 and C.順序 = 2)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 2 and C.順序 = 3)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 2 and C.順序 = 4) as 役職2列目,
    (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 3 and C.順序 = 3)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 3 and C.順序 = 4)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 3 and C.順序 = 5) as 役職3列目,
    氏名,
    住所
from 個人テーブル A
   inner join
   所属テーブル B
   using (個人ID)
where B.ハガキ = 'TRUE'
;

かっこ悪。。。
219202:2008/06/07(土) 21:05:53 ID:???
>>218
ありがとうございます

case when が使えなさそうなので、iifに置き換えて試してました
>>213ダメでしたか、何度もすいません、試してみますのでお待ちください
220NAME IS NULL:2008/06/07(土) 21:12:27 ID:???
>>214
テーブル構造はデータの意味のみで考え、
印刷レイアウトはDBの外で考えるべき。
同時に考えようとしているから変なことになっちゃうんだな。
221202:2008/06/07(土) 21:12:32 ID:???
「クエリ式 '(select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 1)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 2)
    & (select 所属部署 from 役職テーブル C where B.所属ID = C.所属ID and C.列 = 1 and C.順序 = 3)'の構文エラー:演算子がありません。」というエラーになります

私の分かる範囲では悪いところが無さそうなんですが、どこか悪いところがあるんでしょうか?
もう少し色々試行錯誤してみますのでお待ちください
222NAME IS NULL:2008/06/07(土) 21:13:21 ID:???
>>221
単純に Access でサブクエリが使えないだけとか。
223213:2008/06/07(土) 21:15:20 ID:???
>>221
文字列連結が「&」じゃないのかも。
224NAME IS NULL:2008/06/07(土) 21:16:36 ID:???
別名指定に As が必要だったっけ?
225202:2008/06/07(土) 21:19:29 ID:???
>>222
えっ、そうだとしたらヤバいですね、調べてみます

>>223
「&」は使えるはずですが、調べてみます

>>224
別名指定も As は省略可能なハズですが、調べてみます
226NAME IS NULL:2008/06/07(土) 21:32:19 ID:???
>>224
テーブルの別名指定の As は省略可能のようですが、
列名の別名指定の As は省略できないようです

もうちょっと試してみます
227NAME IS NULL:2008/06/07(土) 21:37:29 ID:???
>>222
SELECT *
FROM 個人テーブル
WHERE 氏名 = (SELECT 氏名 FROM 個人テーブル WHERE 個人ID = 3);

は、通ったんですが、これが通ったからといってサブクエリが使えるという保証にはならないでしょうか?
この辺はいまだによく分かっていません
お分かりの方、助言よろしくお願いします
228202:2008/06/07(土) 21:48:36 ID:???
>>218
ちょっと私の技量では検証に時間がかかりそうなのでしばらく時間を下さい
結果は必ず報告しますので、お世話になった皆さんありがとうございました
229202:2008/06/07(土) 21:57:13 ID:???
>>209
ありゃ、連結する場所の条件を勘違いしてたか、スマソ。

他の人も言ってるけど、役職テーブルを設計し直すか、
クライアント側で連結した方が良さそうだよね。
230229=203:2008/06/07(土) 21:58:06 ID:???
↑レス番まで間違えた。
231202:2008/06/07(土) 22:05:14 ID:???
>>229
データベースはホントにド素人なのですが、こういう場合は役職テーブルに
役職1列目、役職2列目、役職3列目を持ってしまうモノなのでしょうか?

でもそうすると、○○社の課長の人数とか、××社の部の数とか数えられなくなりますよね?
そもそも、両立させようというのが間違いなのでしょうか?

このような場合はどのようなテーブル構成にすればよいのでしょうか?
232NAME IS NULL:2008/06/07(土) 22:11:02 ID:???
>>231
組織と役職は分けるべきだと思われ
233NAME IS NULL:2008/06/07(土) 22:11:16 ID:???
>>231
 個人テーブル(個人ID, 氏名など)
 組織テーブル(組織ID, 組織名, 上位組織ID)
 所属テーブル(個人ID, 組織ID, 役職など)
ぐらいだとテーブル構造としてはきれいだと思う。
再帰クエリ書かなきゃいけなくなったりするからちょっと大変だけど。
234NAME IS NULL:2008/06/07(土) 22:25:48 ID:???
>>232
ありがとうございます
すいません、例には書いていませんでしたが、親会社と子会社の
関係も内包したかったためにこんな形になってしまいました。
どっちにしても、作りが悪いんですね

>>233
以前にほぼ同じ形のテーブルも作ってみたんですが、結局今回のように
自分のやりたいようにデータを抽出できませんでした
その再帰クエリというのが書けませんでした

こうして質問させて頂いてよく分かったのは、何にしても自分のSQLを書く
技量が決定的に不足していることに尽きると思います
自分なりに少しずつ勉強しているつもりですが、
もう一度みっちり基礎から勉強しないとダメなようです
いきなり身の丈に合わないモノを作ろうとしていたようです
みなさん、ご助言ありがとうございました
235NAME IS NULL:2008/06/07(土) 22:31:51 ID:???
accessで再帰はかけんだろが
236NAME IS NULL:2008/06/07(土) 23:24:11 ID:???
ちゃんとした要求を出せばちゃんとした設計を誰かがしてくれると思う。
列の定義があいまいでどうしようもない。
おそらく分ける必要がないのに、分けることが前提で書き込んでいるからおかしくなる。
237NAME IS NULL:2008/06/07(土) 23:25:23 ID:???
Access ならどうせそんなに巨大な処理はしないだろうから、
プログラム側で再帰の処理すればいいと思うんだが。
238NAME IS NULL:2008/06/08(日) 00:25:53 ID:???
再帰クエリはいらなくね?
相関クエリは使うかもだが。
239NAME IS NULL:2008/06/08(日) 01:22:25 ID:???
mysql 5.0を使っています

以下のようなテーブルで、valを条件に検索しkeyを取得したいのですが
valにv1,v2,v3を持つもの → 結果 k1
valにv1,v3を持つもの → 結果 k1,k3
このような動作を期待しています

valにv1またはv2を持つkeyであれば where val in ( v1, v2 ) で
取得してdistinctすればよかったのですが、検索条件全てを含む場合は
どのように書けばよいのでしょうか

id key val
----------
1 k1 v1
2 k1 v2
3 k1 v3
4 k2 v1
5 k3 v1
6 k3 v3
240NAME IS NULL:2008/06/08(日) 02:03:09 ID:???
>>239
(key,val)がユニークなら
SELECT key FROM Table WHERE val IN (v1,v2...) GROUP BY key HAVING INの中の数=count(key);
で、済みそうだが。ユニークでない場合は上のFROM句を
(SELECT key FROM Table GROUP BY key,val)AS T1
とサブクエリにしちゃえば。
241NAME IS NULL:2008/06/08(日) 02:19:18 ID:???
>>240
HAVINGでcount()を使うのですね、勉強になりました
(key,val)はユニークなのでサブクエリを使う必要もなかったです

ありがとうございました
242NAME IS NULL:2008/06/08(日) 02:51:40 ID:???
ぶっちゃけ val IN(v1,v2・・・はいらないんじゃ?
ユニークなんだから数だけ数えればOK
243NAME IS NULL:2008/06/08(日) 03:03:02 ID:okJgYhYm
MySQL5.0を利用しています。

num, name, ver, info
1, yamada, a, 16
2, yamada, b, 100
3, yamada, c, 67
4, tanaka, b, 56
5, tanaka, d, 18

このテーブルから、nameに関連づけられたvarの一覧を出力するにはどうすればいいでしょうか?
具体的には、yamada : a, b, c と tanaka : b, d という結果が欲しいのです。
244NAME IS NULL:2008/06/08(日) 03:37:55 ID:???
>>242
絞らないとval にv2を持つもの(k1のみ)なんかの場合はまずいっしょ。

>>243
>>4
245NAME IS NULL:2008/06/08(日) 03:39:37 ID:???
っと>>4の場合とちょと違うか、んで俺はパス。スマソ
246243:2008/06/08(日) 03:55:26 ID:???
>>244-245
ご回答ありがとうございます。
しかし、ご指摘の通り、>>4と少し違います。

現状、とりあえずですが、
全てのレコードを取り出してから、プログラム側で処理しています。
内部的には、かなりカッコ悪いですw

もっとSQLの勉強しなくちゃなぁ。
なお、引き続きご回答および何らかのヒントをお待ちしております。
247NAME IS NULL:2008/06/08(日) 04:08:24 ID:???
>>246
カラム数が自動で増えるのは_。
連結する手もあるが、文字列連結集約関数が無いと現実的に_。
MySQLには文字列を連結"||"の代わりにconcat関数があるみたいだけど、集約関数じゃないからやっぱり_ぽ。
-- 試しにSELECT concat(var) FROM Table GROUP BY name ってやって味噌。
explode(',',var)みたいな集約関数を自作すれば桶。
248NAME IS NULL:2008/06/08(日) 04:51:09 ID:???
Oracleなら、こんな感じのビューを作るけどな…。
ORDER BY句はビューには含めない。

SELECT * FROM 役職テーブル;

所属ID 所属部 順序 列
------- ------ ---------- ----------
11 ○商事 1 1
11 ○課 2 1
11 ○係 3 2
11 係長 4 2
12 ×建設 1 1
12 ×部 2 2
12 部長 3 2
13 △電器 1 1
13 △部 2 1
13 △課 3 2
13 課長 4 3

SELECT 所属ID,
MAX(CASE WHEN 列 = 1 AND 順序 = 1 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 1 AND 順序 = 2 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 1 AND 順序 = 3 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 1 AND 順序 = 4 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 1 AND 順序 = 5 THEN 所属部署 ELSE NULL END)
AS 役職1列目,
MAX(CASE WHEN 列 = 2 AND 順序 = 1 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 2 AND 順序 = 2 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 2 AND 順序 = 3 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 2 AND 順序 = 4 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 2 AND 順序 = 5 THEN 所属部署 ELSE NULL END)
AS 役職2列目,
MAX(CASE WHEN 列 = 3 AND 順序 = 1 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 3 AND 順序 = 2 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 3 AND 順序 = 3 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 3 AND 順序 = 4 THEN 所属部署 ELSE NULL END) ||
MAX(CASE WHEN 列 = 3 AND 順序 = 5 THEN 所属部署 ELSE NULL END)
AS 役職3列目
FROM 役職テーブル
GROUP BY 所属ID
ORDER BY 所属ID;

所属ID 役職1列目 役職2列目 役職3列目
------- ------------ ------------ ------------
11 ○商事○課 ○係係長
12 ×建設 ×部部長
13 △電器△部 △課 課長

Accessで実行できるかどうかは知らない。すまん。
249NAME IS NULL:2008/06/08(日) 06:56:00 ID:???
>>247
>MySQLには文字列を連結"||"の代わりにconcat関数があるみたいだけど、集約関数じゃないからやっぱり_ぽ

集約関数 group_concat() が別にある。

select name,group_concat(ver) from thetable group by name;

ver の中身をソートしたりしたいなら

select name,group_concat(distinct ver order by ver) from thetable group by name;
250NAME IS NULL:2008/06/08(日) 07:39:56 ID:???
>>234
MS Access 使うということは、結果を「レポート」で出力できるんでしょ?
なら、連結とかは SQL ではなくて「レポート」で VB 使えば簡単だと思う。
251NAME IS NULL:2008/06/08(日) 22:36:48 ID:???
SQL:MySQL4.0.27
テーブル名:MYTABLE
フィールド:userId(ユーザーID)、score(点数)、date(レコードの挿入日時)、kind(表の種別)
キーはなし。1ユーザーによる複数レコードあり。

目的:
ユーザーの最高点数によるランキング表を表示します。

SQL文:
@CREATE TEMPORARY TABLE A SELECT * FROM MYTABLE WHERE kind = 表示する表の種別
ACREATE TEMPORARY TABLE B SELECT userId, MAX(userId) AS MAX_SCORE FROM A GROUP BY userId
BSELECT * FROM A C INNER JOIN B ON C.userId LIKE B.userId AND C.score = B.MAX_SCORE ORDER BY C.score DESC, C.date

説明:
@複数の表の種別を1テーブルで管理しているため、ます表示する表の種別で絞っています。
AユーザーIDと最高得点を抽出しています。
B@とAで抽出した表から目的の表を抽出しています。

問題:
ちょっと複雑なSQL文のせいか、処理に時間がかかってしまいます。
レコードの数は5000件ほどなんですが。
処理速度を向上させることは可能でしょうか?
ちなみに当方SQL副問い合わせ不可です。
よろしくお願いします。
252NAME IS NULL:2008/06/08(日) 22:43:22 ID:???
- どこにどんだけ時間がかかっているのか?
- インデックスをどう作ってあるのか?

それを書いて出直せ
253NAME IS NULL:2008/06/08(日) 23:02:31 ID:???
>>251
AでWhere kind = 表示する表の種別
をしないってことは表示したい表が最高得点じゃない時は出したくないってこと?
254202:2008/06/08(日) 23:15:32 ID:???
>>248
おお、すばらしい!!
ありがとうございます!

SELECT 役職テーブル.所属ID,
Max(IIf(列=1 And 順序=1,所属部署,Null)) &
Max(IIf(列=1 And 順序=2,所属部署,Null)) &
Max(IIf(列=1 And 順序=3,所属部署,Null)) &
Max(IIf(列=1 And 順序=4,所属部署,Null)) &
Max(IIf(列=1 And 順序=5,所属部署,Null)) AS 役職1列目,
Max(IIf(列=2 And 順序=1,所属部署,Null)) &
Max(IIf(列=2 And 順序=2,所属部署,Null)) &
Max(IIf(列=2 And 順序=3,所属部署,Null)) &
Max(IIf(列=2 And 順序=4,所属部署,Null)) &
Max(IIf(列=2 And 順序=5,所属部署,Null)) AS 役職2列目,
Max(IIf(列=3 And 順序=1,所属部署,Null)) &
Max(IIf(列=3 And 順序=2,所属部署,Null)) &
Max(IIf(列=3 And 順序=3,所属部署,Null)) &
Max(IIf(列=3 And 順序=4,所属部署,Null)) &
Max(IIf(列=3 And 順序=5,所属部署,Null)) AS 役職3列目
FROM 役職テーブル INNER JOIN 所属テーブル ON 役職テーブル.所属ID = 所属テーブル.所属ID
WHERE 所属テーブル.ハガキ=Yes
GROUP BY 役職テーブル.所属ID
ORDER BY 役職テーブル.所属ID;

コレで出来ました
まったく理解できません(GROUP BYがまだ理解できてません、集計ですよね?)が、
目的は完璧に達成できるようです

素人目に見てもこのパフォーマンスが悪そうなSQLを書かなくては求めたい結果が得られない
テーブル構成のようなので、コレを理解した上、テーブル構成とSQLを勉強し直してみます

皆さん、本当にありがとうございました
書いて頂いたSQL以上に大事なモノを得られたようです
255NAME IS NULL:2008/06/08(日) 23:17:04 ID:???
>>251
テンポラリテーブル同士のJOINが遅いんだろ。

Bがテンポラリテーブルと元テーブルのJOINになるようにしてみたら?
256NAME IS NULL:2008/06/08(日) 23:18:08 ID:???
>>252
すみません。詳細な実行速度はわかりません。
インデックスについても勉強不足です。

>>253
以下のようにしても同じ結果が得られるのですが、最初に表の種別で絞りました。
ちなみにどっちも処理時間はあまり変わりませんでした。
CREATE TEMPORARY TABLE B SELECT userId, MAX(userId) AS MAX_SCORE FROM MYTABLE WHERE kind = 表示する表の種別 GROUP BY userId
SELECT * FROM MYTABLE C INNER JOIN B ON C.userId LIKE B.userId AND C.score = B.MAX_SCORE WHERE kind = 表示する表の種別 ORDER BY C.score DESC, C.date
257NAME IS NULL:2008/06/08(日) 23:19:05 ID:???
>>256
実行時間がわからずに、どうやって効果が出たかを判断するんだよハゲ
258NAME IS NULL:2008/06/08(日) 23:19:30 ID:???
C.userId LIKE B.userId

C.userId = B.userId
にしてみ
259NAME IS NULL:2008/06/08(日) 23:20:46 ID:???
サブクエリを使ってはいけない理由もしりたい
260NAME IS NULL:2008/06/08(日) 23:27:28 ID:???
>>256
どういうインデックスがあるかも分からずにチューニングするのはほとんど不可能。

>>259
MySQL4.0だからと思われ。
261NAME IS NULL:2008/06/08(日) 23:28:48 ID:???
>>255>>258 っぽいな。今のところ。
262251:2008/06/08(日) 23:40:48 ID:???
インデックス調べてみたんですが、ただ単に
ALTER TABLE MYTABLE ADD INDEX (userId)
とすればよいのでしょうか?
やってみたんですが、やはり変わりませんでした。
一応scoreとkindも作りましたが…
時間は体感10秒くらいです。
263251:2008/06/08(日) 23:48:20 ID:???
いや!!
インデックス作ってこれで試したら一瞬で終わりました!
CREATE TEMPORARY TABLE B SELECT userId, MAX(userId) AS MAX_SCORE FROM MYTABLE WHERE kind = 表示する表の種別 GROUP BY userId
SELECT * FROM MYTABLE C INNER JOIN B ON C.userId = B.userId AND C.score = B.MAX_SCORE WHERE kind = 表示する表の種別 ORDER BY C.score DESC, C.date

みなさんありがとうございました。
インデックス、LIKE⇒「=」勉強になりました。
#LIKE⇒「=」の理由がなぜか分かっていませんが(^^;
264NAME IS NULL:2008/06/08(日) 23:53:11 ID:???
>#LIKE⇒「=」の理由がなぜか分かっていませんが(^^;

基礎からやり直したほうがいいよ。

相当重症レベルだから。
265NAME IS NULL:2008/06/08(日) 23:53:36 ID:???
・MySQL 5.1.22-rc(本番) 5.0.51b(開発)

PHP5 + MySQL で開発しています。
クエリ結果のページングの部分で悩んでいます

select * from `test` where name regexp `鈴木` limit 0,50

と、ブラウザには表示件数を制限しているのですが、
検索結果の「総数」が取得できない為、
次ページへのリンクや前述の検索結果の「総数」が表示できないので、困っています

表 test の検索結果には 120件あったとしても、前述の sql 文を php の mysql_query を行い、
mysql_num_rows の結果が 120 ではなく、50 となってしまいます。また、

select count(*),* from `test` where name regexp `鈴木` limit 0,50

としても、mySQL に怒られちゃいます。

select count(*) from `test` where name regexp `鈴木` limit 0,50
select * from `test` where name regexp `鈴木` limit 0,50
↑この様に、二段構えの sql とか、limit をやめて全ての結果セットを取得してそこから web 上に
表示するデータだけを抽出とか考えましたが、スマートじゃないし、システムリソースを無駄に喰ってしまいます。
何か、いい方法はないでしょうか?


266NAME IS NULL:2008/06/09(月) 00:35:18 ID:???
俺は LIMIT かけるときは SQL_CALC_FOUND_ROWS を付けて検索して
直後に SELECT FOUND_ROWS() で総件数を取ってる
267NAME IS NULL:2008/06/09(月) 00:45:14 ID:???
全件とってから表示だけを50件にすればいいんじゃないの?
268NAME IS NULL:2008/06/09(月) 01:30:42 ID:???
>>267
Google みたいに 約509,000 件中 とかなると、結構リソース食われそうだが。

(ちなみに、これは SQL_CALC_FOUND_ROWS の検索結果ね。)
269NAME IS NULL:2008/06/09(月) 02:40:06 ID:???
まあ件数先にもってくるのがいいかな。
でもLIMIT使うなら、ORDER BY とセットと考えたほうがいい。
270NAME IS NULL:2008/06/09(月) 08:29:47 ID:???
>>266
まさにこれです。ありがとう。

http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.html
> SQL_CALC_FOUND_ROWS と FOUND_ROWS() は、
> クエリで返されるレコード数を制限する必要がある場合に、
> 完全な結果セットに含まれるレコード数を(クエリを再実行することなく)確認したいときに役立つ。
> 例として、検索結果の別のセクションを示すページへのリンクを含むページ画面を表示する Web スクリプトを
> 挙げることができる。FOUND_ROWS() を使用すると、結果の残りの部分を表示するのにあと何ページ必要か確認できる。

で、>>265 の例でいう所の sql はこうなりました…

select SQL_CALC_FOUND_ROWS * from `test` where name regexp `鈴木` limit 0,50
SELECT FOUND_ROWS()
271202:2008/06/09(月) 15:07:20 ID:???
当初の目的の、

役職1列目  役職2列目 役職3列目    名前   住所
○商事○課  ○係係長         田中一郎 東京都
△電器△部     △課     課長  佐藤三郎 大阪府

の結果を得るクエリが出来ました!

SELECT Max(IIF(列=1 AND 順序=1,所属部署,NULL)) &
  Max(IIF(列=1 AND 順序=2,所属部署,NULL)) &
  Max(IIF(列=1 AND 順序=3,所属部署,NULL)) &
  Max(IIF(列=1 AND 順序=4,所属部署,NULL)) &
  Max(IIF(列=1 AND 順序=5,所属部署,NULL))
  AS 役職1列目,
  Max(IIF(列=2 AND 順序=1,所属部署,NULL)) &
  Max(IIF(列=2 AND 順序=2,所属部署,NULL)) &
  Max(IIF(列=2 AND 順序=3,所属部署,NULL)) &
  Max(IIF(列=2 AND 順序=4,所属部署,NULL)) &
  Max(IIF(列=2 AND 順序=5,所属部署,NULL))
  AS 役職2列目,
  Max(IIF(列=3 AND 順序=1,所属部署,NULL)) &
  Max(IIF(列=3 AND 順序=2,所属部署,NULL)) &
  Max(IIF(列=3 AND 順序=3,所属部署,NULL)) &
  Max(IIF(列=3 AND 順序=4,所属部署,NULL)) &
  Max(IIF(列=3 AND 順序=5,所属部署,NULL))
  AS 役職3列目,
  K.氏名,
  K.住所
FROM 個人テーブル K, 所属テーブル S, 役職テーブル Y
WHERE Y.所属ID=S.所属ID AND K.個人ID=S.個人ID AND S.ハガキ=YES
GROUP BY Y.所属ID, K.氏名, K.住所
ORDER BY Y.所属ID;

GROUP BY句の部分がどのような働きをしているかの理解は出来ていませんが
必ず理解して、自分で思い通りのSQLを書けるようになりたいと思います
272NAME IS NULL:2008/06/09(月) 18:20:06 ID:???
>>270
それってMySQLでよかったと思える機能の一つだよなー
Postgresだとどうするんだろう?
273NAME IS NULL:2008/06/09(月) 19:45:04 ID:???
>>268
googleはmysqlなんて使ってない。

ソフトの規模にあった最適なdbを選択するべき。
274NAME IS NULL:2008/06/09(月) 20:16:14 ID:???
googleはmysqlそれもmyisamの独自改変バージョンだと聞いたことがあるな。
検索エンジンの場合はあらかじめキーワード毎に事前に集計分類済みのを
順番に見せるのが基本の構造で、総件数はあらかじめもとまっている。
いちいち全データからクエリーやソートかけてたらとてもじゃないが
サーバー等のリソースが足りない。
275NAME IS NULL:2008/06/09(月) 20:26:48 ID:???
>>273
Google は単なる例。

Google でなくても、検索条件によって百万件ぐらいヒットする
DB はいくらでもあるし、MySQL で十分対応可能。

# >>273 は応用力 "0" だな。
276NAME IS NULL:2008/06/09(月) 21:25:55 ID:???
TRUNCATE
277NAME IS NULL:2008/06/10(火) 00:04:43 ID:???
例の使い方を間違えてて偉そうにww
278NAME IS NULL:2008/06/10(火) 00:51:55 ID:???
そもそもサーバ20万台とかそういう次元の世界と比較してどうすんのさ?
279NAME IS NULL:2008/06/10(火) 08:21:39 ID:???
お前らスレ違いだから他所行ってやれ。
280NAME IS NULL:2008/06/10(火) 13:25:59 ID:???
すんません教えてください
mdbなんですが、SQLでbinaryデータのinsertの記述を教えてください><
281NAME IS NULL:2008/06/10(火) 14:15:04 ID:???
>>280
まずググれよ。
282NAME IS NULL:2008/06/10(火) 14:51:55 ID:???
>>281
知らないならレスしないで下さい。うざいだけです。
283NAME IS NULL:2008/06/10(火) 16:38:44 ID:???
これは…何と言うか…スルー推奨w
284NAME IS NULL:2008/06/10(火) 17:03:49 ID:???
>>283
知らないならレスしないで下さい。うざいだけです
285NAME IS NULL:2008/06/10(火) 17:04:23 ID:???
こんなスレにまで飛び火してんのかw
286NAME IS NULL:2008/06/10(火) 17:12:31 ID:???
>>280
       ,-┐
 ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐
く  / , ,'   ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│
 `<' / ,'レイ+tVvヽ!ヽト 知ってるが  │
  !/ ,' i |' {] , [}|ヽリ  お前の態度が |
  `!_{ iハト、__iフ,ノリ,n   気に入らない |
   // (^~ ̄ ̄∃_ア____n_____|
 _r''‐〈  `´ア/トr──!,.--'
<_>─}、  `」レ
'ヽ、   ,.ヘーァtイ
   Y、.,___/  |.|
    |  i `ー'i´
287NAME IS NULL:2008/06/10(火) 17:19:48 ID:???
訂正。

>>280
       ,-┐
 ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐
く  / , ,'   ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│
 `<' / ,'レイ+tVvヽ!ヽト 知ってるが  │
  !/ ,' i |' {] , [}|ヽリ  お前はこのスレ |
  `!_{ iハト、__iフ,ノリ,n   には要らない |
   // (^~ ̄ ̄∃_ア____n_____|
 _r''‐〈  `´ア/トr──!,.--'
<_>─}、  `」レ
'ヽ、   ,.ヘーァtイ
   Y、.,___/  |.|
    |  i `ー'i´
288NAME IS NULL:2008/06/10(火) 18:22:19 ID:???
>>285-287
知らないならレスしないで下さい。うざいだけです
289NAME IS NULL:2008/06/10(火) 19:22:13 ID:???
>>282,284,288
これにレスしないで下さい。うざいだです。
290NAME IS NULL:2008/06/10(火) 21:36:10 ID:???
AppendChunk使えよ
291NAME IS NULL:2008/06/10(火) 22:26:27 ID:???
>>277-278
Google だけに反応してるバカは引っ込んでな。
292NAME IS NULL:2008/06/11(水) 20:13:02 ID:t+JsFF2u
・MySQL5.0

・ある起点日からx日間隔の日付を持つ一時テーブルを生成するSQLが思いつきません><

・結果
date
-----
2008-06-01
2008-06-04 例えば3日おき
2008-06-07
:
2008-xx-xx 適当な終点日

こんな感じです。
293NAME IS NULL:2008/06/11(水) 20:26:15 ID:???
>>292 
       ,-┐ 
 ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐ 
く  / , ,'   ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│ 
 `<' / ,'レイ+tVvヽ!ヽト 知ってるが  │ 
  !/ ,' i |' {] , [}|ヽリ  お前の><が | 
  `!_{ iハト、__iフ,ノリ,n   気に入らない | 
   // (^~ ̄ ̄∃_ア____n_____| 
 _r''‐〈  `´ア/トr──!,.--' 
<_>─}、  `」レ 
'ヽ、   ,.ヘーァtイ 
   Y、.,___/  |.| 
    |  i `ー'i´ 
294NAME IS NULL:2008/06/11(水) 20:35:06 ID:???
>>292
日付を数値に変換できるなら、割り算で求められるだろ
295NAME IS NULL:2008/06/11(水) 21:11:35 ID:???
>>292
それ例えば、3日おきのレコードを 100レコード一気に生成したいとか言ってるの?

ストアドか、再帰を使わないと無理じゃね?
296NAME IS NULL:2008/06/11(水) 22:30:17 ID:???
あるテーブルA に insert する際に、別のテーブルB にキーが存在したら、
insert は行わないようにしたい。また、その時に別のテーブルB にキーが存在したら、
テーブルAの該当の行を delete を行いたい。

プラットフォームは MySQL 5.1 です
 
insert into `tbl_a` (`id`,`name`) values(300, "green") ;
通常はこの様に insert しますが…別のテーブルB にテーブルA に insert しようとしている `id` が
存在すれば、insert 処理は行わないようにしたいのです。

select `id` from `tbl_b` where `id` = insertしようとしているtbl_aのid

また、`tbl_b` に `id` が存在した場合 tbl_a に insert しようとした `id` の存在するかしないに関らず、
レコードの delete 処理を行いたい。
297296:2008/06/11(水) 22:40:05 ID:???
う〜ん…これって、SQL でやるには無理があるな。
ストアドかもしくは、ホスト側のプログラミング言語で行った方がいいような気がしてきた。
298NAME IS NULL:2008/06/11(水) 22:45:14 ID:???
>>296
insert into 〜 select 300, "green" from b where id = 300
delete from 〜 where id in (select id 〜)
299296:2008/06/11(水) 22:54:22 ID:???
>>298
速レスどうもです。

> insert into 〜 select 300, "green" from b where id = 300
えっと…これだと、bにあった場合 insert されませんか?
逆を期待(見つからなかった場合のみ) しているのですが、こうでいいのでしょうか?
insert into 〜 select 300, "green" from b where id <> 300

> delete from 〜 where id in (select id 〜)
なるほど。こういうのがありましたか。ありがとうです。
300NAME IS NULL:2008/06/11(水) 22:59:11 ID:???
ほんとに関係なくて申し訳ないんだけど、
シングルクォートじゃ無くてバッククォートを使ってるのってなんで?
なんか意図があるのか、単に適当なのかがちょっと気になって。。。
301NAME IS NULL:2008/06/11(水) 23:04:47 ID:???
おまえの 。。。 ←この方が気になるわ
302NAME IS NULL:2008/06/11(水) 23:33:04 ID:???
         すまんかった
            ↓
すまんかった→ >>301 ←すまんかった
            ↑
         すまんかった
303NAME IS NULL:2008/06/11(水) 23:38:18 ID:???
>>299
<> 300 はダメだね。count(*) from b where b <> 300 件分 insert されちゃう。

insert into 〜 select 300, "green" from dual where not exists (select id from b where id = 300)

みたいな感じかなぁ。My だと dual の代わりって何になるの?
304292:2008/06/11(水) 23:45:43 ID:???
>>293
上月澪とかよくわからないです><

>>295
100レコード一気に生成したい気分です
SQL だけでは厳しそうでしょうか。。。

>>294
すみません、もう少し詳しく書きます

(テーブルデータ)
テーブル A
id | update_at
----+-----------
1 | 2008-06-01
2 | 2008-06-02
3 | 2008-06-03
4 | 2008-06-04
5 | 2008-06-04
----+-----------

一時テーブル T
start_at | end_at
-----------+------------
2008-06-01 | 2008-06-03
2008-06-03 | 2008-06-04
2008-06-04 | 2008-06-07
:

(欲しい結果)
start_at | end_at | count_update_at
-----------+-------------+----------
2008-06-01 | 2008-06-03 | 2
2008-06-03 | 2008-06-04 | 1
2008-06-04 | 2008-06-07 | 2
:

テーブル A の期間毎(上記例は 3 日)集計をしたいです。
期間は可変なため、一時テーブル T を作成してから集計に利用しようかと。

もっとうまい方法ありましたらご教授願います。
305296:2008/06/11(水) 23:51:25 ID:???
>>303
ありがとう。テストしたら、ごっそりインサートされてて悩んでたw

> insert into 〜 select 300, "green" from dual where not exists (select id from b where id = 300)
>
> みたいな感じかなぁ。My だと dual の代わりって何になるの?
My って、MySQL で dual の代わりのようなステートメントがあるのか?ってこと?
だったら、俺は解らない。最近 db 弄り始めたばっかりだしw
306NAME IS NULL:2008/06/11(水) 23:55:09 ID:???
>>304
2008-06-02 の立場は?
307NAME IS NULL:2008/06/11(水) 23:57:56 ID:???
>>305
dual ってのは、Oracle で使われる疑似的なテーブル。

select '結果' from dual

みたいに使われる。SQL Server だと、

select '結果'

でいいんだけどね。今回の例では、select を使ってるけど、
どこのテーブルからも結果を引っ張ってこないので、dual 表を
使ってるってこと。

あとよ、解らないとか開き直るなよ。そんなんだと、誰も何も
教えてくれなくなるぞ。
308NAME IS NULL:2008/06/12(木) 00:11:05 ID:???
>>307
> あとよ、解らないとか開き直るなよ。そんなんだと、誰も何も
> 教えてくれなくなるぞ。
いや、dual ステートメントが何の事か変わらないって事。
309NAME IS NULL:2008/06/12(木) 00:17:20 ID:???
>>308
だから説明してんだろうが。

少しは調べるなりしろよハゲ
310292:2008/06/12(木) 00:44:42 ID:???
>>306
アチャー、寝ぼけてますた。修正します。

(テーブルデータ)
テーブル A
id | update_at
----+-----------
1 | 2008-06-01
2 | 2008-06-02
3 | 2008-06-03
4 | 2008-06-04
5 | 2008-06-04
----+-----------

一時テーブル T
start_at | end_at
-----------+------------
2008-06-01 | 2008-06-03
2008-06-04 | 2008-06-06 <
2008-06-07 | 2008-06-09 <
:

(欲しい結果)
start_at | end_at | count_update_at
-----------+-------------+----------
2008-06-01 | 2008-06-03 | 3 <
2008-06-04 | 2008-06-06 | 2 <
2008-06-07 | 2008-06-09 | 0 <

311NAME IS NULL:2008/06/12(木) 03:08:53 ID:???
>>308
あいたた。

>>307
おかげさまでdualというものを知れました。ありがとん

>>310
週単位の集計ならtrunc使えば一時テーブル無しで実現できるけど、
3日ごとがmustならちょっと思いつかないです。
312NAME IS NULL:2008/06/12(木) 03:34:45 ID:???
>>310
完全じゃないしMySQL使いでもないので、ヒントになると思うことだけ書くと。

update_atのdoy(その年の通算日)を三日間毎なら3で割った整数部分でGROUP BYすればいい。
例えば、PostgreSQLだと
SELECT date'2008-01-01'+cast((trunc(date_part('doy' ,update_at)/3)*3-1||' days') AS interval),count(trunc(date_part('doy' ,update_at)/3)) FROM テーブルA GROUP BY trunc(date_part('doy' ,update_at)/3);
start日しか書いてないけど、end日は +interval('3 days')で求められる。
doyなんで年をまたぐことが出来ないが、起算年月日を定めてそれからの日数で同じように計算すれば出来る。

しかし、count_update_atが0になるような期間(ex. 2008-06-07~2008-06-09) は出てこない。
0でも出したい場合はやっぱり一時テーブルのようなものが必要だけど、SQLだけではたぶん無理。
ある数列を出力してれる、例えば
generate_number(100,200) <- 100から200までの番号を出力するテーブル関数
みたいなのがあれば、それとJOINしてやれば出来なくもない。
313312:2008/06/12(木) 04:08:41 ID:???
PostgreSQLに連番生成関数generate_seriesがあったのでググると
MySQLにはなさそうだけど、ストアドを書いてる人が居た。
ttp://www.unfindable.net/web-app-book/code/ch08b.html

後、PostgreSQLだとDATE型-DATE型は整数(日数)になるので、
>>312で書いたSQLはもっと簡単になるね。
これにgenerate_series()と外部結合すれば一発で出るんじゃない。
314292:2008/06/12(木) 11:13:51 ID:???
>>312
PostgreSQL の generate_series() は僕も使いたいと思ってました。
count_update_at は 0 でも出したので別表は必須かなぁと。

SQL だけでは難しそうなことがわかっただけでも助かります。
ストアドの方向で頑張ってみます。
315NAME IS NULL:2008/06/12(木) 12:09:06 ID:V9PmrZ0c
テスト結果集計用データベースを作ろうと思っているのですがお聞きしたいことがあります。

   科目A 科目B 科目C 科目D…
A君 30  50  70  55
B君 70  70  90  35
C君 50  90  40  35
D君 55  95  85  100




このような構成にしたいのですが、科目数、人数ともに何個になるか分からないため
どのようなテーブルを構築すればよいのかイメージできません

どなたかご教授お願いします
316NAME IS NULL:2008/06/12(木) 12:56:33 ID:???
NGExのAA判定であぼ〜ん喰らってるのか
妙にレス番が飛んでると思ったら…
317NAME IS NULL:2008/06/12(木) 15:29:52 ID:???
>>315
素直に ID, 人名, 科目名,得点 にして
1,A君,A、30
2,A君,B、50

とすればいいと思うが…。
318NAME IS NULL:2008/06/12(木) 16:14:26 ID:6xiyr5j2
同じ構造のテーブル2つからのデータを、1つのテーブルから引っ張ったような取り方ってできないでしょうか?
319NAME IS NULL:2008/06/12(木) 16:22:09 ID:???
UNIONもしくはUNION ALLで
320318:2008/06/12(木) 16:30:01 ID:6xiyr5j2
> 319
まさに! ありがとう!
321NAME IS NULL:2008/06/12(木) 21:41:49 ID:???
>>310
欲しい結果の

2008-06-07 | 2008-06-09 | 0 <

の行って SQL で生成しないとダメ?

SQL は存在しない行を作るのは苦手なので、アプリ側で何とかするとかできない?
322NAME IS NULL:2008/06/12(木) 22:21:09 ID:???
Oracle使ってます。

いつ式を動かしても決まった期間(ex.先週月曜から日曜まで)のデータ(ex.個数)を取りたいのですが、
daysとddを使ってそれぞれ求めろといわれて困ってます。
sysdate-1だとその日の00:00:00になっちゃうし……お助けください。
323NAME IS NULL:2008/06/12(木) 22:24:18 ID:???
>>322
過去ログみろハゲ
324NAME IS NULL:2008/06/12(木) 22:27:39 ID:???
325NAME IS NULL:2008/06/13(金) 08:31:03 ID:???
>>323 m9(^Д^)プギャーーーッ
326NAME IS NULL:2008/06/13(金) 10:33:53 ID:???
>>200 もりっぱな過去ログ
327NAME IS NULL:2008/06/15(日) 23:01:42 ID:QaHjcMdF
sqlで以下のことは可能でしょうか?

表A
KeyA NameA
1 Tanaka
2 Satou
3 Suzuki
4 Jun

表B
KeyB NameB
a Soccer
b Baseball
c Tennis

表C
f_KeyA f_KeyB
1 a
1 b
2 b
3 c

この3つの表から以下の表

KeyA NameA NameB
1 Tanaka a,b
2 Satou b
3 Suzuki c
4 Jun
と、KeyAを基準にNameBを一行にまとめて取得することは可能ですか?
328NAME IS NULL:2008/06/15(日) 23:23:52 ID:???
Bの行数が固定なら可能
329NAME IS NULL:2008/06/15(日) 23:24:44 ID:???
>>327
列の数が可変な問合せはできない
330NAME IS NULL:2008/06/15(日) 23:39:17 ID:???
列は固定っぽいけどな。
チョイ前にでてたけど、MySQLならgroup_concatだったけ、
他のDBならそれに類似する関数があれば可能じゃね。
331NAME IS NULL:2008/06/16(月) 00:38:14 ID:ks4mqQf9
>>328
>>329
>>330
ありがとうございます。
Bの行数が可変だと無理っぽいんですね・・・、わかりました。
332NAME IS NULL:2008/06/16(月) 09:04:22 ID:???
>>327
mysql の group_concat 使うと、こんな感じ

select keyA,min(nameA),group_concat(distinct f_keyB order by f_keyB) from tableA left join tableC on(tableC.f_keyA = tableA.keyA),tableB group by keyA
333NAME IS NULL:2008/06/16(月) 11:46:27 ID:???
一時テーブルを作る時に既にあるテーブルのスキーマから作ること可能?
334NAME IS NULL:2008/06/16(月) 11:51:41 ID:???
like使え
使えないDBがあるかどうかは知らんけど
335NAME IS NULL:2008/06/16(月) 22:04:06 ID:???
>>333

select * into #hoge_A from hoge_B where 1 = 0

列名と型だけだけど。
336333:2008/06/16(月) 22:19:09 ID:???
>>335
where 1 = 0の意味が理解できてませんが、ありがとうございます。
助かります。
337NAME IS NULL:2008/06/16(月) 22:22:58 ID:???
>>336
1 = 0 は常に不成立。
データは1件もコピーされずに構造だけがコピーされる。
338NAME IS NULL:2008/06/16(月) 22:55:52 ID:???
>>335

それって、SQL Server固有じゃね?
339333:2008/06/16(月) 23:04:04 ID:???
なるほどー。
書き忘れてましたが今回はSQLServerなので、これでOKでした。
340NAME IS NULL:2008/06/17(火) 15:43:03 ID:???
ちょっと質問なんすけど
ネットで手軽にできる方法ってないの?
341NAME IS NULL:2008/06/17(火) 15:51:23 ID:???
何が?
342NAME IS NULL:2008/06/17(火) 15:53:16 ID:???
自分のデータベースを向こう側に置いておけるサービスってこと
343NAME IS NULL:2008/06/17(火) 16:00:45 ID:???
レンサバでデータベースを使えるとこなんていくらでもあるだろ?
344NAME IS NULL:2008/06/17(火) 16:23:07 ID:???
>>342
向こう側って…
三途の川の向こうならスレ違いだぞ。
345NAME IS NULL:2008/06/17(火) 16:53:20 ID:???
レンタルサーバってブログ見たく簡単にはいきませんよね?
無料でアレくらい簡単にできるのないかな、と思ってるんですが
346NAME IS NULL:2008/06/17(火) 17:03:50 ID:???
DBを使おうって人ならレンタルサーバくらい簡単に扱えるだろう
なんでネット上にDBを置きたいのかもわからんが

それにそもそもスレ違い、ここはSQLスレだ
347NAME IS NULL:2008/06/17(火) 17:14:20 ID:???
そうですね。スレ汚し失礼しました
348NAME IS NULL:2008/06/18(水) 19:44:21 ID:sQ0WAAAy
SQL> @^@^@^
2 @^@^@^
3 @^@^@^


↑文字を消そうとデリート押したら、
こんなような変なマークが出てしまって。

1. デリートとバックスペースが使えない時は、
どうやって文字を消すんですか?

2. 途中で抜けたい時は、どうやるんですか?

ちょう初心者の質問ですいません。
349NAME IS NULL:2008/06/18(水) 19:46:01 ID:???
>>348
スレ違い。

ターミナルなりコンソールなりのヘルプ読め
350NAME IS NULL:2008/06/18(水) 20:17:50 ID:7aLCHroV
質問ですが
名前  フラグ
あああ 1 
いいい 1
ううう 1
あああ 0
こういう風にフラグに1がたっているデータを取得したいのですが、
「あああ」みたいに下に同じ名称で0がある場合のみ除くようにしたいのですが
方法を教えてください

上記だと
いいい 1
ううう 1
が取得結果です
351NAME IS NULL:2008/06/18(水) 20:22:35 ID:???
下、なんて概念、SQL にはないから。

having sum(フラグ) = count(名前) でよさげだな。
もしくは、not in とかで。
352NAME IS NULL:2008/06/18(水) 22:27:17 ID:???
味の向こう側なら貧乏スレで
353NAME IS NULL:2008/06/18(水) 23:36:31 ID:???
>>351
350じゃないけどあんた賢いな
そういう使い方あったんだ
354NAME IS NULL:2008/06/20(金) 09:58:19 ID:itMmkC0G
selectした場合の実行順序?が知りたいのですが以下のような動作と
考えても問題ないのでしょうか?

select name from a_tbl where id = 100 for update
1、a_tblをDBから探す
2、a_tblからカラムidの100を検索する
3、idが100の行をロックする
4、ロックしたnameを取得する

DBはPostgres8です。
355NAME IS NULL:2008/06/20(金) 11:03:27 ID:???
>>354
インデックスの有無で変わる。
つか、なんかその順序に書かれた内容って
アバウトすぎないか?
356NAME IS NULL:2008/06/20(金) 19:01:08 ID:???
トランザクションの分離レベルを知りたいんじゃないの?

一応マニュアルを貼っとく。
http://www.postgresql.jp/document/pg833doc/html/transaction-iso.html

上のマニュアルにひととおり説明は書いてあるけど
分からなければ「トランザクション 分離レベル」とかでぐぐったほうがいいかも。
357NAME IS NULL:2008/06/21(土) 22:32:23 ID:aYrRkWAw
【本日VIP投票日ですた】●第3回全板人気トナメ●【反省会会場】
http://yutori.2ch.net/test/read.cgi/news4vip/1214054829/

vipを助けてくれ!!!!!!!!
負けそうだ!!!!!
シベリア超特急に負けそうなんだ!!!!!!!!!!!


 俺 達 の v i p が 無 く な る ! ! ! ! ! ! ! !

ニュー速の本部を荒らして俺らに投票してくれ!!!!!!!!
 P C ケ ー タ イ 友 達 家 族 を フ ル 動 員 し て
コードをとってきてくれ!!!!!!!!!!!!!


ここで勝ったら二回戦もよろしく!!!!!!!!!!!


つまんねー話してないで協力するんだ!!!!!!!!!!!!!!!!
2chが変わってしまうぞ!!!!!!!!!!!!!!
助けてくれ!!!!!!!!!!!


まだまだ俺たちはおわれねぇ!!!!!!!!!!!!!!!!!!
358NAME IS NULL:2008/06/21(土) 22:49:58 ID:???
出て行け。
359NAME IS NULL:2008/06/23(月) 18:57:41 ID:???
同じDB内に4つのテーブル
tableA,tableB,tableCとtableX がございます。
いずれも構造は同じでデータだけ異なっています。

このとき、tableA,tableB,tableCを読み書きすれば、
実際には、tableXが共用されて読み書きされるようにしたいのです。

tableA,tableB,tableCのテーブル名が変更できない場合、
良い方法を教えて下さい。お願いしまうs!
360NAME IS NULL:2008/06/23(月) 19:08:48 ID:???
読むのはともかく、tableAに書く場合はAとX両方に書きたいって事か?
単純にVIEWを作ればいいような気はするんだけど
361NAME IS NULL:2008/06/23(月) 19:16:16 ID:???
書くのもXだけでOKなんです。
つまりtableA〜Cは、その名前だけ生きて、
中身は全く利用されない状態なんです。

教えて頂いた「VIEWを作る」というのを早速調べてみます!
362NAME IS NULL:2008/06/23(月) 20:03:36 ID:???
>>361
シノニムが使えるならシノニムでもいい。
363NAME IS NULL:2008/06/23(月) 20:17:17 ID:???
>>362
ありがとうございます!
MySQL5.0.24ですが使えるのでしょうか・・・
364NAME IS NULL:2008/06/23(月) 21:05:45 ID:???
>>363
Viewにしとけwww
365NAME IS NULL:2008/06/23(月) 22:58:56 ID:???
viewだと同じテーブル名にできないんじゃね?
366NAME IS NULL:2008/06/24(火) 05:47:15 ID:???
>>365
要件としては、
select * from tableAが
実際はselect * from tableXで良い訳だから、
既存のtableA,tableB,tableCのデータを全て
tableXに移行した上で、
tableA,tableB,tableCをdrop、
んで、view作ればいいだろ。
367NAME IS NULL:2008/06/24(火) 06:37:15 ID:???
>>366
dropとかアホじゃねえの。
そんなことしていいなんて一言もいってないし。

abcをUNIONしたVIEWにカスケード更新、削除ってできたっけ?
368NAME IS NULL:2008/06/24(火) 06:55:45 ID:???
名前すら変更してはいけないテーブルを drop て …
abc が更新されないなら UNION ALL したXを create table as すればいいんだろうけど、キーが重複したりしてないのかな。
369NAME IS NULL:2008/06/24(火) 07:19:53 ID:???
>>361からすると、tableA〜Cの中身をtableXに移行する必要すらなさそうな
ただSQLでtableA〜Cを使ってるから変更できないと読めるが、実際のとこどうなん?
370NAME IS NULL:2008/06/24(火) 08:13:13 ID:???
俺もtableA〜Cという名前でアクセスできれば
テーブルでもビューでも良いような気がするけど。
371NAME IS NULL:2008/06/24(火) 08:16:58 ID:???
要求仕様不明確ってことで
372NAME IS NULL:2008/06/24(火) 08:30:36 ID:???
>>367
しちゃいかんともいってない罠。


>>369
SQL書き換えればいいだろ。



つ〜ことで、>>371でFA。
373NAME IS NULL:2008/06/24(火) 08:32:12 ID:???
>>372
そもそも、DBを停止できないとも言われてないから、
クライアントからの接続遮断して、
VIEW作るなりのメンテナンスすれば良いだけジャマイカ?
374NAME IS NULL:2008/06/24(火) 09:36:44 ID:???
皆さんありがとうごぜいます!

>>369
その通りです。該当のSQLが動的に生成されるし、
大量に散らばっているしで、これを書き換えるより
テーブルのショートカット?のようなものができないかと。

tableA〜Cにデータを出し入れすることはありません。
甲乙丙の3つのシステムでtableXを共用したいのですが。

ちなみにVIEWを試してみたのですが、
CREATE VIEW `tableA` AS SELECT * FROM `tableX`;
もとのtableAからデータが読み出されました・・
375NAME IS NULL:2008/06/24(火) 11:15:25 ID:???
tableAを消せばVIEWから読むだろ
376NAME IS NULL:2008/06/24(火) 15:54:44 ID:???
情報小出し厨の質問は荒れる。
377NAME IS NULL:2008/06/24(火) 16:33:17 ID:???
xの最大値から5件分を取得して、その5件のxと同じ値xを持つレコードをすべて取得したいんですが
MysqlではサブクエリでLIMIT使えないようなのですが、どのようなSQL実行すれば上記の結果が取得できるようになるでしょうか
初心者で申し訳ないですが、よろしくお願いします。

PHP5+Mysqlで行おうとして例)
SELECT *
FROM table1
WHERE x IN (
SELECT Distinct(x)
FROM table1
ORDER BY x DESC
LIMIT 5
);
378NAME IS NULL:2008/06/24(火) 16:42:17 ID:???
>>376
CREATE VIEW view1 as
SELECT Distinct(x) 
FROM table1 
ORDER BY x DESC 
LIMIT 5
でview作って
select * from table1 where x IN (select * from view1)
とかじゃダメなのかな?
379NAME IS NULL:2008/06/24(火) 17:20:13 ID:???
LIMIT無しで、
SELECT * FROM Table1 AS T1 WHERE 5 > (SELECT count(DISTINCT(x)) FROM Table WHERE x > T1.x);
380NAME IS NULL:2008/06/24(火) 19:07:37 ID:???
+--------+-----------------+--------+--------+-------------+------------+
| number | name | height | weight | phone | birth |
+--------+-----------------+--------+--------+-------------+------------+
| 008 | 田中一郎 | 180 | 78 | 13548749581 | 1988-05-06 |
| 009 | 鈴木次郎 | 156 | 75 | 12345678912 | 1976-02-14 |
| 010 | 佐藤三郎 | 175 | 85 | 24563187521 | 1985-05-06 |
| 011 | 伊藤四郎 | 186 | 84 | 46547646547 | 1945-12-24 |
| 012 | 加藤五郎 | 176 | 56 | 34657683574 | 1978-11-23 |
| 013 | 橋本六郎 | 154 | 84 | 43134654577 | 1984-08-24 |
| 014 | 安部七郎 | 164 | 57 | 46576876535 | 1984-05-31 |
| 015 | 岡村八郎 | 152 | 48 | 45679879874 | 1954-07-30 |
| 016 | 大十字九郎 | 186 | 70 | 45679879874 | 1988-01-03 |
| 017 | 矢部十蔵 | 195 | 81 | 46878673474 | 1968-04-26 |
| 018 | 渡部十市 | 187 | 95 | 68435721894 | 1977-07-07 |
| 019 | 長谷川重弐 | 164 | 48 | 79845679854 | 1954-09-05 |
+--------+-----------------+--------+--------+-------------+------------+

↑のようなデータテーブルを作りました。
このデータの身長データ(height)から10cm毎の人数を表示したいときはどうすればいいですか?
381NAME IS NULL:2008/06/24(火) 19:11:12 ID:???
↑ちなみにMySQLです
かなりの初心者なのでよろしくお願いします
382NAME IS NULL:2008/06/24(火) 19:22:18 ID:???
>>379を副問合せなしにしてみた。
こっちのほうがちょっと速い・・・かも。(変わらんかも。)

select T1.x, T1.hoge, T1.fuga
from table1 T1, table1 T2
where T1.x <= T2.x
group by T1.x, T1.hoge, T1.fuga
having count(distinct T2.x) <= 5

>>380
select floor(height/10)*10, count(*) from TableName group by floor(height/10)*10
383NAME IS NULL:2008/06/24(火) 19:35:03 ID:???
>>380
>>382の別解
SELECT truncate(height,-1),count(truncate(height,-1)) FROM Table1 GROUP BY truncate(height,-1);
384383:2008/06/24(火) 19:37:16 ID:???
ちょっと訂正。
SELECT truncate(height,-1),count(height) FROM Table1 GROUP BY truncate(height,-1);
385NAME IS NULL:2008/06/24(火) 19:40:05 ID:???
>>378
>>379
>>382
ありがとうございます、色々試してみます・・・
むずかしいですね、パフォーマンスも怪しいですし。
386NAME IS NULL:2008/06/24(火) 19:47:43 ID:???
>>384
ありがとうございました

求めていた結果が出ました!
ありがとうございます。
二時間近く悩んでいたので助かりました
387NAME IS NULL:2008/06/24(火) 22:24:27 ID:???
二時間w
もっと考えろよw
388NAME IS NULL:2008/06/25(水) 00:21:30 ID:???
俺なら30分で2発はイケる。
389NAME IS NULL:2008/06/25(水) 05:32:22 ID:???
・MySQL 5.0.51b-community-nt

列1 番号 (重複あり)
列2 日時

と、格納されているテーブルから、番号の重複を除外し、
日時の新しいレコードを SELECT したい。

SELECT DISTINCT 列1,列2
FROM テーブル
ORDER BY 列2 DESC

と、やっても、列1が重複して結果が返ってきて、
期待通りに結果が得られません。
390NAME IS NULL:2008/06/25(水) 05:52:32 ID:???
>>389
列1でGROUP BYして、
列2のMAX取れば良いだけでは?
391NAME IS NULL:2008/06/25(水) 05:59:05 ID:???
おぉ、こんな朝早くからレスありがとう。

SELECT 列1, max( 列2 )
FROM テーブル
WHERE 列3 LIKE "a%"
GROUP BY 列1
ORDER BY 列2 DESC

できました。ありがとう
392NAME IS NULL:2008/06/26(木) 23:04:12 ID:56b7gDnC
・DBとバージョン
Access2007

・テーブルデータ
id val
--------
1 a
1 a
1 a
1 b
1 b
1 c
2 a
2 a
2 b

・欲しい結果
id val cnt
-------------
1 a 3
1 b 2
1 c 1
2 a 2
2 b 1

・説明
欲しい結果のcntはvalの行数です。(id=1, val=aなら3行あるという意味)
1週間程まえからAccess勉強中です・・・難しい・・助けてください
393NAME IS NULL:2008/06/26(木) 23:07:48 ID:???
普通に Group By して Count() でとればいいだけじゃない?

#val なんてカラム名はやめれw
394NAME IS NULL:2008/06/26(木) 23:36:30 ID:???
>>393
最初そう思ってやってみたんですけどダメでした
何方かズバッと正解のSQL書いてください・・・
気になって寝られない

SELECT val, count(val)
from tbl
group by val;

↓こうなる

val cnt
-----------
a 5
b 3
c 1

本当はid=1と2でわけたいけど合計されてしまう
395NAME IS NULL:2008/06/26(木) 23:49:05 ID:???
あたりまえだろハゲ

id もグループ化しないからそうなるんだよ
396NAME IS NULL:2008/06/26(木) 23:54:16 ID:???
ハゲ言うな
397NAME IS NULL:2008/06/26(木) 23:55:32 ID:???
>>395
!!!!!!
ありがとうありがとう!!!!寝られる!!!
まだハゲてないですやばいけどw

SELECT id, val, count(val)
from tbl
group by id,val;
398NAME IS NULL:2008/06/27(金) 00:21:18 ID:???
悪いけど、オマエラと違ってフサフサだよ
399NAME IS NULL:2008/06/27(金) 01:07:50 ID:???
次の質問まだー?
400NAME IS NULL:2008/06/27(金) 17:08:48 ID:G8MTwxIo
(問)
KEY | DATE     | DATA
---+----------+-----
001 | 2007-11-11 | aaa
002 | 2007-11-11 | bbb
003 | 2007-11-10 | ccc
005 | 2007-11-12 | ddd
010 | 2007-11-11 | eee
011 | 2007-11-10 | fff
012 | 2007-11-12 | ggg

このようなキーが歯抜けになってるテーブルから
使用していない、重複しないキーを見つけ出すSQLを教えてください。
401NAME IS NULL:2008/06/27(金) 17:13:16 ID:???
>>400
一般解はないでしょ。

歯抜けになっていないテンポラリテーブルを作って、
NOT IN / NOT EXISTS で。
402NAME IS NULL:2008/06/27(金) 18:04:14 ID:???
>>400
二つの条件のうち、「重複していないキー」は「ユニークなキー」ということでSQLで論理式
による選択が可能だが、もう一つの条件の「使用していないキー」の意味がチョット記述が
不十分で解らん。000〜999が使用可能なキー値として未使用なキー値を列挙したいのか?
403NAME IS NULL:2008/06/27(金) 18:18:27 ID:???
∞や小数にも対応して欲しい、と。
404NAME IS NULL:2008/06/27(金) 20:12:51 ID:ttER4GEw
質問です
ほぼ同じ構成のテーブル(Aテーブル、Bテーブル)が二つあって
それをUnion Allでつなげたいのですが
その時に同じ日付のものがあればBテーブルのほうのデータだけを表示する方法ってどうすればいいのでしょうか?

例でいうと
DATE     | DATA
----------+-----
2007-11-11 | aaa
2007-11-12 | bbb

DATE     | DATA
----------+-----
2007-11-12 | aaa
2007-11-13 | ccc

とあった場合
2007-11-11 | aaa
2007-11-12 | aaa
2007-11-13 | ccc
と表示のような形にします。
あとできれば3つ以上のテーブルの場合の対応もお願いします
405NAME IS NULL:2008/06/27(金) 20:22:37 ID:???
>>404
結果の2行目は間違いだよな。
UNION ALL じゃなくて UNIONで桶。
同じならAでもBでもどちらでもいいじゃん。
ってどうやってみわけるん?
406NAME IS NULL:2008/06/27(金) 20:28:01 ID:???
>>404
B を優先するなら、B に対して、

from A Where not in / not exitst B

の結果を Union すればいいんじゃね?
407NAME IS NULL:2008/06/27(金) 20:32:40 ID:ttER4GEw
>>405,406
ありがとうございます

>>405
テーブル構成も全く同じではなく微妙に違いますので
408405:2008/06/27(金) 20:37:21 ID:???
スマソ、寝ぼけてた。
409NAME IS NULL:2008/06/28(土) 14:00:29 ID:???
??????????????毎日新聞社による日本人女性への誹謗中傷??????????????

・母親は受験勉強をする息子の学力向上のためにフェラチオをする
・日本人女性の55%は、出会ったその日に男と寝る
・ファストフードは女子高生たちを性的狂乱状態におとしいれる
・ティーンたちはバイアグラを使ってウサギのようにセックスをする
・女子高生は、刺激のためにノーブラ・ノーパンになる
・日本の最新の流行 : 70歳の売春婦
・老人の売春婦の人気にもかかわらず、日本では小学生の売春婦にも仕事がある
・日本の若い看護婦は売春婦に勝る
・24時間オルガズムが止まらない病気で苦しむ日本人女性の数が増えている
・15未満の子供を対象とした疑似ポルノが日本に蔓延している
・OLの72%が、セックスをより堪能するために何らかのトレーニングを受けている
・人妻は気分転換の目的で昔の恋人に抱かれに行く
・主婦は郊外のコイン・シャワーで売春をしている
・日本男子は柔道や空手の部活で男相手に童貞を捨てている
・ほとんどすべての漁師は海でマンタとSEXしている
・まだ10代の少年から退職した老人までみんな2980円の手コキを利用している
・六本木のあるレストランでは、食事の前にその材料となる動物と獣姦する

※同社が全年齢向けコーナーで七年以上にわたり世界に向けて配信していたものの一部です
※同社の行為は日本人への偏見や人種差別、婦女暴行、幼児虐待を助長するものです

◆毎日新聞の英語版サイトがひどすぎる まとめ@wiki
 http://www9.atwiki.jp/mainichiwaiwai/
◆毎日新聞問題の情報集積wiki
 http://www8.atwiki.jp/mainichi-matome/

つまり日本国民は
http://www.vipper.net/vip552788.jpg
410NAME IS NULL:2008/06/28(土) 15:27:04 ID:???
もしくはOUTER JOIN だな
411NAME IS NULL:2008/06/28(土) 15:40:39 ID:???
>>410
>>404の話?
OUTER JOINでどう実現するのかkwsk
412NAME IS NULL:2008/06/28(土) 16:48:41 ID:???
>>410 じゃないけど

select
 Aテーブル.DATE as DATE,
 coalesce(Aテーブル.DATA, Bテーブル.DATA, CテーブルDATA) as DATA
from Aテーブル, Bテーブル, Cテーブル
where Aテーブル.DATE = Bテーブル.DATE and Aテーブル.DATE = Cテーブル.DATE

ではだめなん?
413NAME IS NULL:2008/06/28(土) 17:35:06 ID:???
こんな感じ?

select
coalesce(b.DATE, a.DATE) as DATE,
coalesce(b.DATA, a.DATA) as DATA
from Aテーブル a full outer join Bテーブル b
on a.DATE = b.DATE;
414NAME IS NULL:2008/06/28(土) 20:16:07 ID:???
>>413
ああ、B の方が優先 (と言うことは、三つだと C が優先かな?) だったか。

その場合は、

 coalesce(Cテーブル.DATA, Bテーブル.DATA, AテーブルDATA) as DATA

に修正が必要だな。

> coalesce(b.DATE, a.DATE) as DATE,

b.DATE が null のケースを考慮する必要があるのか?

そもそも、a.DATE = b.DATE なんだよ?
415NAME IS NULL:2008/06/28(土) 21:25:48 ID:???
何でそんなに改行するの?
416NAME IS NULL:2008/06/28(土) 21:47:43 ID:???
段落 / 文章・コード種別 で改行してるだけですが、何か?
417NAME IS NULL:2008/06/28(土) 21:54:29 ID:???
(・∀・)truncate!
418NAME IS NULL:2008/06/29(日) 05:40:54 ID:???
>>414
> b.DATE が null のケースを考慮する必要があるのか?
full outer join してるから
和集合をとるって話じゃないの?
419NAME IS NULL:2008/06/29(日) 10:51:37 ID:???
>>418
いや、そもそも >>404 の例で DATE 列に Null はないし、
そうでなくても、>>413 の on a.DATE = b.DATE の意味は
知ってるよね?
420NAME IS NULL:2008/06/29(日) 11:03:56 ID:???
>>419
>>412はINNER JOIN、>>413はFULL OUTER JOIN。
この違い分かってる?
421NAME IS NULL:2008/06/29(日) 12:02:37 ID:???
なんで >>412 がでてくるのかわけわからん。
422NAME IS NULL:2008/06/29(日) 12:19:27 ID:???
ん?
>>412=>>414=>>419>>413に反論してるんじゃなかったの?

まあどっちにしろ>>419はFULL OUTER JOINの意味を分かってなさそう。
423NAME IS NULL:2008/06/29(日) 12:42:33 ID:???
アッ、すまん。

俺の勘違いだったわ。
424NAME IS NULL:2008/06/29(日) 18:19:25 ID:???
相関サブクエリで、サブクエリのフィールドを、結果セットに表示することはNGなのでしょうか?


RDBMS:SQL SERVER 2000

例えば、下記のクエリの場合、NGとなります。

SELECT A.フィールド1,A.フィールド1,B.フィールド1,B.フィールド2,
FROM テーブル1 AS A
WHERE A.フィールド1 =
(SELECT B.フィールド1
FROM テーブル1 AS B
WHERE A.フィールド1 = B.フィールド1
)
--A.フィールド1 と B.フィールド1 は同じデータ型です。

このクエリで必要なデータを得るには、どのようなスクリプトを書けばよいのでしょうか?

どなたか教えて下さい。宜しくお願いします。
425NAME IS NULL:2008/06/29(日) 18:25:59 ID:???
>>424
だって、FROM 句に出てきてないじゃん・・・
426NAME IS NULL:2008/06/29(日) 18:26:33 ID:???
>>424
SELECT A.フィールド1,A.フィールド1,B.フィールド1,B.フィールド2,
FROM テーブル1 AS A,テーブル1 AS B
WHERE A.フィールド1 = B.フィールド1
427NAME IS NULL:2008/06/29(日) 18:26:48 ID:???
>>424
回答としては、JOIN をしてその結果を SELECT で出す、ってことになりますね。
428NAME IS NULL:2008/06/29(日) 19:18:30 ID:???
>426、427様
ありがとうございます。

>425
だって、FROM 句に出てきてないじゃん・・・
→すみません。良く意味がわからないのですが・・・。
初心者すぎてすみません。
429NAME IS NULL:2008/06/29(日) 19:20:28 ID:???
>>428
SQL だと、基本的に FROM 句で指定したテーブルから、列を指定するでしょ?
430NAME IS NULL:2008/06/29(日) 21:40:08 ID:???
>429
ということは、サブクエリのFROM句からの列は結果として指定できないということですか?
初心者の質問で大変恥ずかしいですが、ご回答を宜しくお願いします。
431NAME IS NULL:2008/06/29(日) 21:45:05 ID:???
>>430
メインクエリの FROM 句にないテーブルからは、SELECT 句で指定できませんよ。
(SELECT 句で FROM まで指定する方法はありますけど)

初心者、というなら、参考書でも読んでみたらどう?
432NAME IS NULL:2008/06/29(日) 21:54:11 ID:???
>>431
大変恐縮です。ありがとうございました。

私の参考書には載っていない、ご回答でした。
ありがとうございました。
433NAME IS NULL:2008/07/01(火) 14:35:18 ID:???
MySQLのupdate分で以下はどうすればいい?

名前
----
オレ1
オレ2
オレ3

これを

オマエ オレ1
オマエ オレ2
オマエ オレ3

に一発変換したい。
434NAME IS NULL:2008/07/01(火) 14:48:00 ID:???
「オレ4」はあるのか。もしあったら「オレ4」のままか、それとも「オマエ オレ4」になるのか。
435433:2008/07/01(火) 14:49:43 ID:???
オレ4 があれば オマエ オレ4 にしたい。
元のテーブル内の名前が「オレ」で始まるデータすべての前に、
「オマエ」をつけたい。
436NAME IS NULL:2008/07/01(火) 15:26:19 ID:???
UPDATE table SET 名前 = 'オマエ ' || 名前 WHERE 名前 LIKE 'オレ%';

MySQLで動くのかは知らない。
437NAME IS NULL:2008/07/01(火) 15:27:04 ID:???
update `テーブル`
set `名前` = "オマエ " + `テーブル`.`名前`
where like 名前 `オレ%`
438NAME IS NULL:2008/07/01(火) 15:56:43 ID:???
MySQLってreplace使えなかったっけ?
439433:2008/07/01(火) 16:01:52 ID:???
>>436, 437

ダメでした....

>>438

Replaceは Delete−>Insertじゃ??
440NAME IS NULL:2008/07/01(火) 16:02:47 ID:???
ダメってどうだめだったんだ?
ちょっとググってみたが、MySQLはANSIモード以外は|| 使えないからCONCAT 使えってあったけど。
441NAME IS NULL:2008/07/01(火) 16:09:16 ID:???
また、情報小出し厨か…
442433:2008/07/01(火) 16:23:52 ID:???
>>440

ビンゴ! concat でした。
ありがとうございます。

update テーブル set 名前=concat('オマエ ',名前) where 名前 like 'オレ%'
443NAME IS NULL:2008/07/02(水) 00:18:13 ID:???
それくらい自分で変換しろよw
444NAME IS NULL:2008/07/02(水) 02:46:04 ID:???
まったくだな。答だけを求めて自分で何とかしようとは思わないんだな…
9割以上のヒント出てるのに。
445NAME IS NULL:2008/07/02(水) 10:54:25 ID:zowmMABa
MySQLで、ブログの投稿(entries)とコメント(comments)を保存するためのテーブルをつくりました。

create table entries (
id integer primary key auto_increment,
title varchar(256) not null,
body text not null,
posted_at timestamp not null
);

create table comments (
id integer primary key auto_increment,
entry_id integer not null references entries(id),
body text not null,
posted_by varchar(32),
posted_at timestamp not null
);

このとき、最近の投稿から10件、コメントつきで取ってくる場合、どのようなSQLが効率いいですか。
今は
(a) select * from entries order by id limit 10;
としてから各投稿idごとに
(b) select * from comments where entry_id = ? order by id;
実行しているんですけど、これだと 1 + 10 = 11 回のSQLを発行するので効率が悪いです。

あと (a) を実行した後に投稿idを連結して
(b') select * from comments where entry_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) order by id;
を発行して、プログラム側で選り分けるぐらいしか思いつきません。でもこれも保守しづらいですよね。

なんかうまいSQLがあれば教えてください。

446NAME IS NULL:2008/07/02(水) 11:19:30 ID:???
MySQLのバージョンわからないけど、全部いっぺんに欲しいなら

SELECT * FROM entries
LEFT OUTER JOIN comments ON entries.id = comments.entry_id
WHERE entry_id IN (SELECT id FROM entries ORDER BY id LIMIT 10);

こんな感じ?
447NAME IS NULL:2008/07/02(水) 11:31:42 ID:???
あ、これだとcommentsの無いentriesが出てこないか。

SELECT * FROM entries
LEFT OUTER JOIN comments ON entries.id = comments.entry_id
WHERE entries.id IN (SELECT id FROM entries ORDER BY entries.id LIMIT 3)
ORDER BY 好きなように

か。
448NAME IS NULL:2008/07/02(水) 11:39:00 ID:???
>>446
>
>SELECT * FROM entries
>LEFT OUTER JOIN comments ON entries.id = comments.entry_id
>WHERE entry_id IN (SELECT id FROM entries ORDER BY id LIMIT 10);

ありがとうございます。しかし実行すると
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
というエラーになりました。MySQL 5 では副問い合わせに limit が使えないようです。
惜しいです。
449NAME IS NULL:2008/07/02(水) 18:47:24 ID:???
>>448
>>377に類似の質問がある。
回答は>>379とか>>382にあるけど、
>>445の前者みたいに素直に2文に分けたほうがいいと思う。
パフォーマンス面から言っても保守性から言っても。
450NAME IS NULL:2008/07/02(水) 22:16:03 ID:???
・DBとバージョン
Access2007

・テーブルデータ

Hinmei Type Goukei
--------------------
A     X    3
A     Y    1

・欲しい結果

Hinmei Type Goukei Wariai
---------------------------
A     X    3    75%
A     Y    1    25%

・説明
75% = 3 ÷ (3 + 1)
25% = 1 ÷ (3 + 1)

おながいします
451NAME IS NULL:2008/07/02(水) 22:45:29 ID:???
>>450
日本語で説明しろハゲ
452NAME IS NULL:2008/07/02(水) 23:03:51 ID:???
Wariaiは、Type毎に決まるGoukeiのHinmeiに対する割合です

つまりHinmei A、Type XのGoukeiは3なので、この行のWariai75%は
以下のように求めます

(Hinmei A、Type XのGoukei 3)÷(Hinmei AのGoukei 3+1) = 3 ÷ 4 = 75%

ちょっと説明しづらいです・・・
453NAME IS NULL:2008/07/02(水) 23:11:32 ID:???
>>452
そういうのはいいんだよw

何行になる可能性があるのか、すなわち、X、Y ってのは
何種類あんの?
454NAME IS NULL:2008/07/02(水) 23:38:47 ID:???
単純にサブクエリで割ればいいだけなんじゃね。
そのまま、type / (SELECT sum(type) FROM Table) ってすると効率悪そうなので、
実際のSQLはもう一ひねり欲しいところだけど。
455NAME IS NULL:2008/07/02(水) 23:47:04 ID:???
>>449
ありがとうございます。
>>>445の前者みたいに素直に2文に分けたほうがいいと思う。
>パフォーマンス面から言っても保守性から言っても。
そうすることにします。>>379>>382は理解できませんでした。
456NAME IS NULL:2008/07/03(木) 04:33:44 ID:eUYpeICD
日本人がイスラム過激派に狙われる可能性もあります

220 名前: 名無し三等兵 [sage] 投稿日: 2008/06/30(月) 00:35:59 ID:???
イスラムや胡錦濤の記事にもhentai入ってて
ニュー速の連中がアルジャジーラとかにメールしようとして
鬼女が止めに入ったり、なかなかわかってるなぁと。

262 名前: 名無し三等兵 [sage] 投稿日: 2008/06/30(月) 00:43:47 ID:???
つーか原理主義者は日本に入り込んでいるし組織もあるから
原理主義者によって白昼堂々人通りのある場所で首を掻き切られて
助教授が殺されて犯人が何も特定できていないわけで・・・

297 名前: 名無し三等兵 [sage] 投稿日: 2008/06/30(月) 00:51:28 ID:???
>>272
いや・・・それが・・・
タレコミより前に韓国でコーランが焼かれたと報道されてて
アルジャジーラTVより韓国でコーランを燃やす映像が放映され、アラブ諸国でさまざまの反応が出ている。
・その映像を見た老人がショック死(サウジアラビア)
・その映像を見た青年ら十数人が韓国大使館に投石(シリア)

★祭り★ 「日本の母は息子の性処理係」毎日新聞が捏造記事41
http://human7.2ch.net/test/read.cgi/ms/1215003832/
★祭り★ 【毎日・変態報道】 毎日新聞、「2ちゃんねる」を名指し…「女性社員中傷書きこみで法的措置」で★26
http://mamono.2ch.net/test/read.cgi/newsplus/1215016627/
【記者】毎日新聞の英語版記事で日本を侮辱【豪人】
http://academy6.2ch.net/test/read.cgi/english/1213971760/
【Daily】毎日新聞英語版がひどすぎる 3【WaiWai】
http://society6.2ch.net/test/read.cgi/mass/1214603376/
【毎日新聞】 iチャネル解約スレ 【変態報道】
http://hobby11.2ch.net/test/read.cgi/keitai/1214802475/
457NAME IS NULL:2008/07/03(木) 05:54:13 ID:???
>>453
Hinmeiは30個ほどあったと思います(A,B,C,D・・・と続く)
Typeは必ずX,Yの2個です
なので、全体で60行ほど出力?

>>454
会社行って試してみます、一応帰宅後結果書き込みます
458NAME IS NULL:2008/07/03(木) 07:28:03 ID:???
>>457
計算式は、その行の goukei / Sum(goukei) Group By Hinmei でいいの?

Sum() じゃなくて、足し算に組み合わせがあるのかと思った。
そうでないなら、>>453 は無視してもらってOK

あと、>>454 じゃ絶対通らないからなw
459454:2008/07/03(木) 07:46:58 ID:???
おー、なんてこったいw
goukei / (SELECT sum(goukei) FROM Table)
だな。

Hinmei毎のWariaiを出すのなら、
SELECT * , goukei / (SELECT sum(goukei) FROM Table WHERE hinmei = T1.hinmei) * 100 FROM Table AS T1;

>>458
> goukei / Sum(goukei) Group By Hinmei
これ通らないよ。(端折ってるところ次第だが)
と、ツッコミ返しw

460NAME IS NULL:2008/07/03(木) 11:55:29 ID:rlpW59bU
SQLの質問じゃないかもしれないが

コマンドラインからで、
select結果を少しずつ表示するコマンドとかないですか
select * from table | less;
みたいな

人のサーバなんでファイル出力とかできません
今はlimit 100,50みたいに原始的なことやってます
461NAME IS NULL:2008/07/03(木) 12:23:51 ID:???
>>460
RDBMSが何かで変わると思わないか?
462NAME IS NULL:2008/07/03(木) 13:47:33 ID:???
というか、クライアントに何使ってるか、とk。
463NAME IS NULL:2008/07/03(木) 20:56:21 ID:???
【国際】PlayStationサイトにSQLインジェクション攻撃…悪意のあるコードが埋め込まれる - アメリカ
http://mamono.2ch.net/test/read.cgi/newsplus/1215043341/
464NAME IS NULL:2008/07/04(金) 16:09:09 ID:???
Oracle10gで連番の歯抜けを求めたいのですが、ちょっと条件が特殊でググったSQLでは上手く動きません

条件1 歯抜けを求めるのは500以降のみ。500以前のデータも普通に存在する
条件2 歯抜けとなっているレコードも削除フラグが立っているだけでテーブル上には存在している

上手く動かないSQLは以下の通りです

select nvl(min(no)+1,500)
from (select * from tbl where sakujo<>'1') A
where (not exists(select 1 from (select * from tbl where sakujo<>'1')) B where (no=A.no+1))) and (no>=500)

これを502以外に削除フラグが立っている状態で実行すると、503が返ってきてしまいます
500が返ってきて欲しいのですが、どうすればいいでしょうか?
よろしくお願いします
465NAME IS NULL:2008/07/04(金) 16:47:29 ID:???
>>464
括弧の数があってないような?

500番以上に削除フラグのレコードがあったらその最小値を返す。
500番以上に削除フラグのレコードがなかったら最大値+1を返す。
レコードの最大値が500番未満だったらどうする?
 500番を返す or 500番未満のレコードの最大値を返す

こんな感じでいいの?
466NAME IS NULL:2008/07/04(金) 17:16:02 ID:???
>>465
レスありがとうございます
カッコはすみません、ソースを見ながら打ったので間違えました

500以上のレコードがない場合には500が返ってきて欲しいです
つまり500で底上げされてるような感じです
削除フラグも、立っていればレコードが存在しないのと全く同じ扱いにしたいです

よろしくお願いします
467NAME IS NULL:2008/07/04(金) 17:37:36 ID:???
sakujo = '1' で削除状態とした。

select min(no) as no from

  select no from tbl where no >= 500 and sakujo = '1'
  union all
  select coalesce(max(no)+1,500) as no from tbl where no >= 500
) a
468NAME IS NULL:2008/07/04(金) 19:37:40 ID:???
SQL SERVER 2005なのですが、
delete文で削除したデータは戻せないでしょうか?
469NAME IS NULL:2008/07/04(金) 19:50:59 ID:???
>>468
はい
470NAME IS NULL:2008/07/04(金) 23:13:59 ID:???
>>468
yes
471NAME IS NULL:2008/07/04(金) 23:15:28 ID:???
>>468
ja
472NAME IS NULL:2008/07/04(金) 23:21:17 ID:???
Да.
473NAME IS NULL:2008/07/05(土) 00:04:41 ID:QKZYV0VE
SQLServerのInstead Of トリガの説明を読んだたのですが
拡張整合性って意味が分かりません。

例えば、ID(PK)、コード、区分、データみたいなテーブルで
ID:1、コード:0001、区分:0、データ:データ1
ID:2、コード:0001、区分:1、データ:データ2
ID:3、コード:0001、区分:1、データ:データ3

てな感じのデータに対してコードに対する区分0のものは1つ。
みたいな拡張した整合性を保つような処理を書けるってことでOKですか?

スレ違い?
474NAME IS NULL:2008/07/05(土) 12:14:54 ID:???
>>468
遅くなりましたが解答ありがとうございました
来週早速試してみます
475NAME IS NULL:2008/07/05(土) 12:16:57 ID:???
ぽかーん

>>473
スレ違い
476>>467 の typo かな:2008/07/05(土) 12:58:06 ID:???
>>468 が解答って、いったい >>474 はどんな質問したんだろう...
477NAME IS NULL:2008/07/05(土) 19:47:35 ID:???
ID | DATA_A | DATA_B | DATA_C |
--+-------+-------+--------+
 1|   aaa |   bbb |     ccc |
--+-------+-------+--------+
 2|   ccc |   bbb |    ddd |
--+-------+-------+--------+
 3|   ccc |   aaa |     eee |
--+-------+-------+--------+
 4|   ddd |   ccc |     bbb |
--+-------+-------+--------+

こういうテーブルのDATA_A,B,Cをグループ化して各項目の数を数えて

ccc 4個
bbb 3個
aaa 2個
ddd 2個
eee 1個

こういうデータを出力したいのですがうまく数えられないのです
どうしたら良いのでしょうか?
478NAME IS NULL:2008/07/05(土) 19:52:42 ID:???
select DATA, cout(*) from (
select DATA_A as DATA from tbl
union all select DATA_B from tbl
union all select DATA_C from tbl ) a
group by DATA
479NAME IS NULL:2008/07/05(土) 20:28:13 ID:???
>>478
ありがとうございます。
希望通りのものが出力できました
480NAME IS NULL:2008/07/07(月) 14:32:42 ID:???
>>468
トランザクションログをたぐって復元するっていうのは反則か?
481NAME IS NULL:2008/07/08(火) 00:11:45 ID:???
それだと直接さわった値は復元できないだろ
482NAME IS NULL:2008/07/08(火) 00:30:18 ID:???
「直接さわった値」ってなんのことだ?
483NAME IS NULL:2008/07/08(火) 01:02:34 ID:???
直接さわった値 の検索結果 約 124,000 件中 1 - 100 件目 (0.68 秒)
服ごしにさわった値 に一致する日本語のページ 約 80,700 件中 1 - 100 件目 (0.51 秒)
水着ごしにさわった値 に一致する日本語のページ 約 23,600 件中 1 - 100 件目 (0.21 秒)
スクール水着ごしにさわった値 に一致する日本語のページ 約 2,550 件中 1 - 100 件目 (0.68 秒)
ブルマごしにさわった値 に一致する日本語のページ 約 8,080 件中 1 - 100 件目 (0.56 秒)
484NAME IS NULL:2008/07/08(火) 01:02:45 ID:???
Yes!ロリコン
No!タッチ
485NAME IS NULL:2008/07/08(火) 21:21:50 ID:gzFC3ZLS
SQLだけで実現可能なのかどうかも判りませんがご教示ください。

・MySQL5
・テーブルデータ
+----+--------+
 ID  point
+----+--------+
 1   2000
 2   1000
 3   2000
 4   3000
 5   1000
 6   3000
 7   1000
 8   5000
 9   4000

・欲しい結果
+----+----+--------+
rank ID point
+----+----+--------+
 1   8  5000
 2   9  4000
 3   4  3000
 3   6  3000
 5   1  2000
 5   3  2000
 7   2  1000
 7   5  1000
 7   7  1000

・説明
ランキングです。同一のpointは同ランクとさせたいと思っています。
どうか、よろしくお願いいたします。
486NAME IS NULL:2008/07/08(火) 21:37:21 ID:???
rank関数があれば一発だけど、MySQLにはないよな
487NAME IS NULL:2008/07/08(火) 21:51:45 ID:???
>>485
SELECT (SELECT count(*)+1 FROM Table WHERE point > T1.point) AS rank ,* FROM Table AS T1 ORDER BY rank;
488NAME IS NULL:2008/07/08(火) 22:20:48 ID:gzFC3ZLS
>>487
ほんとうにありがとうございました。

思ったとおりの結果が得られました。
(なぜそうなるのかまでは、まだ理解できていませんが…)
489NAME IS NULL:2008/07/08(火) 23:28:10 ID:???
>>487
こういう域に到達するには、
どんな本読んで勉強すりゃいいんだすか?
490NAME IS NULL:2008/07/09(水) 11:03:19 ID:???
実際に工夫して書きまくる
491NAME IS NULL:2008/07/10(木) 00:47:37 ID:???
ランキングが欲しい

他IDのポイントと比較する必要がある

>>487

492487:2008/07/10(木) 01:51:27 ID:???
俺が相関サブクエリ厨なだけかもしれんが、この手の物はよくつかわね?
>>379も俺なんだけど、ほとんど同じサブクエリを使ってる。

ちなみに>>379とは別のやり方として>>382のやり方があるように、
>>487ではなく、>>382のように不等号結合を用いたやり方でも出来るはず。

本を読んでも実際使わないと身につかないから、ググって試行錯誤しながら
場数を踏めば出来るんじゃないかな。「SQL 順位」あたりでググれば>>487
ような物はすぐ出てくるだろうし。
493NAME IS NULL:2008/07/11(金) 00:26:28 ID:???
別に大したsqlじゃない
494NAME IS NULL:2008/07/11(金) 09:45:00 ID:???
>>493
まあそう謙遜せずに教えて下さいよ。
495NAME IS NULL:2008/07/13(日) 21:04:51 ID:pPOM6l0V
・DBとバージョン
ACCESS2000

・テーブルデータ
[table_a]
seq | name
--------+--------
1 | tanaka
2 | sato

[table_b]
seq | name
--------+--------
3 | suzuki
4 | tamura

・欲しい結果
seq | name
--------+--------
1 | tanaka
2 | sato
3 | suzuki
4 | tamura

・説明
 
「テーブル 結合」などで検索してもinner joinとかが
ひっかかり、ちょっと違うようなきがするので
ここで質問させていただきます。
フィールドが全く同じtable_aとtable_bがあり、
そのレコードをまとめたいのですが
SQLでどう書けばいいでしょうか?
496NAME IS NULL:2008/07/13(日) 21:06:58 ID:???
>>495
union
497495:2008/07/13(日) 21:15:59 ID:pPOM6l0V
unionで調べてみたところ
テーブルが2つの場合はうまくいきました。
テーブルが3つの場合はどういう表記になりますか?
498NAME IS NULL:2008/07/13(日) 21:17:45 ID:???
>>497
試せハゲ
499495:2008/07/13(日) 21:21:27 ID:pPOM6l0V
table_a
union
table_b
union
table_c

試すとエラーがでました。
「抽出条件でデータ型が一致しません」
500495:2008/07/13(日) 21:27:02 ID:pPOM6l0V
自己解決しました
ありがとうございました。 ハゲ
501NAME IS NULL:2008/07/13(日) 21:28:22 ID:???
>>500
そういうのいらんから。
せめて、どういう方法でやって解決したかくらい書けよハゲ

そうすれば、あとから見るやつの参考になるだろ
502NAME IS NULL:2008/07/14(月) 00:41:27 ID:9UFU5xd9
SQLでどう結果を返したらいいのかわからないので力を貸してください。
下記の受注表と入荷表があります。

受注表

担当 商品コード 顧客コード
───── ───── ─────
田中 A1 001
田中 A1 002
田中 A1 003
山田 A2 020
山田 A1 003
田中 A1 020


入荷表

担当 入荷コード 入荷日
───── ───── ─────
山田 X013 20080701
山田 X013 20080701
田中 X013 20080701
山田 X013 20080630
山田 X013 20080630
田中 X123 20080630

自分の欲しい結果を出すためのSQLは下記のクエリです。

≪受注表テーブルから≫
SELECT 担当, 顧客コード FROM 受注表
WHERE
担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ;

SELECT 担当, 顧客コード FROM 受注表
WHERE
担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ;

≪入荷表テーブルから≫
SELECT 担当, 入荷日 FROM 入荷表
WHERE
担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ;

SELECT 担当, 入荷日 FROM 入荷表
WHERE
担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ;

これらで出る結果をただ下記のように横並びに出したいのですがどうしたらよいでしょうか?
「担当」の項目に関しては複数でますが気にしないで下さい。
ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです。

担当 顧客コード 担当 顧客コード 担当 入荷日 担当 入荷日
── ───── ── ───── ── ──── ── ─────
田中 003 田中 020 田中 20080701 田中 20080630
503NAME IS NULL:2008/07/14(月) 01:16:18 ID:???
>>502
それだけの説明だと、SELECT の中に SELECT を書け、としか言えん。
504NAME IS NULL:2008/07/14(月) 12:35:54 ID:???
DB:Oracle10g

[TABLE_A]
ID1  NAME
--------------
1   あああ
2   いいい
3   ううう


[TABLE_B]
ID1  ID2
--------------
1   3
1   4
2   3
3   4


[TABLE_C]
ID3  ID2
--------------
a   3
a   4


[結果]
ID1  NAME
--------------
1   あああ



TABLE_C.ID3 = 'a' のID2に紐付くTABLE_Aのレコードを
取得したいのですが、どうすればいいのでしょうか?

select
TABLE_A.ID1,
TABLE_A.NAME
from
TABLE_A,
TABLE_B,
TABLE_C
where
TABLE_C.ID3 = 'a' and
????? INやEXISTSを試してみましたがダメでした;;
505NAME IS NULL:2008/07/14(月) 13:27:49 ID:???
>>504
取得したい結果に対して条件が明らかにおかしいのが理解できてるか?

どうあがいてもTABLE_C.ID3='a'だとTABLE_C.ID2が3と4になるだろ?
んで、TABLE_B.ID2が3,4になるTABLE_BID1は1,2,3ってのは分かるよな?
そうなるとTABLE_A.ID1が1,2,3になるレコードは…

お前が幾ら間抜けでももう気づいただろ?
506504:2008/07/14(月) 13:46:18 ID:???
1つのSQLでは結果は導き出せないという事ですか?
507NAME IS NULL:2008/07/14(月) 14:57:48 ID:???
>>506
ID1 = 1 に絞り込む条件が足りないってことだよ
508NAME IS NULL:2008/07/14(月) 15:03:16 ID:???
>>506
というか、オマイが提示したテーブルとデータからだと、
SELECT * FROM TABLE_A WHERE ID1 = (
  SELECT MIN(ID1) FROM TABLE_B WHERE ID2 = (
    SELECT MIN(ID2) FROM TABLE_C WHERE ID3 = 'a'
  )
);
っていうSQLでも[結果]の内容は得られる。
んでも、TABLE_C.ID3='a'で得られるTABLE_C.ID2や
そこから得られるTABLE_B.ID1のMINを取って条件にする、っていうのは
オマイが本当にやりたい事じゃないと想像は出来る。

要は「オマイが何をしたいのかよく分からん。」ってこった。
509NAME IS NULL:2008/07/14(月) 15:04:45 ID:HFZ59XZz
遠まわしすぎて、言ってる意味が・・・
自分の解釈が正しければ、
TABLE_C.ID3 = 'a' のID2に紐付くTABLE_Aのレコードは取得できないって事ですよね。
510NAME IS NULL:2008/07/14(月) 15:06:09 ID:???
>>509
出来るだろ。
その条件だと
1   あああ 
2   いいい 
3   ううう 
が戻る。
511NAME IS NULL:2008/07/14(月) 15:45:12 ID:???
>[結果]
>ID1  NAME
>--------------
>1   あああ

こうするための条件が足りないか、この結果が間違ってるのかどっち?
512NAME IS NULL:2008/07/14(月) 15:46:14 ID:???
>>511
あと、
・TABLE_A,TABLE_B,TABLE_Cのデータ内容が間違ってる
ってのもあり得るな。
513NAME IS NULL:2008/07/14(月) 15:47:13 ID:???
上司からこんな風に聞かれたり命令されたりしたら、どう答えるのがいいんでしょうか。
514NAME IS NULL:2008/07/14(月) 15:50:22 ID:???
>>513
まずは自分で考つく結論をいくつか箇条書きにしてリストアップしろよ。
515NAME IS NULL:2008/07/14(月) 17:19:58 ID:???
こういうことじゃね?もっと例を挙げればよいかも。

SELECT id1, name
FROM table_a
WHERE id1 IN (
SELECT id1
FROM table_b B LEFT OUTER JOIN table_c C
ON B.id2 = C.id2
AND C.id3 = 'a'
GROUP BY B.id1
HAVING COUNT(B.id2) = (SELECT COUNT(*) FROM table_c WHERE id3 = 'a')
AND COUNT(C.id2) = (SELECT COUNT(*) FROM table_c WHERE id3 = 'a')
);
516504:2008/07/14(月) 18:21:26 ID:???
>>515
ありがとうございます。
TABLE_Bに下記のようなレコードを追加したら取得できなくなりました。
完全一致ではなく、TABLE_C.ID3 = 'a' のID2を全て含んでいればOKのような
データ取得をしたいのですが、難しいでしょうか。

[TABLE_A]
ID1  NAME
--------------
1   あああ
2   いいい
3   ううう


[TABLE_B]
ID1  ID2
--------------
1   2   ←追加レコード
1   3
1   4
2   3
3   4


[TABLE_C]
ID3  ID2
--------------
a   3
a   4


[結果]
ID1  NAME
--------------
1   あああ
517NAME IS NULL:2008/07/14(月) 18:48:34 ID:???
>完全一致ではなく、TABLE_C.ID3 = 'a' のID2を全て含んでいればOKのような
>データ取得をしたいのですが、難しいでしょうか。
だ・か・ら・・・最初からいいなよw

SELECT id1, name
FROM table_a
WHERE id1 IN (
SELECT B.id1
FROM table_b B, table_c C
WHERE B.id2 = C.id2
AND C.id3 = 'a'
GROUP BY B.id1
HAVING COUNT(B.id2) = (SELECT COUNT(*) FROM table_c WHERE id3 = 'a')
);

Oracle立ち上げるの面倒だから検証してないよ。
ちなみにきちんと理解してから使いなさいよ。
いつまでたってもうであがらないよ。
518NAME IS NULL:2008/07/14(月) 18:53:42 ID:???
>ID2を全て含んでいれば

ここが抜けてたからさっぱりわからなかったんだぜw
519NAME IS NULL:2008/07/14(月) 19:14:18 ID:???
ちなみに、TABLE_C が、次のようになったとしたら、

[TABLE_C]
ID3  ID2
--------------
a   3
a   4
a 3

>>504 は(それでも) ID1 = 1 という結果が欲しいの? それとも結果ナシ(空集合)が欲しいの ?
520NAME IS NULL:2008/07/14(月) 20:57:32 ID:???
>>504
「SQL 商演算」でぐぐれば答え出てくるよ
521NAME IS NULL:2008/07/14(月) 22:00:15 ID:???
エスパーくらい常備しとけよな
522NAME IS NULL:2008/07/15(火) 00:56:12 ID:???
魔美くんはうちにはいません。
523NAME IS NULL:2008/07/15(火) 01:31:33 ID:???
伊藤さんなら
524504:2008/07/15(火) 11:46:09 ID:???
>>517
勉強不足ですみません;;
ありがとうございます、助かりました。

>>519
TABLE_CはID3+ID2でキーになっているので
そういうデータは入ってこない想定です。


皆様ご迷惑おかけしました。
525NAME IS NULL:2008/07/16(水) 11:05:54 ID:???
>>3の形式で質問です。
>>3のようなタイプのテーブルを新規で作る場合、
最新データかどうかを判別するためのフラグ列を追加しておけば、

select * from Table where flag = True

というシンプルなSQLだけで抽出できてよさそうに思えます。
日付とフラグがある意味重複したデータなわけですが、
これをやるのは好ましくないでしょうか?
526NAME IS NULL:2008/07/16(水) 11:07:35 ID:???
>>525
最新データが追加されるたびに、
それまでの最新データのフラグを折る作業が必要になる。

それとのトレードオフだな。
527NAME IS NULL:2008/07/16(水) 12:53:27 ID:???
まあトリガとかで何とかなるだろうけど、そんなにそれが重要なら
もう一つテーブル作ったりするかなあ。
528NAME IS NULL:2008/07/16(水) 16:10:59 ID:???
>>525
単純に auto increment のフィールドを作って連番付けるのではだめなの ?
529NAME IS NULL:2008/07/16(水) 16:37:47 ID:???
更新するときにwhereに二つ条件を書いて両方に当てはまるものだけ更新したいのですが、どのように記述すればいいのでしょうか?
530NAME IS NULL:2008/07/16(水) 16:41:32 ID:???
ANDでつなぐ
531NAME IS NULL:2008/07/16(水) 16:49:06 ID:???
できました。ありがとうございます。
532NAME IS NULL:2008/07/16(水) 18:42:06 ID:???
>>528
連番つけても、idごとのグループでの最大のデータをひっぱるときは、
結局>>3と手間は変わらないのでは?
auto increment だと別のやり方ができるんですか?
533NAME IS NULL:2008/07/16(水) 21:50:58 ID:???
質問です。

作成したテーブルに列を追加したいのですが
追加した列を指定した列と列の間に入れる事ができません。
例えば以下のテーブルについて、NAMEとADDRESSの間にTESTという列を追加しようとした場合
TELの後ろにTESTがついてしまいます。

ID NAME ADDRESS TEL


新規にテーブルを作成せず、列を指定した位置に追加をするにはどうすればいいでしょうか?
ご教授お願いします。
534NAME IS NULL:2008/07/16(水) 21:54:46 ID:???
>>533
無理じゃね?
535NAME IS NULL:2008/07/16(水) 22:28:55 ID:???
>>534
やはり無理なのでしょうか…。


既存のテーブルにあるデータをコピーしておき、新規でテーブルを作成し、データを新規テーブルにコピーする

という方法しかないのでしょうか。
536NAME IS NULL:2008/07/16(水) 22:31:19 ID:???
>>535
SQL の規格は確認してないけど、実装依存っぽい気がする。
つーか、 SELECT 発行するときに順番を指定すればいいだけ、な気もw
537NAME IS NULL:2008/07/16(水) 22:38:48 ID:???
>>536
SELECT発行時に順番を指定するというのは考えていませんでした。

SELECT * FROM TABLE;

というSELECT文でデータを呼び出していたためです。
SELECT発行時の順番指定を含め、検討していきたいと思います。

ありがとうございました。
538NAME IS NULL:2008/07/16(水) 22:46:11 ID:???
今どき SELECT * でデータを取る人がいるとは意外だった
539NAME IS NULL:2008/07/16(水) 22:47:14 ID:???
俺的にはストアドを使わない、ってことが意外w
540NAME IS NULL:2008/07/16(水) 22:52:47 ID:???
>>539
馬鹿は黙ってろ
541NAME IS NULL:2008/07/16(水) 22:58:57 ID:???
普通に使ってるけどな > SELECT *
クライアント側で列の順序に依存する方がおかしい。
542NAME IS NULL:2008/07/17(木) 10:42:27 ID:???
SELECT * は手打ちのときだけだな。
プログラムの中からはやらん。
543NAME IS NULL:2008/07/17(木) 15:06:31 ID:C/jgXBiG
投稿記事がしまってあるテーブルがあります。
で、ある記事を表示してる場所で、その(投稿日時順に並べて)前後の記事を取得したいと思いまして。

まず、
SELECT ID FROM 投稿 ORDER BY 投稿日時;
ですべてのIDを取得して、その前後をホスト言語で取り出すというのをやってみたのですが
これだと、記事の数が少ないうちはいいとしても、膨大になっていったら大変だなと。

そこで、LIMIT OFFSETを使って、対象記事の前後合わせて三つだけ取り出せれば
少しは負荷軽減になるのではないかと思い、対象の記事より新しい記事がいくつあるか分かれば、OFFSETの値を決められるので

SELECT COUNT(*) FROM 投稿 B WHERE B.投稿日時 > (SELECT A.投稿日時 FROM 投稿 A WHERE A.ID = 対象記事のID) ORDER BY B.投稿日時
でいけるかと思いきや、GROUP BY 投稿日時にしろとエラーが出ました。
ですが、投稿日時で集約しても、当然ですが期待する結果は得られませんでした。

どうすればいいのでしょうか
お願いいたします。
544543:2008/07/17(木) 15:22:25 ID:???
うん?書き込み終わってから気づいたんですが
ORDER BY が外側にあるからいけないんですよね・・

SELECT COUNT(*) FROM 投稿 Z
WHERE Z.ID IN
(SELECT ID FROM 投稿 B WHERE B.投稿日時 > (SELECT A.投稿日時 FROM 投稿 A WHERE A.ID = 対象記事のID) ORDER BY B.投稿日時)

でいけた感じですが・・・
なんかサブクエリが入れ子過ぎ。
もう少しうまい方法ないでしょうか?
545NAME IS NULL:2008/07/17(木) 15:30:38 ID:???
ある日時以降の数数えるだけならORDER BY いらないでしょ
546543:2008/07/17(木) 15:33:17 ID:???
連投すんません。
よく考えたらORDER BYいらないですよね。
なにか大きく勘違いしていました。

SELECT COUNT(*) FROM 投稿 B WHERE B.投稿日時 > (SELECT A.投稿日時 FROM 投稿 A WHERE A.ID = 対象記事のID)

ただ、また別の疑問がわいたのですが
投稿日時をSQLの関数?NOW()で取得していた場合
投稿日時が同じになることってないんでしょうか?
トランザクションがあるのでなさそうな感じはするのですが・・・

実装依存な感じでしょうか?
ちなみにPostgresqlです。
547NAME IS NULL:2008/07/17(木) 15:35:18 ID:???
そりゃ同じになる可能性はあると思うよ。
IDは投稿順になるわけじゃないの?
もし投稿順なら、そっち使えるかもね。
548NAME IS NULL:2008/07/17(木) 15:57:48 ID:???
>>545
>>547
レスありがとうございます。

>>547
そうか、そうですよね。
IDがシーケンスになってるから、それでいけますね。

SELECT COUNT(*) FROM 投稿 WHERE ID > 対象記事のID

なんてすっきりしたんでしょうw
ありがとうございました。
549NAME IS NULL:2008/07/17(木) 16:36:43 ID:???
SELECT * FROM 投稿 WHERE ID >= (
 SELECT MAX(ID) FROM 投稿 WHERE ID > 対象記事のID)
ORDER BY ID LIMIT 3
とかw
550NAME IS NULL:2008/07/17(木) 18:30:47 ID:???
前後の記事を取り出すのに、なぜCOUNT(*)なんだろう…
551NAME IS NULL:2008/07/17(木) 18:54:46 ID:???
>ID > 対象記事のID
そういやこれ逆だったわな < ね
552NAME IS NULL:2008/07/17(木) 22:08:36 ID:IclX9yt8
よろしくお願いします。

postgreで勉強中なのですが、上手くSQLを組めません・・・

商品AとBを買った人の中から商品Cを買った人を省きたいのですが、
どうやれば良いのでしょうか?

ID| 商品 |
--+--------+-
10|  A  |
--+--------+-
10|  B  |
---+-------+-
10|  C  |
--+--------+-
20|  A  |
--+--------+-
20|  B  |
--+--------+-
30|  B  |
---+-------+-


上記例だと、IDが20の人だけ取れれば良いのですが。。

553NAME IS NULL:2008/07/17(木) 22:16:51 ID:???
>>552
select * from tbl
where id not in (select id from tbl where 商品 = 'C')

パフォーマンス? 知らねw
554NAME IS NULL:2008/07/17(木) 22:20:24 ID:???
postgreならcase使えるんじゃね
555NAME IS NULL:2008/07/17(木) 22:50:25 ID:???
>>552
SELECT id FROM Table WHERE 商品 IN ('A' ,'B') GROUP BY id HAVING count(DISTINCT 商品) = 2
EXCEPT
SELECT id FROM Table WHERE 商品 = 'C';
556552:2008/07/18(金) 00:39:19 ID:???
すいません、寝落ちしてました。
猛烈に眠いので、明日試させてください。。
557NAME IS NULL:2008/07/19(土) 21:27:40 ID:???
申し訳ありませんがお知恵をお貸しください。
MySQL5.0を使っています。
>>3の例において、各ID毎の最新の5件のデータを取得するには
どうすればよろしいでしょうか?

ログの用なテーブルがあり、アクセス頻度を見るために近々5アクセス分を
抽出したいのですが、どうも思いつきません。
558NAME IS NULL:2008/07/20(日) 02:04:30 ID:???
>>557
ふつうはrankとか使うけど、MySQLは分析関数ないから
サブクエリで代用するしかないんじゃね?

select * from
TableName A
where (select count(*) from TableName
   where ID = A.ID and DATE >= A.DATE
   ) <= 5
559NAME IS NULL:2008/07/22(火) 11:25:14 ID:n+kvbX/3
VidualStadio2008(VB) と SQLSERVER2005 で開発を行っています。

以下のようなテーブルがあったとして、

No Data1 Data2
------------------------
1 aaaaa bbbbb
2 ccccc ddddd
2 eeeee fffff
3 ggggg hhhhh
3 iiiii jjjjj
4 kkkkk lllll
5 mmmmm nnnnn
5 ooooo ppppp
. . .
. . .
. . .
---------------------------
※(No には 最大2つまでの重複あり)

VB から No を2つ入力させ、SQL Server 上で行の入替を行いたいと考えております。
例えば1と5を入力させると、以下のようになります。

No Data1 Data2
------------------------
5 mmmmm nnnnn
5 ooooo ppppp
2 ccccc ddddd
2 eeeee fffff
3 ggggg hhhhh
3 iiiii jjjjj
4 kkkkk lllll
1 aaaaa bbbbb
. . .
. . .
. . .
---------------------------

どのようにすればいいか、皆目検討がつきません。
SQL の構文で実現できるのか、VB 側のデータテーブル上で入替て、
それを SQL Server のデータベースに反映させる方がいいのか、
ご教授いただけましたら幸いです。
560NAME IS NULL:2008/07/22(火) 11:41:31 ID:???
>>559
RDBには格納順という概念はない、あるのはキーでのソート順だけ。
No の他に 並び順のフィールドでも作る?
561NAME IS NULL:2008/07/22(火) 12:43:41 ID:???
RDB は Excel じゃない。
562NAME IS NULL:2008/07/22(火) 13:39:25 ID:???
>>558
返事遅くなりました。アドバイスありがとうございます。
早速試してみます。
563559:2008/07/22(火) 13:48:23 ID:n+kvbX/3
>>560-561
なるほど、根本的に RDB というものをカン違いしていました。
並び順のフィールドを作るか、No 自体の数字を入れ替えてソートすることで対応したいと思います。
564NAME IS NULL:2008/07/22(火) 16:52:02 ID:+8NZqP26
テーブルAに2つのフラグbとcがあるときに、
以下の2つのSELECT文の結果を一回のSQLで
取得したいんですけどどうすればいいんでしょうか。
1. SELECT * FROM A WHERE b = 1 OFFSET 10
2. SELECT * FROM A WHERE c = 1

565NAME IS NULL:2008/07/22(火) 16:57:24 ID:???
unionで繋げば?
566564:2008/07/22(火) 17:12:42 ID:+8NZqP26
>>565
ありがとうございます!
完璧UNIONでした!知りませんでした。
567564:2008/07/22(火) 18:02:26 ID:+8NZqP26
すいません、先ほどのUNIONを使ったSQLの結果の
件数を知りたい場合はどうしたらよいのでしょうか。
568NAME IS NULL:2008/07/22(火) 18:03:44 ID:???
最近の人ってググればすぐわかるよーなことを
どうしていちいち聞くのかな

だれとはいわないけどさー
569NAME IS NULL:2008/07/22(火) 18:13:12 ID:???
ごめん、ちょっと冷静になった。

ヒント:COUNT と 括弧
570NAME IS NULL:2008/07/22(火) 18:15:56 ID:???
予想では使ってるDBがサブクエリーが使えないバージョンだと泣きが入る。
571564:2008/07/22(火) 18:50:06 ID:+8NZqP26
僕の検索能力では調べれませんでした。。
以下のようなOFFSETが入ったSQLの結果件数を
COUNTするにはどうすればいいのでしょうか。

SELECT * FROM A WHERE b = 1 OFFSET 10

検索結果に対してOFFSETがかかってうまくいかないんです。
572NAME IS NULL:2008/07/22(火) 18:58:44 ID:???
>>571
なんで OFFSET した COUNT を取りたいのか意味不明だけど
普通に COUNT(*) から OFFSET の値を引けば良いんじゃ?
573564:2008/07/22(火) 19:16:06 ID:+8NZqP26
>>572
ちょっと変則的なページング処理を
しようとしているんです。

後でOFFSETの値を引く方向ですすめます!
ありがとうございました!
574NAME IS NULL:2008/07/22(火) 19:16:07 ID:???
普通に考えると
select count(*) from (select * from xxx offset 10) x
なんだろうけど、offset や limit は規格化されてるわけじゃないうえ、
DBMSによってはサブクエリでは使えないとかいろいろあるからなんともいえん。
具体的な正解が欲しいならDBMSとバージョンは書いとこうよ。
575NAME IS NULL:2008/07/22(火) 19:22:01 ID:???
limit/offsetでのページングというのはデータに余り変化がないときはいいが、
データが時々刻々変わる場合は向いてないよね。
初期のニコニコ動画がそんな感じだった。
1ページ目から2ページ目に移るとさっき見たのが順位が落ちで2ページ目にも表示される。
3ページ目に移るとまた同じ・・・笑ったなぁ〜。
いまは負荷分散のためか一定期間結果をキャッシュしておいてそれを見せてるので目立たなくなった。
576NAME IS NULL:2008/07/22(火) 19:44:55 ID:1TEKs3il
GROUP BY句を使用すると出力レコードはデフォルトでソートされるのでしょうか?

たとえば私の環境上では
select age from hoge group by age;
のような文を実行すると、テーブルhogeへのデータの挿入順は関係なく
昇順にageが出力されます。

『select age from hoge group by age;』と
『select age from hoge group by age order by age;』
は等価であると考えて良いのでしょうか?

よろしくお願いします。
577564:2008/07/22(火) 19:47:23 ID:+8NZqP26
>>574
ありがとうございます!これビンゴです。
UNIONした結果全体にエイリアスをかけてなくて
ハマってました。。

DBMSはMySQL4.1です。
ぎりぎりサブクエリが使えるので助かりました。

>>575
そうなんですね。。そうするとDB側ではなくて
その上のアプリケーションでページングするのが
一般的なんでしょうか?
578NAME IS NULL:2008/07/22(火) 20:28:27 ID:???
>>576
規格上はorder byを指定しない限りは順序の保障はない。
579NAME IS NULL:2008/07/22(火) 20:30:48 ID:???
DB界のFAQだな。
580NAME IS NULL:2008/07/22(火) 20:31:04 ID:???
>>576
ほとんどの処理系で同じ結果になると思うが
それはたまたまそうなっているだけで
保証されているわけではない。
581NAME IS NULL:2008/07/22(火) 20:49:37 ID:???
可能性としてはageに逆順の索引が付いていると
逆順でリストしてしまうへそ曲がりな処理系はあるかもしれない。
create index ix_table on table (age desc)
582NAME IS NULL:2008/07/23(水) 00:22:40 ID:???
以下のような気温テーブルから地方毎に最低気温の県を列挙するには
どうしたら良いでしょうか。

期待する結果
東京
大阪

気温テーブル
県   地方 気温
東京  関東 10
埼玉  関東 20
千葉  関東 30
神奈川 関東 40
大阪  関西 20
京都  関西 30
兵庫  関西 40
583NAME IS NULL:2008/07/23(水) 00:27:17 ID:???
>>582
ID とかつけようぜ。

地方で Group by して、Min(気温)で、地方と最低気温が取れるだろ。
それと気温テーブルを結合して。
584NAME IS NULL:2008/07/23(水) 00:49:45 ID:???
>>583
> 583 名前:NAME IS NULL [sage]: 2008/07/23(水) 00:27:17 ID:???

早速ありがとうございます。
以下のようにすると地方毎の最低気温が取得できるのは分かるのですが、
ここから県を取り出すところが良く分かりません。
「気温テーブルを結合して」がキーワードだと思うのですが・・・

select 地方, Min(気温) FROM 気温 group by 地方
585NAME IS NULL:2008/07/23(水) 01:12:55 ID:???
>>584
583のおかげで、3を参考にして以下のようにすれば良いと分かりました。
ありがとうございました。

select 県 from 気温 A
inner join
(select 地方, Min(気温) as 最低気温
from 気温 group by 地方
) B
on A.地方 = B.地方
and A.気温 = B.最低気温
586NAME IS NULL:2008/07/23(水) 01:17:02 ID:???
>>584
そのクエリをfrom句でjoinしてやれ
587586:2008/07/23(水) 01:17:47 ID:???
orz
588NAME IS NULL:2008/07/23(水) 09:38:53 ID:NMryV+aT
以下の方法でもOKなのですがもっとスマートなやり方は無いものでしょうか?
update a_tbl set
a_last_date = (select max(history) from h_tbl where h_usr_id = 1),
a_first_date = (select min(history) from h_tbl where h_usr_id = 1)
where a_usr_id = 1;
589NAME IS NULL:2008/07/23(水) 23:24:34 ID:???
>>588

update a_tbl
set (a_last_date, a_first_date) =
(select max(history), min(history) from h_tbl where h_tbl.h_usr_id = a_tbl.a_usr_id)
where a_usr_id = 1;
590588:2008/07/24(木) 12:18:03 ID:l/zxaIaM
>>589
ありがとうございます
591NAME IS NULL:2008/07/28(月) 11:02:35 ID:WzQ+GMO3
謎の現象で悩んでいます。

MySQL4.0.27
monsterテーブル
monster_id int(3) AutoIncrement
name varchar(50)
name_hira varchar(50)

テーブルには
name   name_hira
スライム すらいむ
ドラキー どらきー
イーター いーたー

のようなデータが入っています。

モンスターの名前を検索させるページを作ってるのですが

name LIKE '%イ%'

とやると先頭に「イ」のあるモンスターしかヒットしません。
スライム、イーター
が希望なのですが、イーターしかヒットしない状態です。

name_hira LIKE '%い%'
とすると、スライム、イーターともにヒットします。

カタカナだと何か問題があるのでしょうか?
DB文字コードはUTF-8
さくらサーバーを使用しており、提供されているphpMyAdmin上からSQLを打ってみても同じ結果になります。
592NAME IS NULL:2008/07/28(月) 11:15:14 ID:???
文字コード関連でその現象が出ます。
ちゃんと設定されてるか確認することと、スレ違いなのでMySQLのスレで聞いてみたほうが速いと思います。
593NAME IS NULL:2008/07/28(月) 11:26:55 ID:???
%はひとつしか使えない
594NAME IS NULL:2008/07/28(月) 13:39:38 ID:Rg/Att2o
研修生一同

トラブルシュート願い
⇒下記エラーコードについて調査願います。(根拠/裏づけ)

・at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
・at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
・at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
595NAME IS NULL:2008/07/28(月) 13:51:37 ID:???
「From: 研修生一同」 なんだろうか、それとも「To: 研修生一同」だろうか。
596591:2008/07/28(月) 18:11:03 ID:WzQ+GMO3
文字コードもUTF-8で打っていると思うのですが、もう一度確認してみます。
MySQLスレに移動します。
ありがとうございました。
597NAME IS NULL:2008/07/28(月) 23:45:44 ID:7GmddyCr
bakファイルについての質問です。

6GBのbakファイルをsqlに戻したいんですけど、
4GBまでの容量制限がかかっててもどせません。
使っているのはSQL Server Management Studioです。
なにか解決法はありますか?
598NAME IS NULL:2008/07/28(月) 23:48:54 ID:???
>>597
さすがに運用まわりはスレちがい、SQLサーバースレがあるだろ。
599NAME IS NULL:2008/07/30(水) 14:27:45 ID:L01Avq9F
為替のTickデータを整理しているのですが、
table1(day date,time int,Ticl_1 double)
table2(day date,time int,Tick_2 double)
という二つのテーブルをまとめるために(tick_1とtick_2の比較のため)
table3(day date,time int,tick_1 double,tick_2 double)
という合成したテーブルを作りたいのですが、まずtable3を作成して、そこに
insert into table3 select table1.day,table1.time,tick_1,tick_2 from table1,table2 where table1.day=table2.day and table1.time=table2.time
という文では情報量が多すぎてかはわかりませんが(およそ300万件)いくら待っても結果が現れません。
何かいい解決案はないでしょうか?わかりにくく長い文で申し訳ありません。
600NAME IS NULL:2008/07/30(水) 14:45:04 ID:???
多すぎだろ。範囲指定するかトランザクション開始してやってみては。
601NAME IS NULL:2008/07/30(水) 15:39:21 ID:???
「いくら待っても」ってどのくらいかなぁ?
INSERT INTOじゃなくて CREATE TABLE ASでも同じかなぁ。
602NAME IS NULL:2008/07/30(水) 17:07:36 ID:???
環境やDBMSがわからないとなんとも。
とりあえずは少量のデータやwhereで件数絞ると動くのかといったあたりを調べる。
603NAME IS NULL:2008/07/30(水) 17:13:16 ID:???
実行中に、CPU使用率やディスクの空き容量をチェックすれば
一所懸命やってるかわかるよ。
604599:2008/07/30(水) 21:30:30 ID:L01Avq9F
PCの能力自体は低くないと思うのですが・・・
少量だと一瞬(テキストで6KBくらいのデータ量)でできるのですが、流石に300万のデータだとPC自体が重く・・・というよりフリーズに近くなることも。
もうJavaでtxtに一度出力してからload data infile で読み込ませたほうが30秒くらいで終わるしいいのかとも思い始めました。
Java→txtで300万行に3分ほどかかりますがorz
605NAME IS NULL:2008/07/30(水) 23:59:18 ID:???
メモリの問題じゃね?
606NAME IS NULL:2008/07/31(木) 00:39:30 ID:???
create table t3 as
select t1.〜〜〜 from t1 left join t2 on t1.day=t2.day where t2.〜〜 isnot null;

で、どうなるかな?

実務でdb触らないから、なんか変かも知らないが。
607NAME IS NULL:2008/07/31(木) 10:38:47 ID:???
大量にinsertするなら、オートコミットで重くなるからトランザクションにしろって。
608NAME IS NULL:2008/07/31(木) 10:39:36 ID:???
って外部にいったん吐き出して入れるほうの話だった
609NAME IS NULL:2008/07/31(木) 23:20:14 ID:???
普通にt1とt2をjoinしたviewを作ればいいんじゃ?
610NAME IS NULL:2008/08/01(金) 20:02:40 ID:???
>>604
テキストに落とすのに3分かかるってのが結構問題なような
table1 table2 のday timeにインデックスはってる?
611NAME IS NULL:2008/08/01(金) 20:03:53 ID:???
table1 table2にインデックスをはって、table3にはインデックスをはらない。
この状態でやるとどうなんでしょ
612NAME IS NULL:2008/08/03(日) 16:58:30 ID:/9zGIUpT
DB: MySQL 5.X

[データ]

id | name | pid
-----------------
1 | AAA | 0
2 | BBB | 0
3 | CCC | 0
4 | DDD | 1
5 | EEE | 2
6 | FFF | 4
7 | GGG | 5
8 | HHH | 2

[結果]

id | name
---------------
1 | AAA
4 |  +DDD
6 |   ++FFF
2 | BBB
5 |  +EEE
7 |   ++GGG
8 |  +HHH
3 | CCC

[説明]

MySQLでOracleで言うところのconnect byを使用した
階層問い合わせを行いたいです。

親となるレコードがある場合にはp_id(親id)列に親レコードのidを持っています。
また階層の深さについては不定となっています。

MySQLの5系から使えるようになったストアドで対処も考えたんですが
まだ作れて無いです。
どなたかお知恵を。
613NAME IS NULL:2008/08/03(日) 18:02:56 ID:???
614NAME IS NULL:2008/08/03(日) 18:14:53 ID:???
>>612
どうもです。
そのサイトは私も見ましたが
できればテーブルのレイアウトを変えずに実現できればと。
もうちょっとがんばってみます。
615NAME IS NULL:2008/08/03(日) 22:05:27 ID:dYHFobVR
妥当なスレがないためここで聞きます。

access程度しか経験ないものなのですが、
Mysqlをやろうと思っています。

で、テーブル作成、レコード追加などすべてコマンドで
入力していくやりかたですけど、
こういったOSSのDBで構築されている方は、
一からコマンド打ち込んでやっていくんですか?

616NAME IS NULL:2008/08/03(日) 22:12:30 ID:???
たいした文章量じゃないし、
構造を後から見直すときにも便利だよ。
617NAME IS NULL:2008/08/03(日) 22:57:16 ID:???
phpMyAdminのほか探せば管理用のツールはいくつか出てくる。
ただ慣れてくるとスクリプトじか書きしたほうが早くなる。
618NAME IS NULL:2008/08/03(日) 23:00:38 ID:dYHFobVR
テキスト形式でテンプレみたいのあって、
必要な箇所だけ変更してコピペ・実行な
感じですか?

今月いっぱい休職期間なので、
mysqlをじっくりやろうかと思っていて、
ちょっと気になったので。

レスありがとです。
619NAME IS NULL:2008/08/03(日) 23:16:08 ID:???
>必要な箇所だけ変更してコピペ・実行な
まあそんな感じ。
テキストで作った方が早い場合が多い。
620NAME IS NULL:2008/08/04(月) 18:02:47 ID:???
あの,ローカル変数なるものを使ってみようと思うのですが,

DECLARE @message VARCHAR(255);
SET @message = "Hello";
SELECT @message as message;

を立て続けに実行しても
------------
| message |
============
| Hello |
------------

が返ってくるわけじゃないんですね…
621619:2008/08/04(月) 18:08:21 ID:???
http://www.openldap.org/lists/openldap-software/200111/msg00150.html
このようなことをしたいと思っているのですが・・・
622619:2008/08/04(月) 18:11:51 ID:???
すみません,勘違いだったようです.
SET @message = "Hello";
SET @message2 = "Hello2";
SELECT @message as message, @message2 as message2;
でちゃんと変数に代入されてました.

DECLARE はストアドプロシージャやストアドファンクションで
つかうんですね.
623NAME IS NULL:2008/08/04(月) 18:40:05 ID:???
ストアドプロシージャはDBMS毎にほとんど統一取れてないから環境は書いとけよ。
まあMSSQLだろうことは推測できるけど。
624NAME IS NULL:2008/08/04(月) 18:42:26 ID:???
; 使ってるからMyかもしれんけど。
625NAME IS NULL:2008/08/05(火) 11:55:40 ID:???
オートナンバーなカラムが一つある表があるとします.
-------
|  id  |
=======
|  1  |
|  2  |
|  5  |
|  6  |
-------
これに新しい行を一つ追加しその追加されたidを返す
という文を一つの文で書き表すことはできるのでしょうか?
626NAME IS NULL:2008/08/05(火) 12:06:29 ID:???
>>625
RDBMS依存
627NAME IS NULL:2008/08/05(火) 12:14:36 ID:???
>>626
MySQL を使おうと思っています.アプリ側の要求で,

「新規レコードを作成しそれを特定するIDが第一カラムに入った表を受け取る」

というSQL文を書かなければならないのですが,
そういう場所が異なるケースで頻繁に出てくるので
できればユーザ定義関数は使わずその場その場で
書くことができればと思っています.
628NAME IS NULL:2008/08/05(火) 12:22:29 ID:???
mysqlだと一行で追加と取得の同時は無理じゃね?
普通はINSERTした後にCならmysql_insert_id()呼ぶし
ODBCだとSELECT LAST_INSERT_ID()かな
629NAME IS NULL:2008/08/05(火) 21:36:29 ID:709tmytG
[質問]
全ての改行コード(CRLF、CR、LF)を空白文字に置換したい。
DBはoracleです。

以下のようにしたかったのですが、
replaceのネストは2つまでしかできない。

SELECT
replace(replace(replace(target, CHR(13)||CHR(10), " "), CHR(13), " "), CHR(10), " ")
FROM
tb
630NAME IS NULL:2008/08/05(火) 21:50:08 ID:???
>>629
regex_replace(targer,'(\\r|\\n)+',' ')
かな、Oracle使いじゃないので CRとLFが\\rと\\nでいいのかわからないのだけど。
631NAME IS NULL:2008/08/06(水) 05:41:18 ID:???
>replaceのネストは2つまでしかできない。
勝手に決めるなよw

WITH tb AS (
SELECT CHR(13)||CHR(13)||CHR(10)||CHR(10) AS target
FROM dual
)
SELECT
DUMP(target) AS target,
DUMP(
REPLACE(
REPLACE(
REPLACE(target, CHR(13)||CHR(10), ' '), CHR(13), ' '), CHR(10), ' ')) AS result
FROM tb
/

TARGET RESULT
------------------------ ---------------------
Typ=1 Len=4: 13,13,10,10 Typ=1 Len=3: 32,32,32
632NAME IS NULL:2008/08/06(水) 15:25:12 ID:???
以下のようなテーブルがあるとして、

No | Size
---+--------
1 | AAAAA
2 | AAAAA
3 | AAAAA
4 | AAAAA
5 | BBBBB
6 | BBBBB
7 | CCCCC
8 | CCCCC
9 | CCCCC
10 | BBBBB
11 | BBBBB
12 | CCCCC
13 | CCCCC
14 | CCCCC
15 | AAAAA
16 | AAAAA
17 | AAAAA
---+--------

No 順でソートし、重複を除いた状態で Size を取得するにはどうすればよいのでしょうか?
期待する結果は以下です。

AAAAA
BBBBB
CCCCC
BBBBB
CCCCC
AAAAA
633NAME IS NULL:2008/08/06(水) 15:28:18 ID:???
>>632
その説明だと「重複を除いたSize」は
AAAAA 
BBBBB 
CCCCC 
が結果になるんじゃね?
634632:2008/08/06(水) 15:28:53 ID:???
続きです。

SELECT DISTINCT size FROM TABLE ORDER BY No

ではもちろんダメで(当たり前ですが)、皆目どうすれば良いかわからない状態です。
重複を除くために DISTINCT を使えば、すべての重複がアウトになるし、
そうでなければ、全てのレコードが取得されちゃうし。
すみませんが、皆様のお知恵を拝借願います。
よろしくお願いいたします。
635632:2008/08/06(水) 15:31:43 ID:???
>>633
早速のご意見ありがとうございます。
説明がうまくいかず申し訳ありません。

AAAAA
BBBBB
CCCCC

を期待する場合は、>>634 でうまくいくのですが、
並びの時は重複とみなし、そうでない場合を重複とみなさない方法が
あれば良いのですが…。
636NAME IS NULL:2008/08/06(水) 15:40:06 ID:???
>>632
Noが詰まっている(開いていたら途切れていると判断していい)のなら、
SELECT size FROM Table AS T1 WHERE size != coalesce((SELECT size FROM Table WHERE no = T1.no -1),'dummy');
かな、違っててもヒントにはなるだろ。
coalesceでdummyを返すのは最初の行(No=1)の扱いだけ。
637636:2008/08/06(水) 15:43:16 ID:???
補足
実際のところORDER BY noがないとダメだろうから、
SELECT * FROM ...... ORDER BY no;
だな。
638NAME IS NULL:2008/08/06(水) 15:47:26 ID:???
>>635
OracleならLAG分析関数で
nレコード前を参照できるから、
こんな感じで上手く処理できるかもしれん。

SELECT NO, SIZE, PRE_SIZE FROM (
    SELECT NO, SIZE, LAG(SIZE) OVER (ORDER BY NO) PRE_SIZE FROM TEST_TBL

WHERE DECODE(SIZE, PRE_SIZE, 1, 0) = 0 ORDER BY NO
639NAME IS NULL:2008/08/06(水) 16:02:10 ID:???
Mysqlのストアドプロシージャで、

select * from テーブル名

のテーブル名の部分を変数にしたいのですが、

set table_name = 'テーブル名';
select * from table_name;

みたいな事はできないでしょうか?
640632:2008/08/06(水) 16:02:58 ID:???
>>636-637
バッチリでした。考え方まで教えてくださって本当にありがとうございます。

>>638
こちらの考え方も参考になりました。ありがとうございます。
641NAME IS NULL:2008/08/06(水) 18:01:56 ID:uG8FSzhP
alter database の第1引数(database_name)を変数で与える方法はありませんか。
因みにsqlserver2000。

declare @dbname nvarchar(50)
set @dbname = 'hoge'
alter database @dbname modify file(name = 'hoge1', newname = 'hoge2')
こんな感じで使いたい。
642NAME IS NULL:2008/08/06(水) 18:25:32 ID:???
ストアドで変数に使えないものがあるときは、いったん文字列にして
それをSQLとして実行させる手が使えることもある。
643NAME IS NULL:2008/08/07(木) 11:45:56 ID:???
ストアド内で計算をすると、
小数点以下が切り捨てになってしまうのですが
どうしたら小数点以下もちゃんと計算してくれますか?

元のデータ型がintだからでしょうか?
644643:2008/08/07(木) 11:51:33 ID:???
やっぱりそうでした。
castで計算したらちゃんと出ました。
645NAME IS NULL:2008/08/07(木) 23:41:58 ID:zMw3ykoO
>>641
declare @dbname nvarchar(50)
set @dbname = 'hoge'
declare @query varchar(255)
set @query = 'alter database ' + @dbname + ' modify file(name = ''hoge1'', newname = ''hoge2'') '
exec sp_sqlexec @query
646NAME IS NULL:2008/08/08(金) 03:20:32 ID:???
MySQL5.01を使用しております。
アクセスログのようなテーブルがあり、ログインする間隔を
求めたいと思っております。
ユーザー, アクセス日
a, 2007/01/10
a, 2007/01/14
a, 2007/01/26
といったテーブルから下記のような結果セットを求めたいのですが

ユーザー, 前回アクセス日, アクセス日, 前回アクセス日からの経過日数
a, NULL , 2007/01/10 , 0
a, 2007/01/10 , 2007/01/14 , 10
a, 2007/01/14 . 2007/01/26 ,12

SQLで可能でしょうか?
ご教授お願いいたします。
647NAME IS NULL:2008/08/08(金) 03:36:01 ID:???
>>646
select
a.ユーザー, max(a.アクセス日) as 前回アクセス日, b.アクセス日,
case
when a.アクセス日 is null then 0
else datediff(max(a.アクセス日), b.アクセス日)
end as 前回アクセス日からの経過日数
from
log_table as a
left outer join
log_table as b
on
(
a.ユーザー = b.ユーザー
and a.アクセス日 < b.アクセス日
)
group by
a.ユーザー, b.アクセス日

試してないけどこれでどうだろう
648647:2008/08/08(金) 03:37:26 ID:???
間違えた。

select
a.ユーザー, max(b.アクセス日) as 前回アクセス日, a.アクセス日,
case
when a.アクセス日 is null then 0
else datediff(max(a.アクセス日), b.アクセス日)
end as 前回アクセス日からの経過日数
from
log_table as a
left outer join
log_table as b
on
(
a.ユーザー = b.ユーザー
and a.アクセス日 > b.アクセス日
)
group by
a.ユーザー, a.アクセス日


こっちでも保証はできないが
649646:2008/08/09(土) 11:13:48 ID:???
>>648
お返事が遅れてすみません。希望していた動きになりました。
書き方がイメージできなかったので本当に助かりました。
ありがとうございます。
650NAME IS NULL:2008/08/10(日) 08:17:53 ID:r4EhpP4U
|東京|30|
|長野|15|
|愛知|20|
|大阪|20|
|青森|10|
のようなデータを順位付けして
|1|東京|30|
|3|愛知|20|
|3|大阪|20|
|4|長野|15|
|5|青森|10|
のように出力するSQL

SELECT COUNT(b.point) rank, a.ken, a.point
FROM table a INNER JOIN table b ON a.point <= b.point
GROUP BY a.ken, a.point
ORDER BY rank

で、table a、table bの部分を

SELECT ken, SUM(point) FROM table
WHERE (可変な条件) GROUP BY ken

のようにpointを集計する副問い合わせにしたいのですが、
同じSQLを2回書かなくていい方法はありますか?

DBはMySQLです。
651NAME IS NULL:2008/08/10(日) 15:17:45 ID:???
その順位、2位じゃなくて3位なの?
652NAME IS NULL:2008/08/10(日) 18:15:50 ID:???
>>650
SQL99のWITH句が実装されたら1回で済むんだろうけどな。
653650:2008/08/10(日) 23:42:16 ID:???
今のところは2回書くしかないということでしょうか?
654NAME IS NULL:2008/08/11(月) 00:52:40 ID:???
まずその3位があってるのか教えてくれよ
それによって式もちょとだけ変わってくるんだからさあ
655NAME IS NULL:2008/08/11(月) 01:22:22 ID:???
そのSQLの解このスレ内でみたことあるぞ
656650:2008/08/11(月) 01:58:38 ID:???
本当は2位で得られるとよいですがSQLのサンプルが>>650のものしか見つからなかったので・・・・
本質はtable aとtable bに同じ入る副問い合わせを2回書きたくないというところです
657652:2008/08/11(月) 02:12:03 ID:???
基本的には>>650が書いたような自己結合か、
もしくは相関サブクエリになるだろうから、
無理なんじゃね。
658NAME IS NULL:2008/08/11(月) 19:15:49 ID:???
繰り返しと変数を理解していないため、すごい初歩的な質問でスミマセン。

空のテーブル (テーブル名:ScheduleData) の "年" , "月" , "日" 列に
それぞれ以下のデータを挿入したいと考えております。

年:2008
月:1
日:1〜31

"日" の列に1〜31の変数を繰り返しで入力したいのですが、どのような構文になるでしょうか?
ググったりして自分なりに理解してみて、以下のコードを入力したのですが、うまくいきません。
ご指南いただけましたら幸いです。
--------------------------------
DECLARE
vYear int;
vMonth int;
vDay int;

begin

for p in 1..31
loop

vYear:= 2008;
vMonth:= 1;
vDay:= p;

insert into ScheduleData (年, 月, 日) values (vYear, vMonth, vDay);

end loop;

end;
659NAME IS NULL:2008/08/12(火) 10:24:30 ID:???
1〜100までの連続した整数を取得する
SELECT文ってどうやって書くの?
660NAME IS NULL:2008/08/12(火) 13:06:03 ID:8C57ixcp
id | key | date
----+-----+------------
1 | 1 | 2008-07-01
2 | 1 | 2008-08-01
3 | 1 | 2007-12-01
4 | 2 | 2003-02-01
5 | 2 | 2007-01-01
6 | 1 | 2008-08-02

上記のようなデータがある場合
一番古いdateのidをkey毎に出すにはどうすれば良いのでしょうか?
661NAME IS NULL:2008/08/12(火) 13:28:15 ID:???
>>660
GROUP BY
662NAME IS NULL:2008/08/12(火) 13:46:08 ID:???
663NAME IS NULL:2008/08/13(水) 23:52:20 ID:Eh6nC21k
テーブルの内容をソートして表示したい

●パターン1(分類+日付)
ORDER BY BUNRUI, DATEで期待した表示できるので問題なし。

BUNRUI | DATE
---------------
A | 7/20
A | 7/21
A | 7/22
B | 7/10
B | 7/15
B | 7/20
C | 7/16
C | 7/17

●パターン2(日付+分類)
下記のように分類をひとかたまりとした結果がほしいが、
ORDER BY DATE, BUNRUIではうまくいかない。
GROUP BY BUNRUI

BUNRUI | DATE
---------------
B | 7/10←一番小さい日付があるので分類Bの塊が先頭
B | 7/15
B | 7/20
C | 7/16←次に小さい日付があるので分類Cの塊が続く
C | 7/17
A | 7/20
A | 7/21
A | 7/22
664NAME IS NULL:2008/08/14(木) 00:04:45 ID:???
>>663
SELECT *,(SELECT min(date) FROM Table WHERE bunrui=T1.bunrui) AS sort
FROM Table AS T1 ORDER BY sort,date;
665NAME IS NULL:2008/08/14(木) 00:14:48 ID:???
あ、
SELECT * FROM Table AS T1
ORDER BY (SELECT min(date) FROM Table WHERE bunrui=T1.bunrui),date;
の方がよかったかな。
やってることは一緒なんだけど(^^)
666NAME IS NULL:2008/08/14(木) 14:33:29 ID:8JYNX0Qf
>>664,665 サンクス。
で、試してみた。
が、DBはMySQLの古いやつ、バージョン3.23。
スカラー副問い合わせ、インラインビューがサポートされていない。
がーん。どおりで文法エラーになるわけだ。

別な方法はないだろうか。。。
667NAME IS NULL:2008/08/14(木) 14:54:25 ID:???
>>666
こっちだとどぉ?
SELECT * FROM Table AS T0 JOIN
(SELECT bunrui,min(date) AS sort FROM Table GROUP BY bunrui) AS T1 USING (bunrui)
ORDER BY sort,date;

こっちもサブクエリを使うけど、Viewを定義しておいて置き換えるとか。
あと、USINGじゃなくてON(またはWHERE) T0.bunrui=T1.bunruiでも桶。
668NAME IS NULL:2008/08/14(木) 15:48:58 ID:8JYNX0Qf
バージョン3.23は、CREATE VIEWも使えないみたい。
ワークテーブル使えばできるかな。
669NAME IS NULL:2008/08/14(木) 15:58:25 ID:???
別な方法を探す努力を
バージョンアップする方に向けようぜ
670NAME IS NULL:2008/08/14(木) 16:02:56 ID:8JYNX0Qf
そのとおりだ。
バージョンアップか。
もしくは仕様変更だ。

がんばるよ。
671NAME IS NULL:2008/08/14(木) 17:10:01 ID:???
さすがにサブクエリが使えないと色々と面倒だから、4.1以上に上げる事を薦める
672NAME IS NULL:2008/08/14(木) 22:14:17 ID:???
>671
別人だが、うちの上司はバージョンアップする気は全く無いようだ……
673NAME IS NULL:2008/08/14(木) 23:12:40 ID:???
>>672
おまえの上司が馬鹿なのはデフォだから
674NAME IS NULL:2008/08/15(金) 23:01:07 ID:???
テーブル格納されているレコード数を高速に取得したいと思っています。
select MAX(count) fromだと、1つ1つレコードを数えていくためか、
レコード数が多い場合は速度的にとても耐えられません。
そこで、テーブルにレコードの番号を示すフィールドを用意して、
各レコードに1から番号を振ることにしました。
こうすれば、最後の行の番号=レコード数となるから、
最後の行だけを取得するsqlを発行すればよいはずです。
このようなsqlはどう書いたらよいでしょうか。
675どうせネタだろうけど:2008/08/15(金) 23:49:30 ID:???
> select MAX(count) fromだと、1つ1つレコードを数えていくためか、
> レコード数が多い場合は速度的にとても耐えられません。

具体的に DBMS の名前、バージョン、レコード件数とどれぐらいかかるのか書いてくれ。

> そこで、テーブルにレコードの番号を示すフィールドを用意して、

件数を保持する1フィールドで1レコードだけのテーブル用意して、挿入のたびにその
フィールドの件数を更新すればいいんじゃね。
シーケンスが使えるなら、その値を直接読めばいいし。
676NAME IS NULL:2008/08/16(土) 01:10:19 ID:???
>>675
>件数を保持する1フィールドで1レコードだけのテーブル用意して、挿入のたびにその
>フィールドの件数を更新すればいいんじゃね。
凄くいいアイデアですね!
件数をファイルに保存しようかなとまでは思いついたのですが、
別テーブルに件数だけ格納するという発想はなかったです。
早速使います!
677NAME IS NULL:2008/08/16(土) 03:46:05 ID:f7tcE3XO
SQL文に弱いので、教えて下さい

表A
学年 クラス 学級委員ID 保険委員ID 飼育委員ID
1   A   001  004  006
1   B   024  035  012
1   C   064  023  002
2   A   046  072  010
2   B   008  015  029
2   C   049  033  060  
・・・

表B
ID    氏名
001   田中
002   鈴木
003   松下
004   山崎
005   岡本
006   西村
・・・

この上の表を使って下記の様に繋げたいのです

学年 クラス 学級委員ID 氏名 保険委員ID 氏名 飼育委員ID 氏名
1   A   001  田中  004  山崎  006  西村
・・・

どのようなSQL文を書けば、上の表の様になるでしょうか
手掛かりを教えて頂きたく、宜しくお願いします
環境はWINDOWS XP/ORACLE10Gです
678NAME IS NULL:2008/08/16(土) 04:12:13 ID:???
select a.grade, a.class, a.hoge, c.name a.hage, d.name, a.foo, e.name
left join b as c on a.hoge=c.id
left join b as d on a.hage=d.id
left join b as e on a.foo=e.id;

かなぁ?みかくにんあてずっぽ
679NAME IS NULL:2008/08/16(土) 14:48:41 ID:???
column | name
------------
A | りんご
B | みかん
C | ぶどう

id | A | B | C
------------
001 | 100 | 200 | 300 |
002 | 110 | 220 | 330 |

上記のような2つのテーブルがあって、id=001を指定すると

りんご | 100
みかん | 200
ぶどう | 300

を得たいのですが、可能でしょうか?
680NAME IS NULL:2008/08/16(土) 16:53:57 ID:???
ネットで見つけたのですが、これは解けるのでしょうか?
gnarl、技術メモ
http://d.hatena.ne.jp/gnarl/20080810/1218307817
681NAME IS NULL:2008/08/16(土) 20:38:36 ID:???
>>680
MySQL 5.0.51aでやってみたが制限がきついなー。ちょっと微妙だが下を許してもらえれば・・・
・rownum出したくてユーザ変数を使った
・グルーピング指定してないカラムをselectしてもエラーが出ないMySQLの変な仕様を利用した
・あとどのカテゴリーにも属さないのは別に選択して無理やりUNIONした・・・

select
(select category_name from category where category_id=A.category_id) as category,
(select item_name from item where item_id=A.item_id) as item
from (select * from item_category order by category_id, rand()) as A
group by category_id, (@i:=@i+1) % 5
union all
select *
from (select 'NULL' as category, item_name as item from item
where not exists(select * from item_category where item_id=item.item_id)
order by rand() limit 5) AS B
order by 1,2;
682NAME IS NULL:2008/08/16(土) 21:19:27 ID:???
>>679
> 質問テンプレ
> ・DBとバージョン

大抵の DBMS で可能だろうけど、2個目のテーブルは

id | column | Value
-------------------
001 | A   | 100
001 | B   | 200
001 | C   | 300
002 | A   | 110
002 | B   | 220
002 | C   | 330

のようにしたほうが色々楽だと思う。
683679:2008/08/16(土) 22:47:59 ID:???
失礼しました><
SQLServer2005になります。
よろしくお願いします。
684677:2008/08/16(土) 23:03:21 ID:f7tcE3XO
>>678
どうもレスして下さってありがとうございます
ここでは試せないので、後日現場で試したいと思います
685NAME IS NULL:2008/08/16(土) 23:38:26 ID:???
>>680
「ランダムに5件ずつ」というのは「毎回不規則に5件ずつ」と言う意味だろうか?
んでもそれってDBの仕事じゃないよなぁ。で、「どの5件かは不問」って意味で取ると、

SELECT category_name AS category,item_name AS item
FROM item AS T1 LEFT JOIN item_category AS T2 USING(item_id) LEFT JOIN category AS T3 USING(category_id)
WHERE 5 > CASE
WHEN category_id IS NOT NULL THEN (SELECT count(*) FROM item_category WHERE category_id=T2.category_id AND item_id<T1.item_id)
ELSE (SELECT COUNT(*) FROM item AS T4 WHERE item_id<T1.item_id AND NOT EXISTS (SELECT * FROM item_category WHERE item_id= T4.item_id))
END ORDER BY 1,2;

でいけそう。「毎回不規則に5件ずつ」なら、乱数を生成してitem_idのかわりにそちらで比較して5件か、
あぁでもサブクエリがあるから、一時テーブルに落とさないとダメそうなんでワンクエリじゃ無理か。
686NAME IS NULL:2008/08/17(日) 15:38:33 ID:???
ランダムは後者の解釈で良いと思う。
指定しなければそうなるしね。
687NAME IS NULL:2008/08/18(月) 01:02:13 ID:???
質問です。

id, a, b, c, ....
のようなテーブルαがあり、

select * from α order by a;

の結果の中からidがxからyまでの"間"のデータをorder by aの順番とおりに取り出せないでしょうか?

例:

select * from α order by a;
   ↓
id a b c
----------------------
29 1900 xxx yyy
9 2000 xxx yyy
15 2100 xxx yyy
130 2200 xxx yyy
156 2300 xxx yyy
25 2400 xxx yyy
2 2500 xxx yyy

idがx=15, y=25のときこの結果の中の3番目から5番目を取り出したいです。

dbはsqliteです。よろしくお願いします。
688NAME IS NULL:2008/08/18(月) 01:47:13 ID:???
>>687
SQLiteで動くかどうか不明。

SELECT * FROM α WHERE a
BETWEEN (SELECT min(a) FROM α WHERE id in (x,y))
AND (SELECT max(a) FROM α WHERE id in (x,y)) ORDER BY a;
689NAME IS NULL:2008/08/18(月) 23:40:41 ID:???
>>687
この場合に動きません

id a b c
----------------------
15 1800 xxx yyy
29 1900 xxx yyy
9 2000 xxx yyy
15 2100 xxx yyy
130 2200 xxx yyy
156 2300 xxx yyy
25 2400 xxx yyy
2 2500 xxx yyy
690NAME IS NULL:2008/08/18(月) 23:55:14 ID:???
>>689
idっていいながら重複を許すのかよ。

その場合は2100〜2400を取り出したいの?

id a b c
----------------------
15 1800 xxx yyy
25 1900 xxx yyy
15 2000 xxx yyy
25 2100 xxx yyy
の場合は何を取り出したいの?
691NAME IS NULL:2008/08/18(月) 23:56:29 ID:???
ユニーク制約を使えば簡単なんだけど、ユニーク制約を使っちゃ駄目、っていうコーディング規約が急に出来てしまった、場合はどうしたらいいですか?会社を辞めるってのはナシで。

具体的には

Insert を発行して、値がユニークでなかったらエラーを返す、

というユニーク制約と同じことを、SQL できたら一文でやりたいんですが、出来ますか?
692NAME IS NULL:2008/08/19(火) 00:10:39 ID:???
insert前にトリガで判断する。
MSSQLならINSTEAD OFトリガ
693NAME IS NULL:2008/08/19(火) 00:13:16 ID:???
>>691
CHECK制約ならいいだろ?とか言っちゃうとかトリガー使うとか。

それも無理なら一般的なINSERT文じゃあ無理だろうね。
てかユニーク制約使っちゃダメっていうただでさえ不条理な規約に
一文でやらなきゃダメっていうさらに不条理な制約を付け加えてどうする。
694NAME IS NULL:2008/08/19(火) 00:20:55 ID:???
あたらしい上司は、どうも SQL もその下のアプリ層もよく理解していないっぽい。コードに書かれてないことがどうもいやみたいです。自分も昔、他人の引き継ぎで、SQL が全部ストアドプロシージャに入ってて、発狂しそうになったことがあるから、文句は言いませんが。

>>692, 693

出て行くまえに、なんか SQL で嫌がらせをしたくて www 多分トリガもユニーク制約と同じ理由で却下だと思うので、ありがとう、でも今回は止めときます。素直に select 文でも書きます。ちなみに MySQL 5.0 でした。
695693:2008/08/19(火) 00:31:43 ID:???
>>694
と、思ったけどCASE式とか使って
重複してたら型違いとかオーバーフローとかの値をINSERTするようにすれば
いけるような気がしてきた。
696694:2008/08/19(火) 01:48:45 ID:???
>> 693

あ、なるほどね〜。多分今回は使わないけど、ちょっと考えてみるのも面白いかも。
697NAME IS NULL:2008/08/19(火) 21:10:18 ID:???
MySQL 5.1.20-betaを使っています

table1
-----
ID(auto_increment) | DATA1
-----

table2
-----
ID(unique) | DATA2
-----

table1へのINSERTと同時にtable2に前者で作成した行のtable1.IDを使いINSERTしたいのですが、どうすればよいでしょうか?

とりあえず試してみたクエリを書いておきます
INSERT INTO table1(`DATA1`) VALUES('aaa');
INSERT INTO table2(`ID` ,`DATA2`) VALUES(table1.ID, 'bbb');

よろしくお願いします
698NAME IS NULL:2008/08/19(火) 21:51:44 ID:???
T1
F1 F2
-------
01 aa
02 bb
03 cc

T2
F1
----
01
03

2つのテーブルT1とT2があります。
T1のフィールドF1に、T2のフィールドF1が存在するT1のレコードを削除するにはどうしたらよいでしょうか?

上の状態で、T1の01と03のレコードを削除したいのですが、、、、
699687:2008/08/19(火) 22:09:52 ID:???
>>688-690
すみません、返事遅くなりました。

idが重複することはありません。
ただ、a,b,cは重複する可能性があります。

そして、688さんのコードをテストしょうとしたときに気づいたですが、
自分の質問と実際の問題が微妙に違ってました。
実際は
select * from α where ... order by a;
の結果はすでにあるtemporary tableのβに入ってあり、
そのときユニークなidxとyが与えられたときに、
その結果テーブルβの中のxからyの間にあるレコードを順番通りに取得しないと
いけなかったです。
β作る際、後で使うselect用fieldの追加は自由です。
なにかスマートな方法ありませんか?
ちなみにβを作るためのwhereとorderbyはかなり複雑です。
700NAME IS NULL:2008/08/19(火) 22:10:04 ID:???
>>697
ストアドを使って、あとは DB で用意されてる方法を使う。
もしくは、Timestamp みたいな列を用意しておいて、Max で取るか。

>>698

Where F1 in (Select F1 From T2)
701NAME IS NULL:2008/08/19(火) 22:41:22 ID:???
>>699
ROW_NUMBERか相関サブクエリでレコードに連番振ってしまえば大分簡単になるんじゃない。
あとはその連番の順序を頼りに範囲指定すればいいから。
702697:2008/08/20(水) 01:40:51 ID:???
>>700
ストアドとやらを使ってみます
ありがとうございました
703NAME IS NULL:2008/08/20(水) 13:33:25 ID:???
テーブルが空であるかを調べるには、select文の結果が0行であることを
確かめるしかないでしょうか。
704NAME IS NULL:2008/08/20(水) 13:55:57 ID:???
COUNTじゃだめかい
705NAME IS NULL:2008/08/20(水) 14:30:42 ID:???
>>704
countでokでした。
ありがとうございます。
706NAME IS NULL:2008/08/20(水) 22:07:04 ID:???
>>697
insert into table2
select max(ID)
, 'DATA2'
from table1

>>698
delete T1
where exists(
select *
from T2
where T2.F1=T1.F1
)
707NAME IS NULL:2008/08/21(木) 10:11:51 ID:MIDV4hwk
SQL injection 被害が色々と出ているようですが、www 経由で自分のサイトの injection 脆弱性を
攻撃して発見してくれるようなツールはあるのでしょうか。
単なる攻撃ツールとの見分けのために http://localhost:8080/ しかターゲットにできない、とかでもいいです。
708NAME IS NULL:2008/08/21(木) 17:37:58 ID:???
>>699
βを作るときのorder byがややこしいならβに連番を振っておく
そうではないなら、>>688のようなやり方をβに対して行い、order byを自分でつける
709NAME IS NULL:2008/08/21(木) 21:10:08 ID:???
>>701,708
ありがとうございます。
いろいろ調べてみましたが、sqliteはROW_NUMBER使えないようなので…、
ROW_NUMBERなしで連番はきびしいでしょうか?
710NAME IS NULL:2008/08/21(木) 21:48:59 ID:???
select rowid from β;
で簡単にできました!

レスして頂いた方、ありがとうございました!
711NAME IS NULL:2008/08/21(木) 22:18:59 ID:???
>>707
"sql injection スキャンツール" とか "セキュリティ スキャンツール" とかで
ググレば、フリーから商用までいやというほどある。
712NAME IS NULL:2008/08/23(土) 22:24:07 ID:???
WindowsでMySQLを使っています。
下記のように合計金額の値をもとめるようにしました。

update `受注` set 合計金額=単価*数量;

この合計金額をもとめる式をもう一度確認したいのですが、どのよなクエリーをおくれば
いいのでしょうか?

以下で見ても、式の情報が見れません。

show full columns from `受注`;
713NAME IS NULL:2008/08/23(土) 22:28:51 ID:???
>>712
全行更新されてるぞw
714NAME IS NULL:2008/08/23(土) 22:45:54 ID:???
>>713
あっ、そっか。
値を書き込むだけで、他の値(例えば数量)が変わったとき自動的に計算してくれるわけじゃないんですね。
715NAME IS NULL:2008/08/23(土) 23:23:45 ID:???
マスターテーブルとワークテーブルを使って、
マスターはINSERTのみ、欲しい計算をワークテーブルにINSERTとかUPDATEしたらどうでしょう。
716NAME IS NULL:2008/08/23(土) 23:25:24 ID:???
Excel じゃないんだから、自働再計算なんてオサレな機能はないよ。

合計金額フィールドは持たずに、

select 単価 * 数量 as 合計金額 from 受注

として、読み出す度に計算するようにする (もしくはそう言うビュー
を定義する) のも1つの手。
717NAME IS NULL:2008/08/23(土) 23:32:44 ID:???
>>714
そゆのはトリガでやること。
mysqlなら5.0からできる。

数量、単価がupdateされたときに実行する

とかね
718NAME IS NULL:2008/08/23(土) 23:34:03 ID:???
まあ普通なら単価、数量をupdateする時に一緒にupdateするんだがな
719NAME IS NULL:2008/08/24(日) 07:42:58 ID:???
>>712
式で定義したけりゃViewを使え
720NAME IS NULL:2008/08/24(日) 10:11:00 ID:???
まあデータ入力時に書き換えるならトリガだけど、
エクセルのイメージなら表示するときに計算してるからViewだなあ。
721NAME IS NULL:2008/08/24(日) 10:31:27 ID:???
>>715-720
どもです。
SQLの勉強、今日で2日目です。^^;

トリガとViewを調べて使ってみます。
722NAME IS NULL:2008/08/25(月) 05:07:19 ID:???
次の4つからなる関係データベースがあります、[〜]は各表の主キーです

科目([科目番号]、科目名、単位数)
学生([学籍番号]、氏名、専攻、住所)
履修([科目番号]、[学籍番号]、成績)
実習課題([科目番号]、[課題番号]、課題名)

このデータベースに対して以下の検索を行なうSQL質問文を教えてください
(select-from-where形式,group by,having,union,except,集約関数 等を使う)

(a)単位数が2以上で実習課題のある科目について科目名と課題名の一覧を求める
(b)科目ごとの科目番号・受講者数・成績平均点の一覧を求める
(c)実習課題のある科目の科目番号の一覧を求める
(d)実習課題のない科目の科目名と単位数の一覧を求める

DBの勉強始めたばかりなもので…宜しくお願いします
((c)は『SELECT 科目番号 FROM 実習課題』だけでいいんですかね…?)
723NAME IS NULL:2008/08/25(月) 07:45:29 ID:???
>>722
なんかの課題かな?
回答丸写ししようなんて甘えたこと考えてないで
少しは自分で考えたものを提示して問題点を指摘してもらうようにした方がいいよ
724NAME IS NULL:2008/08/25(月) 08:00:30 ID:???
ここで貼られた質問と回答を丸写しして課題に出す教師が居たりして
725NAME IS NULL:2008/08/25(月) 19:23:55 ID:???
>>722
「少しは自分で考えたものを提示して」あるやつ(c)だけコメントすると、
 SELECT DISTINCT 科目番号 FROM 実習課題
じゃね?
726NAME IS NULL:2008/08/25(月) 23:50:36 ID:bjNHaZZc
oracleです。

colA | colB | value
---------------------
01   001  100
02   001  200
03   001  300
02   002  250
03   002  350



colA | colB | value
---------------------
01   001  600
02   001  200
03   001  300
02   002  550
03   002  350

colBで集約したvalueの値をcolAが一番小さいレコードのvalueに格納したい場合どうすればいいでしょうか?
727NAME IS NULL:2008/08/25(月) 23:58:02 ID:???
>>726
実行するごとに値が変わっちゃうじゃん・・・
728NAME IS NULL:2008/08/26(火) 00:00:18 ID:???
文字列のソートの時、空白を最後にしたい。

普通にソートすると下記のようになる。

moji
--------



1
1
2
3
4
4

これを下記のようにしたい。

moji
---------
1
1
2
3
4
4




MySQL3.23という古いバージョンなのだけど。
729NAME IS NULL:2008/08/26(火) 00:02:13 ID:???
>>728
最後になるであろう文字列と置き換えてソート。
730NAME IS NULL:2008/08/26(火) 00:03:28 ID:???
>>726
02,002は600になるんじゃ?
俺も>>727と同じことを気にしつつ。
UPDATE Table AS T2 SET value = (SELECT sum(value) FROM Table WHERE colB=T2.colB) WHERE colA = (SELECT min(colA) FROM Table WHERE colB=T2.colB);
731NAME IS NULL:2008/08/26(火) 00:05:26 ID:oLDNT+3c
>>727
説明不足でした。
格納する作業は一度だけ実行します。
その後一番小さいレコード以外はdeleteします。
最終的にはこうですね。

colA | colB | value
---------------------
01   001  600
02   002  550
732NAME IS NULL:2008/08/26(火) 00:08:15 ID:oLDNT+3c
>>730
>02,002は600になるんじゃ?
確かにそうです。申し訳ありませんでした。

ありがとうございます。
参考にいたします。
733NAME IS NULL:2008/08/26(火) 00:52:58 ID:???
>>728
MySQLの3はできるかわからんけど、
SELECT * FROM table ORDER BY CASE WHEN moji = ' ' THEN 1 ELSE 0 END , moji;
とか
734NAME IS NULL:2008/08/26(火) 01:42:45 ID:???
>>731
処理前と処理後でレコードの意味が変わるのか。
なんで同じテーブルでやるんだろう?そういうのは別テーブルにすれ。
735NAME IS NULL:2008/08/26(火) 10:15:00 ID:???
>>734
コンバート作業なんじゃね?
736NAME IS NULL:2008/08/26(火) 10:20:58 ID:???
コンバート作業なら、なおさら別テーブルに作るんじゃね?
結果を確認してから元テーブルに戻すと思うが
737NAME IS NULL:2008/08/26(火) 11:58:08 ID:???
>>728 です。
SELECT * FROM table ORDER BY ISNULL(moji,99), moji;
で、ある程度できた。もう少し詰めてみる。
ありがとう!!
738NAME IS NULL:2008/08/26(火) 12:26:55 ID:O2bOeip3
最近、Oracleを勉強しはじめたのですが、予約語が多くて
テーブル名やカラム名等を付けるのに苦労してます。

みなさんの、テーブル名やカラム名等の命名規則等どうなってますか?
739NAME IS NULL:2008/08/26(火) 12:36:38 ID:???
>>737
空白ってNULLなのか?
だったら、ORDER BY moji IS NOT NULL, moji でいいじゃん
740NAME IS NULL:2008/08/26(火) 12:37:34 ID:???
ってもともとNULLは後にくるから別の話か
741NAME IS NULL:2008/08/26(火) 13:49:13 ID:7h91SK9L
質問です。
まず、以下のようなテーブルがあるとします。(実際には正規化してるものとします)

   ユーザ名  性別  出身   誕生日
 -----------------------------------
   花子     男   笹塚   10/10
   太郎     女   メキシコ 04/01

これを以下のように置き換えたとします。

   ユーザ名  キー   値
 -----------------------------------
   太郎     性別   女
   太郎     出身   メキシコ
   太郎     誕生日  04/01
   花子     性別   男
   花子     出身   笹塚
   花子     誕生日  10/10

このような使い方は一般的なのでしょうか?
だとしたら、どのような場合に使われるのでしょうか?
742NAME IS NULL:2008/08/26(火) 13:58:52 ID:???
HTMLテーブルに表示するときに
そういう形で出力したことはある。
743NAME IS NULL:2008/08/26(火) 14:18:36 ID:???
xml で出すの?
744741:2008/08/26(火) 15:26:40 ID:???
聞いてみたところ、後からフィールド(2つめのテーブルで言うところの「キー」)を追加するのが楽、と言われました。
そういうもんなのかなあ……。
745NAME IS NULL:2008/08/26(火) 17:47:03 ID:???
>>743
ASP.NETでSELECT結果を直接Tableにバインドしたから
内部的にどう処理されているかは知らない。

>>744
データベースの運用・設計的には適切ではないね。
度重なる仕様変更の末に身内で編み出された、苦肉の策という感じ。
ユーザー名ごとでのキーの数と(列キーの)値が保証されないのを
どう説明するんだろうか。
746NAME IS NULL:2008/08/26(火) 18:58:37 ID:???
>745

>苦肉の策
ですよねぇ…。
747NAME IS NULL:2008/08/26(火) 19:25:02 ID:???
748NAME IS NULL:2008/08/26(火) 22:16:30 ID:???
SQL(Microsoft SQL Server)で

AとBのテーブルがあり
Bのbという列にある数値に1プラスした数をaにINSERTしたいのですが
どうすればいいのですか?
749NAME IS NULL:2008/08/26(火) 22:19:13 ID:???
>>748
Select して 1 プラスすればいい。
750NAME IS NULL:2008/08/26(火) 22:50:13 ID:???
>>741
普通に無いわ。。
751NAME IS NULL:2008/08/26(火) 22:52:31 ID:???
>>748
insert into A (a) values (select b+1 from B)
752NAME IS NULL:2008/08/26(火) 23:28:37 ID:???
>>741
全ての項目を二番目のような形態で持つのはあまり見たことないが、
付加的な項目で項目数がユーザー毎に極端に違うとかキーそのもの
をエンドユーザーが定義できるようにする場合なんかだとあり得る。
753NAME IS NULL:2008/08/27(水) 04:03:24 ID:???
>752
あー……両方の条件を満たすなー……。
754NAME IS NULL:2008/08/27(水) 12:50:33 ID:1vSdirxU
SQLServer2005です。

TableA
date    | value
------------------------
2008/08/10  1
2008/08/11  2
2008/08/12  3
2008/08/13  4

TableB
code | start_date | end_date
--------------------------------
1   2008/08/09  2008/08/10
2   2008/08/11  2008/08/12
3   2008/08/12  2008/08/15



code | sum_value
------------------
1   1
2   5
3   7

TableAのデータが50万件、TableBのデータが3万件ほどあります。
TableBの範囲の期間の、TableAのvalueの合計が欲しいのですが、
SELECT b.code,SUM(case when a.date between b.start_date and b.end_date then a.value else 0 end) as sum_value
FROM TableB as b , TableA as a GROUP BY b.code
とすると、時間が掛かりすぎてしまいます。
うまい書き方を教えてください。
755NAME IS NULL:2008/08/27(水) 13:58:44 ID:???
そんなかかるかなー
インデックスは?
出力が多いから表示に時間かかってるだけとかじゃないだろうね?
756754:2008/08/27(水) 14:16:51 ID:1vSdirxU
実際はTableAに個人コードがあり、個人コードと日付が主キーとなっています。
CASE式の条件にもこの個人コードが入っています。
TableBには、別途、IDというオートナンバーの主キーがあるだけで、インデックスはありません。

757NAME IS NULL:2008/08/27(水) 14:31:33 ID:???
プラン見ないとなんともいえないけど、クロスJOINとCASEがいかにもという感じですね。
これでどうでしょう。
select code,
 coalesce((select sum(value) from TableA a where a.date between b.start_date and b.end_date),0) as sum_value
 from TableB b
758754:2008/08/27(水) 14:46:19 ID:???
>>757
どうもです。
>>754で1時間掛かって中断したものが、1秒ちょいで出ました。
759NAME IS NULL:2008/08/27(水) 14:51:06 ID:hFF1d+w8
すみません、初心者な質問させてください
SQLServer2005+VisualStudio2005(VB)を使ってプログラムを作っているのですが
例えば

テーブル いぬ | テーブル ねこ
名前       ..| 名前
体重(kg)     | 体重(kg)
芸         | おねむ度

という一部レコード名が重複している2つのテーブルがあり
そのどちらか1つ(もしくは両方)に”シロ”という”名前”かつ”体重”が”4”あるレコードが存在するか?

といったデータ検索を行いたいのですがどのようにすればよいのかご教授いただけませんでしょうか
760NAME IS NULL:2008/08/27(水) 15:14:17 ID:???
>>757
実際の差はでない可能性が高いが、coalesceは中に入れたほうが実行計画がシンプルだった。
select code,
 (select coalesce(sum(value),0) from TableA a where a.date between b.start_date and b.end_date) as sum_value
 from TableB b

>>759
UNION ALLを使うなら検索結果をUNIONする。
VBから使ってるのなら別々にクエリーをかければいいのでは。
でかテーブル設計を間違ってる可能性も高いな。狸が追加されたらテーブルを増やすのか?

使い慣れない言葉は使わないほうがいいな。ご教授は誤用らしいぞ。
761NAME IS NULL:2008/08/27(水) 15:54:53 ID:hFF1d+w8
>>760
ありがとうございます
自力で解決できました><
2つのテーブルの重複レコードをSELECTで一度抽出してからUNIONすることでいけました〜

>でかテーブル設計を間違ってる可能性も高いな。狸が追加されたらテーブルを増やすのか?
あ、いえ、、、実際はXXX基本台帳とかなのですが説明しにくかったので適当に書いたんです^^;スミマセン

>使い慣れない言葉は使わないほうがいいな。ご教授は誤用らしいぞ。
知りませんでした
762NAME IS NULL:2008/08/27(水) 17:23:30 ID:???
テーブルAとテーブルBがあり、両方に同じレコードが存在する場合、
それを取得したいと思っています。
intersectを利用すれば可能なようですが、当方がmysqlであるため、
これを利用できません。他に何かよい方法はあるでしょうか。
また、完全に一致するレコードではなく、
たとえば、1番目のカラムと3番目のカラムが同じレコードを取得する
方法も探しているのですが、まったく見当がつきません。
よろしくお願いたします。
763NAME IS NULL:2008/08/27(水) 17:41:54 ID:???
>>762
テーブルAとテーブルBは構造が違うので、
同じレコードは存在しないのが普通だけれども。
764NAME IS NULL:2008/08/27(水) 17:52:48 ID:???
>>763
実は、構造が同じなのです。
何といいますか、片方が本テーブルで、もう片方が一時テーブルみたいな。
妙な話ですが、よろしくお願いたします。
765NAME IS NULL:2008/08/27(水) 19:04:29 ID:???
>>762
そのまま普通にJOINさせたらあかんの?
SELECT テーブルA.* FROM テーブルA JOIN テーブルB ON テーブルA.1番目のカラム=テーブルB.1番目のカラム AND テーブルA.3番目のカラム=テーブルB.3番目のカラム;
完全一致となるとON以下に全カラム分並べなならんけどな。
766NAME IS NULL:2008/08/27(水) 20:14:24 ID:???
>>765
ありがとうございます。
それでいきます。
767NAME IS NULL:2008/08/27(水) 22:08:27 ID:???
>>751
列Cにcの値を列に入れるときは
insert into A (c,a,) values (C,select b+1 from B)
いいんだよな?
768NAME IS NULL:2008/08/28(木) 00:51:42 ID:???
>>760
sumしてるからcoalesceいらなくね?
nullこないよ?
769NAME IS NULL:2008/08/28(木) 00:53:59 ID:???
>>767
いいけどCは定数扱いか?
TableBからとるなら間違い。
770NAME IS NULL:2008/08/28(木) 01:33:25 ID:???
>>751 >insert into A (a) values (select b+1 from B)
>>767 >insert into A (c,a,) values (C,select b+1 from B)
MSSQLってそんなSQL動くのかや?
少なくともPostgreSQLなら以下のようにする。

テーブルBの全ての行分をテーブルAに入れたいのなら
INSERT INTO A(a) SELECT b+1 FROM B;

ついでにA.cに定数を入れるのなら
INSERT INTO A(a,c) SELECT b+1,定数 FROM B;

テーブルAが新規なら、SELECT INTOかな。
771NAME IS NULL:2008/08/28(木) 02:22:25 ID:???
>>768
DBMSのバージョンやオプションによって変わるかもしれないが、
SUMは非NULLの値の合計だから全部NULLならNULLになるのが本来の動作。
772NAME IS NULL:2008/08/28(木) 20:07:49 ID:???
>>771
勉強になった。
ありがとう。
773NAME IS NULL:2008/08/28(木) 22:20:55 ID:xlOS+FEs
SQL Server 2005 Developer Editionを使用しています。
社内サーバー(Windows2003server)に、複数ユーザーの環境(DB)が
同居しており、その為インスタンスを増やしております。
サーバー内のDB(名前付インスタンス:SQLEXPRESS)に自分のPCから
ManagementStudioでアクセスすると、「リモート接続が許可されていない」
というエラーになります。
ただし、既定のインスタンスのDBへは特に問題なくアクセスできます。
設定内容は以下の通りです。どなたか対処方法を教えてください。
・サーバー名:IP→接続可/IP\SQLEXPRESS→接続不可
・SQLBrowser→サービス開始
・ネットワーク構成:TCP/IP→有効化済
・すべてのインスタンスにおいて「ローカル接続およびリモート接続」を
 選択しており、「TCP/IPおよび名前付パイプを使用する」も選択しています
774NAME IS NULL:2008/08/28(木) 22:36:16 ID:???
>>773
スレ違い
775NAME IS NULL:2008/08/28(木) 23:26:39 ID:???
なんでDE使ってんのにSEEをリモート?
776NAME IS NULL:2008/08/28(木) 23:28:38 ID:???
ごめ SEEじゃない SSE
777773:2008/08/28(木) 23:31:29 ID:xlOS+FEs
スレ違い???ここはSQLの質疑応答スレですよね???
778NAME IS NULL:2008/08/28(木) 23:33:49 ID:???
>>753
ユーザごとに極端に項目数が違う、というところも満たすと言っている?
779NAME IS NULL:2008/08/28(木) 23:39:47 ID:???
>>777
SQL のスレであって、SQL Server のスレではないんだよ。
780NAME IS NULL:2008/08/28(木) 23:42:49 ID:???
>>777
SQLServerのことをSQLと略す人なのか
SQLとDBMSの区別がつかない人なのか
781773:2008/08/28(木) 23:50:32 ID:xlOS+FEs
失礼しました。
普段、うちの社内ではSQLServerのことをSQLと言っているので、SQLServerを
含めた全般の質疑応答スレだと思ってました。
782NAME IS NULL:2008/08/28(木) 23:56:00 ID:???
>>781
その悪しき慣習を身につけないように頑張ってね。
かたくなにSQLサーバ、というようにしましょう。
MSSQLよりは言いやすいでしょ。
783NAME IS NULL:2008/08/29(金) 00:06:28 ID:???
「SQL Server」で商標登録できる時点でおかしい。
784NAME IS NULL:2008/08/29(金) 00:37:38 ID:???
>773
スレ違いというよりは、専門スレで聞いた方がいいんじゃね?くらいかと
785NAME IS NULL:2008/08/30(土) 00:20:22 ID:???
非常に基本的な質問で申し訳ありませんが、お願いします。
環境はMacOSX10.5上に自分でインストールしたMySQL5です。
サーバもクライアントも同一マシン上で動いています。
ちなみにサーバ起動時のコマンドは、
sudo /opt/local/bin/mysqld_safe5 --user=root &
というものを使っています。

grant all on *.* to bbsuser IDENTIFIED BY 'bbs1234';
というコマンドで、bbsuserという名前でbbs1234というパスワードの
ユーザを作りました。
そして、ターミナルから
mysql -u bbsuser -p
というコマンドを打ち込んでmysqlに接続しようとしたのですが、
Access denied for user 'bbsuser'@'localhost' (using password: YES)
というエラーが出てログインできません。
http://dev.mysql.com/doc/refman/5.1/ja/access-denied.html
のページも読んで、
mysql -u bbsuser
ならサーバに接続できることが分かったのですが、パスワードオプションを
つけるととたんにダメになってしまいます。
いったいなぜなのでしょうか?
786NAME IS NULL:2008/08/30(土) 01:35:22 ID:???
本当にユーザー作ったの?
grantって権限を委譲するコマンドだけど。
787NAME IS NULL:2008/08/30(土) 02:16:53 ID:???
存在しないユーザー(インスタンス)にGRANTをしたことがない事を思い出した。
788785:2008/08/30(土) 08:59:45 ID:???
>>786
ユーザ自体はできてると思います。
mysql -u root mysql
でmysqlデータベースに接続し、そこで
select * from user
を実行してみると、Hostは%、Userはbbsuser、Passwordには
bbs1234のハッシュ値と思われる文字列が入った行が表示されます。
789NAME IS NULL:2008/08/30(土) 10:25:57 ID:???
どっから来たのか知らんが巣に帰れよ
790NAME IS NULL:2008/08/30(土) 10:26:33 ID:???
mysql すれで聞くべき質問だな。
791785:2008/08/30(土) 11:38:15 ID:???
>>790
失礼しました。
mysqlスレに移動したいと思います。
792NAME IS NULL:2008/08/30(土) 22:56:35 ID:???
やけに素直でわろた
793NAME IS NULL:2008/09/01(月) 16:22:08 ID:???
(ACCESS,VB6)
select T3.相手先コード,T3.相手先名,T3.商品コード,T3.商品名,T3.売価,T3.メーカー名,T3.単価
,SUM(T3.金額) as 納価合計,SUM(T3.数量) as 数量,T3.仕入単価,(T3.仕入単価 * SUM(T3.数量)) as 仕入合計
from (select * from (select * from (select * from 伝票データ
right join SUB伝票データ on 伝票データ.伝票番号=SUB伝票データ.伝票番号) as T1
left join (select * from メーカーマスター in '\\Tochi_svr\tochi\tochi\tochi.mdb') as MakerMaster
on T1.メーカーコード=MakerMaster.メーカーコード) as T2
left join (select * from 商品マスタ in '\\Tochi_svr\DATA\T_Data\TochiMasta.mdb') as GoodsMaster
on T2.商品コード=GoodsMaster.商品コード) as T3
where year(伝票データ.発行日)=2008 and month(伝票データ.発行日)=07 and (伝票データ.伝区=11 or 伝票データ.伝区=21)
and 伝票データ.相手先コード>=1 and 伝票データ.相手先コード<=1
group by 伝票データ.相手先コード,伝票データ.相手先名,メーカーマスター.メーカー名,
SUB伝票データ.商品コード,SUB伝票データ.商品名,SUB伝票データ.売価,SUB伝票データ.単価,商品マスタ.仕入単価
order by 伝票データ.相手先コード,SUB伝票データ.商品コード

がT3.商品コードとT3.商品名をはずすとうまくいくのですが、入れると
エラー:指定されたフィールド 'T3.商品コード' がSQLステートメントのFROM句にある複数のテーブルを参照しました。
となってしまいます。T3の中に商品コードFieldが2つあるわけだから、ためしに七行目の*を
(商品マスタ.商品コード) as GoodCode,(商品マスタ.商品名) as GoodsName とフィールド名を変更して、
八行目を on T2.商品コード=GoodsMaster.GoodsCodeとすると
エラー:必要なパラメータが設定されていません となってしまいます。
原因を解決できる方ご教授願います。
794NAME IS NULL:2008/09/01(月) 18:10:09 ID:???
すごい○投げきちゃった・・・
795NAME IS NULL:2008/09/01(月) 18:45:20 ID:???
GoodCode と GoodsCode の typo じゃなかろうか
796NAME IS NULL:2008/09/01(月) 19:47:09 ID:???
○投げwwww
確かに言われてみれば丸投げですね。
要するに
select T3.FieldX from
(select * from T1 left join T2 on T1.FieldX=T2.FieldX) as T3
と書くとT3のなかに2つのFieldXという名前のフィールドがあるから
エラーだよって言うことだと思うんですけど。このエラーが解決できれば
このSQLもうまくいけちゃう気がするんですけどねぇ。
797NAME IS NULL:2008/09/01(月) 19:50:09 ID:???
AccessだったらSQL書いて即実行して確認出来るじゃん。
798795:2008/09/01(月) 20:16:05 ID:???
俺の指摘は無視ですかそうですか・・・(´・ω・`)
799NAME IS NULL:2008/09/01(月) 20:56:03 ID:???
mona
giko
mona
mona
giko
yaruo
yaruo
yaruo
yaruo
buun
yaruo
mona
mona
のようなデータを
mona 5
giko 2
yaruo 5
buun 1
のようにカウントして
1 yaruo 5
1 mona 5
3 giko 2
3 buun 1
のように順位を出すSQLを教えてください
800799:2008/09/01(月) 20:58:19 ID:???
DBはMySQLの5です
801NAME IS NULL:2008/09/02(火) 01:07:54 ID:???
select 1 as rank, 'dummy' as name, 1 as count
from (select @i:=0, @j:=0) as dummy where 1<>1
union all
select case when @j<>count then @i:=@i+1 else @i end, name, @j:=count from
(select name, count(*) as count from hoge group by name order by 2 desc) as hoge
802NAME IS NULL:2008/09/02(火) 03:06:45 ID:???
>>799
SELECT
(SELECT count(*)+1 FROM (SELECT name,count(*) AS cnt FROM Table GROUP BY name) AS T2 WHERE cnt > T1.cnt) AS rank,
name , cnt
FROM
(SELECT name,count(*) AS cnt FROM table GROUP BY name) AS T1
ORDER BY rank;

実用的かどうかは別としてとりあえず上ので動くが、下のは何故ダメなんだろう。count()で集約しているのに。

SELECT
count((SELECT name FROM Table AS T2 GROUP BY name HAVING count(*) > T1.cnt)) AS rank,
name,cnt
FROM
(SELECT name,count(*) AS cnt FROM Table GROUP BY name) AS T1
ORDER BY rank;

ERROR 1242 (21000): Subquery returns more than 1 row (´・ω・`)
803799:2008/09/02(火) 10:36:53 ID:???
ありがとうございます
遅いですね・・・・
レコードが100万件ほどあるのですが、実用的な速度で出現数の順位が欲しいときはどーするのがいいんでしょう?
804NAME IS NULL:2008/09/02(火) 11:15:06 ID:???
>>803
それってリクエストに応じてリアルタイムに集計が必要なものなの?
そうでないなら、定期的にワークテーブルに落とすなり、htmlに
書き出すなりしてしまえばいいんでない?

リアルタイムに必要なのであれば、カウントしたものをワークテーブルに
放り込んで、それを対象に整形した方が速いと思う。
805NAME IS NULL:2008/09/02(火) 14:38:55 ID:???
というか、常時 update されるものなら、テーブル自体にカウンタのフィールドを入れる方がよくはないか ?
百万件のデータを毎回毎回全部ソートして、カウントして、その値でソートして、…とやってれば、そりゃ遅いでしょう。
806NAME IS NULL:2008/09/02(火) 22:08:14 ID:???
>>793
Accessよく分からないし問題とも関係ないんだけど
こういう変更って可能?
left join ( select * from メーカーマスター in '\\Tochi_svr\tochi\tochi\tochi.mdb') as MakerMaster
on T1.メーカーコード=MakerMaster.メーカーコード

left join メーカーマスター in '\\Tochi_svr\tochi\tochi\tochi.mdb' as MakerMaster
on T1.メーカーコード=MakerMaster.メーカーコード
807806:2008/09/02(火) 22:11:26 ID:???
>>793
本題の方だけど
>SUB伝票データ.商品コード,SUB伝票データ.商品名,
これでgroup byしてるんだから、それをselectするようにしてみたらどうなんでしょ。
T3じゃなく。
808NAME IS NULL:2008/09/02(火) 22:50:18 ID:???
viewを作成する際にテーブルをロックすると言われましたが
理由がよくわかりませんでした。
整合性の問題ですか?
809NAME IS NULL:2008/09/02(火) 23:04:55 ID:???
>>808
materialized viewならありえるかもしれんけど(Oracleならロックしないけど)
普通のviewなら考えられんな。
810NAME IS NULL:2008/09/02(火) 23:17:03 ID:4TrCJld+
お願いします。
バージョン:PostgreSQL8くらい ストアドは使えません。

プロジェクトがあり、1つのプロジェクトに部署ごとの詳細があります。
それぞれ別テーブルで、JOINして下記のように取得してきています。

(詳細ID=プロジェクト部署詳細テーブルのID、ユニーク
ID=プロジェクトテーブルのID、ユニーク)
詳細ID ID
1    1
2    1
3    1
4    2
5    3
6    4
7    4

このデータを例えばlimit 3で取得すると、以下のようになります。
詳細ID ID
1    1
2    1
3    1

これを、プロジェクトIDの種類でカウントしてlimitしたいですが、
どのようにすればよいでしょうか?
limit 3なら、下記のように取得したいです。

詳細ID ID
1    1
2    1
3    1
4    2
5    3

以上です。どうぞ宜しくお願いします。
811NAME IS NULL:2008/09/02(火) 23:37:22 ID:???
>>810
どちらでもお好きな方どーぞ。

SELECT * FROM Table RIGHT JOIN (SELECT DISTINCT id FROM Table ORDER BY id LIMIT 3) AS T2 USING(id) ORDER BY 詳細id;

SELECT * FROM Table WHERE id IN (SELECT DISTINCT id FROM Table ORDER BY id LIMIT 3) ORDER BY 詳細id;
812802:2008/09/02(火) 23:44:17 ID:???
>>803
相関サブクエリじゃなくて、不等号によるエキゾチック結合を用いるやり方でrankを求めたら速くなると思うよ。
今の俺にはちょっと思い浮かばないけどな。

ただ100万行をエキゾチック結合したら一時的に相当行数が増える。
100万*(100万/2)行になるのかな? それからGROUP BY で100万行に戻って出力されるワケだが。
オンメモリで処理できれば実用的な速度になる...かもしれん。
813810:2008/09/02(火) 23:52:55 ID:???
>>811
ありがとうございます。
今環境がないので明日試してみようと思います。
814NAME IS NULL:2008/09/03(水) 09:28:11 ID:???
>>812
こういうものって、本当に一行のSQLだけを使って解くのが得策なんだろうか。
グルーピングしてカウントして、それをランク付けするのなら、スクラッチの temp table に吐き出して、それを読めば済むことでしょ。
create 権限を付与するのがためらわれる場合とか?
815802:2008/09/03(水) 10:08:55 ID:???
>>814
1行のSQLで済まそうとしているのは、このスレの趣向に沿ってっていうか、
答える側の楽しみというかw

実際のところ全体像が見えないとワカランしな。
1行SQLで許せるような場合ならそれで、
temporary tableを作るくらいなら、俺ならホスト言語に逃げちゃうことも考える。
DB側でやるならトリガを使うかもしれんし、まぁいろいろ。
816NAME IS NULL:2008/09/04(木) 23:45:38 ID:???
tag_tbl(id, name)
entry_tag_tbl( id, tag_id, entry_id)
entry(id , content)
というテーブルがあって、tag_tblの複数のIdをもつEntryを検索したいんですが、
どういうSql文を書けばできるんでしょうか。
817NAME IS NULL:2008/09/05(金) 00:34:33 ID:???
東京、名古屋、大阪、福岡
-----------------------
100、200、150、300

のようなデータがあって、表示する場合に列名も一緒に表示したいんですが可能?
環境はSQLServer2000です。

818NAME IS NULL:2008/09/05(金) 04:25:08 ID:???
>>817
テーブル構造が糞。
819NAME IS NULL:2008/09/05(金) 11:47:08 ID:???
>>816
tag_tblのidはentry?tag_idのidと同一なの?
「tag_tblの複数のIdをもつEntryを検索したいんですが」
も意味がわからん。
複数はどれにかかるの?

>>817
可能
820NAME IS NULL:2008/09/05(金) 15:30:24 ID:???
>>816
エスパーモードで tag_tbl.id = entry_tag_tbl.tag_id, entry_tag_tbl.entry_id = entry.id と予測してみる。
「tag_tblの複数のIdをもつEntryを検索したいんですが」は、こういうことじゃないかとエスパーしてみる。
select E.id from entry as E inner join entry_tag_tbl as ET on (ET.entry_id = E.id) group by E.id having (count(ET.tag_id) > 1);
821817:2008/09/05(金) 15:54:48 ID:???
>>819
表示するヒントお願いします!!
822816:2008/09/05(金) 16:04:12 ID:???
すいません。説明不足な上に言葉足らずでした。

ブログの記事に複数のタグがぶら下がってる中で、いくつかのタグ(例えばCPU/メモリ)で検索をかける場合に
どういう風なSQLを書けばいいのかわからんかったんです。

>>820
すいません、「複数のIDを持つ」じゃなくて、「複数のタグで」検索をする場合でした。
ORではなくANDでデータを取り出したいんですが、方法がわかりません。
823816:2008/09/05(金) 18:59:58 ID:???
なんとかできました。
こんなんでいいんでしょうか。

tag_tbl(id, name)
entry_tag_tbl( id, tag_id, entry_id)
entry(id , content)

SELECT SQL_CALC_FOUND_ROWS entry. * , entry_tag_tbl. *
FROM entry_tag_tbl
LEFT JOIN entry ON ( entry_tag_tbl.entry_id = entry.id )
AND entry.id
IN (

SELECT entry_id
FROM entry_tag_tbl
WHERE tag_id =25
)
AND entry.id
IN (

SELECT entry_id
FROM entry_tag_tbl
WHERE tag_id =35
)
GROUP BY entry_id
LIMIT 0 , 30
824NAME IS NULL:2008/09/05(金) 19:02:29 ID:???
間違いました。

SELECT SQL_CALC_FOUND_ROWS xoops_weblog. * , xoops_t_entry_icon. *
FROM xoops_t_entry_icon
LEFT JOIN xoops_weblog ON ( xoops_t_entry_icon.entry_id = xoops_weblog.blog_id )
WHERE xoops_weblog.blog_id
IN (

SELECT entry_id
FROM xoops_t_entry_icon
WHERE icon_id =25
)
AND xoops_weblog.blog_id
IN (

SELECT entry_id
FROM xoops_t_entry_icon
WHERE icon_id =35
)
GROUP BY entry_id
LIMIT 0 , 30
825NAME IS NULL:2008/09/05(金) 19:22:51 ID:6WkKOtXp
400行程度の PL/SQL を組んでいますが、
設計書にどのように記述したらいいのか、よくわかりません。

PL/SQL の設計書って、決まったフォーマットや書き方があるのでしょうか?

「こんなの使ってる。」
「こういう風に書いている」
など具体的な例があれば教えていただきたいです。
826NAME IS NULL:2008/09/06(土) 12:39:26 ID:???
続きはwebで・・・

でリンク張る。
827NAME IS NULL:2008/09/06(土) 12:54:42 ID:???
>>825
作ったことある人に聞きまくった方がいいのでは。
本当はよくないけど、口伝でしか伝わらない仕様書というものが多数実在する。
828NAME IS NULL:2008/09/06(土) 17:30:45 ID:???
DB:ACCESS です。

下記の表はIDは商品分野の区別で、同IDの商品は資本金をキーに昇順で並べてあります。
ID 商品名  資本金
1  ○○   100
1  ××   200
1  △△   300
2  ■■   500
2  ▽▽   800
3  ☆☆   500
3  ★★   1500
3  ◆◆   2000  
3  ◇◇   3000

上記の表を以下のように表記するSQLの書き方を御教授ください。

  商品名1 商品名2 商品名3 商品名4
ID
1  ○○  ××    △△
2  ■■  ▽▽
3  ☆☆  ★★    ◆◆   ◇◇





829NAME IS NULL:2008/09/06(土) 22:38:02 ID:jFvVbFFH
質問です。
ZAIKOテーブルから、SCODZというフィールドが0001のレコードのみ検索したいとき
SELECT SCODZ FROM ZAIKMP00 where SCODZ = 0001
だと思いますが、もし0001が一件もなければ、どんな結果が返ってきますか?
830NAME IS NULL:2008/09/06(土) 22:40:40 ID:???
何も返ってこない、に決まってるじゃないか。
831NAME IS NULL:2008/09/06(土) 22:42:56 ID:???
>>828
Accessならクロス集計でぐぐればいくらでも
832NAME IS NULL:2008/09/06(土) 22:44:40 ID:???
>>829
何も返って来ないかnull
833NAME IS NULL:2008/09/06(土) 22:48:55 ID:???
>>832
null が返ってくるってことは、結果は 1 行あるんだよな。
そんな DB あるの?
834NAME IS NULL:2008/09/06(土) 22:49:55 ID:???
>>833
サブクエリなら、null じゃない?
835NAME IS NULL:2008/09/06(土) 22:55:08 ID:???
836829:2008/09/06(土) 23:05:55 ID:jFvVbFFH
ありがとうございます。
やっぱりなにも返ってこないですよね。

SCODZ = 0001 のレコードがあればなにもしない、なければBの処理をと考えていたのですが、
なにも返ってこないとなるとどうしたらいいのか・・。
837NAME IS NULL:2008/09/07(日) 06:25:58 ID:???
count(*)すればいいだろ
838NAME IS NULL:2008/09/07(日) 08:49:26 ID:???
本当に829のSQLかよw
それくらいなら試せよ
839NAME IS NULL:2008/09/07(日) 11:47:39 ID:???
ZAIKMP00 is nothing~
840NAME IS NULL:2008/09/07(日) 11:50:03 ID:???
>>836-837
て言うか、たいてい返ってきた件数を取得する手段があるだろ。

最低でも、最初の1件のデータを取得する時にレコートがないのが
わかるはずだと思うが。
841NAME IS NULL:2008/09/10(水) 16:25:17 ID:???
質問です。

create table tbl (
 id INTEGER PRIMARY KEY,
 kind INTEGER,
 hoge INTEGER);
// kind は列挙体で、DB には 0, 1, 2, 3 と登録される。4 以上だったり 0 未満だったりする値は登録されない。

というテーブルがあった時に、kind ごとの件数を表示したいのですが、

SELECT kind, count(id) from tbl group by kind;
だと、0 件の行が表示されません。
0 件の行も表示させる SQL はどう書けばよいのでしょうか?
842NAME IS NULL:2008/09/10(水) 16:40:36 ID:???
4件連続で今後も変わらない、とかなら書き様もあるかもしれないけど、
別テーブルで使用しているkindのテーブル作っておいてOUTER JOINがいいんじゃないかなあ。
843softbank219204123070.bbtec.net :2008/09/10(水) 23:06:42 ID:???
>>841
そのテーブルだけでは無理。

例えば、

id | kind | hoge
---+------+-----
0 |  1 | 123

とあったときに、kind = 2 とか kind = 100 のデータがそもそもないのか、
たまたま 0 件なのかは知りようがない。

>>842 が言うように全ての kind の値を含むマスターテーブルを持つのが一般的。
844NAME IS NULL:2008/09/11(木) 00:35:13 ID:???
ひとつのテーブルで
ID・ 日付 と列がある
1   10/01
1   10/02
続く
2   10/01
2   10/03   
続く
3   10/02
3   10/3
みたいなデータがあります。

この中から10/02にはデータがあって
10/03のデータがないというIDを抽出したいと思います・。

SELECT で 10/02の日付がある IDを抽出して
そのID のなかで10/03のないやつを抽出したいのですが

どのようなSQlを書けばよいでしょうか
845NAME IS NULL:2008/09/11(木) 01:06:40 ID:???
>>844
SELECT * FROM (SELECT DISTINCT id FROM Table) AS T1
WHERE
EXISTS (SELECT * FROM Table WHERE id=T1.id AND 日付='10/02')
AND
NOT EXISTS (SELECT * FROM Table WHERE id=T1.id AND 日付='10/03')
846NAME IS NULL:2008/09/14(日) 01:00:18 ID:???
MySQLで

.id | text |
--+----+
.1 | foo |
.2 | hoge |
.3 | foo |
.4 | foo |
こんな感じのidを主キーとしたテーブルがあるとします
textがfooから始まる行の中からidを指定してその前後一つずつを取り出すにはどうすればいいですか?
この場合だとidに3を指定した場合、1と4を取り出すと言うことです
847NAME IS NULL:2008/09/14(日) 03:22:14 ID:???
そのidがなかったら2件でいいの?
848NAME IS NULL:2008/09/14(日) 03:23:46 ID:???
つーか、あってもなくても2件か
LIKE 'foo%' の中でid未満で最大と、idより大きい中から最小もってくればいいのかな?
849NAME IS NULL:2008/09/14(日) 12:32:08 ID:???
>>848
2件でいいです。
指定したid自体がなければNULL返ってきてもいいです
サイトのPHPでこのデータを使うのですが指定したidが無いというのは
手動で打ち込まない限りないので。
850NAME IS NULL:2008/09/14(日) 13:04:40 ID:???
Name  T1   T2   T3   T4
AAAA  6:00  7:00  8:00  9:00
BBBB      6:50  7:50
CCCC          7:55
DDDD  5:55

このようなデータを

Name  T1   T2   T3   T4
DDDD  5:55
BBBB      6:50  7:50
CCCC          7:55
AAAA  6:00  7:00  8:00  9:00

このような順番で取り出すにはどのようにSQLを書けばいいでしょうか?
T1〜T4のどの項目に時間が入るかは不定です。
SQLでは無理ですかね?
851NAME IS NULL:2008/09/14(日) 13:10:10 ID:???
並べ方のルールが見てわかるようでわからない。
ちゃんと文章でまとめて。
852NAME IS NULL:2008/09/14(日) 13:34:00 ID:???
>>849
> 指定したid自体がなければNULL返ってきてもいいです

もともと指定した id (>>846 で言うところの 3) は、取り出せということにはなって
ないはずだが...。
それとも、取り出すべき id がない時 (id = 1 の時の前側の id とか) を言ってるのか?

方式は、>>848 でいいと思う。

>>850
T1〜T4 に入っている時間の中で最遅のものをキーにして、昇順に並べろってことかな?
853NAME IS NULL:2008/09/14(日) 14:02:20 ID:???
>>851
すみません。

元テーブルは、時刻表のデータが順不同で入っているような感じです。
それを時刻表のように並べたいのです。
T1からT4までについて、縦に見たときに時刻順になるように並べ替えたい
ということなんですが、おわかりいただけますでしょうか?

>>852
> T1〜T4 に入っている時間の中で最遅のものをキーにして、昇順に並べろってことかな?

実際のテーブルではT20くらいまでありまして、全部に時刻が入っているものも
一部だけに時刻が入っているものもあります。
最遅のものをキーにした場合、例えばレコードAのT4に8:00と入っていてレコードBの
T20に7:00と入っていた場合にレコードAの方が下に来てしまうので、あくまで列単位
で比較する必要があります。
854NAME IS NULL:2008/09/14(日) 14:10:21 ID:???
>>852
確かに指定したIDは取り出さなくていいです
しかしその基準となるIDがなければ意味を成さないので
855NAME IS NULL:2008/09/14(日) 14:19:44 ID:???
>>853 >T1からT4までについて、縦に見たときに時刻順になるように並べ替えたい

「追い越し」が起きたときは ? たとえば、

Name  T1   T2   T3   T4
AAAA  6:00 6:40  8:00  9:00
BBBB      6:50  7:50
CCCC          7:55
DDDD  5:55

だったら、どういう結果が望ましい結果なんでしょうか。

DABC (T2 に注目) ? それとも DBCA(T3 に注目) ?
856NAME IS NULL:2008/09/14(日) 14:29:59 ID:???
>>855
↓ですね。左側の項目優先です。後出しですみません。

Name  T1   T2   T3   T4
DDDD  5:55
AAAA  6:00 6:40  8:00  9:00
BBBB      6:50  7:50
CCCC          7:55
857856:2008/09/14(日) 14:32:48 ID:???
間違いました。
DCABの順です。

 Name  T1   T2   T3   T4
DDDD  5:55
CCCC          7:55
AAAA  6:00 6:40  8:00  9:00
BBBB      6:50  7:50

858NAME IS NULL:2008/09/14(日) 18:03:08 ID:???
分からないことが分からないです
何が分からないのか教えて下さい
859NAME IS NULL:2008/09/14(日) 18:13:21 ID:???
    1          2            3           4

.   ハ,,ハ                     ハ,,ハ            ハ,,ハ
   (゚ω゚ )        ハ,,ハ         (゚ω゚)、     :.. :. ≡=-(゚ω゚ )
    |  `i         (゚ω゚ )i        //l   l       iコ==ラ`'i9m
    | lヽi li,   →  | lヽl l l   →   l i,,l   l |   →     ./  /l/
    | l-'l |,l       | | // l        `"|iコ=''         /  /
.    'Fヲ|,H      E三l_l_A         | .i .|         /  /
    ,i_| .| |                   | || |         i' /l .l,
     -'‐'                      | || |_       l l .ヽ,ヽ,
                          ‐' ' `‐'       -'-'  -'-'
    脱ぐ       たたむ      コーヒーを     お断りします
                         つくる
860NAME IS NULL:2008/09/14(日) 18:13:48 ID:???
>>850
これでいいかな、まぁ試してみてくれ。
ただ、実用的かどうか疑問だし、時間カラムがさらに増えるようだとやってられないが、

SELECT * FROM Table AS TT ORDER BY

CASE WHEN TT.t1 IS NOT NULL THEN TT.t1
WHEN TT.t2 IS NOT NULL THEN COALESCE((SELECT min(t1) - INTERVAL'1 sec' FROM Table WHERE t2 > TT.t2),TT.t2)
WHEN TT.t3 IS NOT NULL THEN COALESCE((SELECT min(t1) - INTERVAL'1 sec' FROM Table WHERE t3 > TT.t3),TT.t3)
ELSE TT.t4 END,

CASE WHEN TT.t2 IS NOT NULL THEN TT.t2
WHEN TT.t1 IS NOT NULL THEN NULL
WHEN TT.t3 IS NOT NULL THEN COALESCE((SELECT min(t2) - INTERVAL'1 sec' FROM Table WHERE t3 > TT.t3),TT.t3)
ELSE TT.t4 END,

CASE WHEN TT.t3 IS NOT NULL THEN TT.t3
WHEN TT.t1 IS NOT NULL THEN NULL
WHEN TT.t2 IS NOT NULL THEN NULL
ELSE TT.t4 END,

TT.t4 ;
861NAME IS NULL:2008/09/14(日) 19:59:24 ID:???
>>858
おまえは、分からないことが分かっていないんだ
862NAME IS NULL:2008/09/15(月) 10:09:20 ID:aDFScTA0
質問です
データにタグを付けて管理したいんですが、タグで検索する様な場合、テーブルは以下の様な感じでいいのでしょうか?
SQLは完全な初心者です。

create table Item ( //データ
 Item_ID INTEGER,
 Name VARCHAR(64),
 PRIMARY KEY (Item_ID)
);

create table Tags ( //タグ
 Tag_ID INTEGER,
 Tag_Name VARCHAR(32),
 PRIMARY KEY (Tag_ID)
);

create table KeyTables ( //タグとデータの関連づけ
 Item INTEGER, /* Items.Item_ID */
 Tag INTEGER, /* Tags.Tag_ID */
 FOREIGN KEY (Item) REFERENCES Items(Item_ID) ON DELETE CASCADE,
 FOREIGN KEY (Tag) REFERENCES Tags(Tag_ID) ON DELETE CASCADE
);
863856:2008/09/15(月) 13:55:46 ID:???
>>860
お礼が遅くなり、すみません。
参考にさせていただき、あれこれ試行錯誤したのですが、実データでは
どうもうまくいかず(列数も不定で件数も多い)、今回はJavaでガリガリ
整形することにしました。

勉強になりました。どうもありがとうございます。
864NAME IS NULL:2008/09/16(火) 13:33:52 ID:???
oracle10gです

テーブルA
ID|面積比|面積
1 | |20
1 | |0
1 | |30
2 | |0

このようなテーブルがあって、面積比に値を入れたいのですが
以下のSQLを実行するとここではグループ関数は使用できませんエラーがでます

update テーブルA set 面積比=面積/sum(面積) where id=1

何か良い方法はないでしょうか?
865NAME IS NULL:2008/09/16(火) 14:13:30 ID:???
>>862
いいんでないの?
ItemテーブルはItemsの方がいいんでないの、とかカラム名もIDだけでいいんでないの、とか
思うけどそこは好みだしね
866NAME IS NULL:2008/09/16(火) 14:15:23 ID:???
>>864
面積比=面積/(select sum(面積) from テーブルA)
こんなかんじにしてもだめ?
867864:2008/09/16(火) 15:52:43 ID:???
>>866
上手くいきました
ありがとうございます

ところで蛇足と言いますか興味本位でお聞きしますが
sumが0だった場合はどうしてますか?
自分はdecodeでサブクエリを2回書くダサい力業でやりました
スマートな書き方があれば嬉しいです
868862:2008/09/16(火) 18:29:57 ID:???
>>865
ありがとうございます。
テーブル名やカラム名は質問用にいじってました。

さて‥‥次はDB接続コンポーネントとselect文だ‥‥
869866:2008/09/16(火) 22:20:24 ID:???
>>867
えーっと、そうならないようなデータでしかやらない、が一番近いかなあ。

そもそも今回の場合であれば、面積比をテーブルに入れなければいけないのかどうかを検討するかも。
面積変わったときにどうするの?とか。更新系が少ないのならトリガでもいいだろうけど。
抽出時に計算してもいいんじゃないか、とか、抽出後にアプリでやったらどう、とか。

データベースあまり得意ではないので、ついうっかりアプリで対応してしまうことが多いタイプです。
あまりよい回答では無いと思いますが、こんな感じです。
870NAME IS NULL:2008/09/16(火) 23:55:01 ID:???
こんばんは…。

仕事でCSE経由(?)でOracleを使用している者なのですが、
Blobデータをどうやって登録したらいいのかわかりません…。
どなたか教えてください!!m(_ _)m

取り急ぎ

■「AAAAAA」というテーブルの
■「BBBBBB」というカラム(現時点では「empty_blob()」が入ってる)に
■「.XLS」というファイル(c\Documents and Settingsに置いてる)をBLOBデータとして格納する

ための、SQL文

※もちろんぐぐりました。ぐぐったのですが、所詮ワタシのような
 基礎知識の無い者ではサッパリ応用がきかないため、どうにもうまくいかないのです。
 明日の午前中には仕上げないといけないので、わからない言葉を調べたり、
 じっくり勉強する時間もありません…

以上、よろしくお願いいたします。
871NAME IS NULL:2008/09/17(水) 00:13:03 ID:???
…なら先輩にでも訊けよ
872NAME IS NULL:2008/09/17(水) 00:18:56 ID:???
>>870
ttp://www.hi-ho.ne.jp/tsumiki/cse_11.html
を読んでみましょう。
873NAME IS NULL:2008/09/17(水) 00:33:11 ID:tMUtY5mD
テーブルのすべてのカラムを対象でかつすべてのデータに対して
'〇〇'という文字列を含まれているデータを抽出したいんですが、
なにかいいSQLありますか?
874NAME IS NULL:2008/09/17(水) 00:35:08 ID:???
>>872


うわああああああ!!ありがとうございます。

875NAME IS NULL:2008/09/17(水) 02:36:53 ID:???
カラム1 like '%○○%' or カラム2 like '%○○%' or …
カラム1 || カラム2 || … like '%○○%'
くらいしか思いつかないなあ
876NAME IS NULL:2008/09/17(水) 05:02:20 ID:???
or じゃなく and じゃね?
877NAME IS NULL:2008/09/17(水) 07:23:39 ID:tMUtY5mD
>>875
>>873です。
一度に検索する方法はなさそうなんですね。
CreateしたときのDDLがあるので、マクロでSQL分作ってやってみます。

>>876
私の質問へでしょうか?
or 検索です。
カラムのどこかにあれば抽出対象になります。
878NAME IS NULL:2008/09/17(水) 07:57:52 ID:???
CONCAT_WS(' ', からむ1, からむ2, ...) LIKE '%○○%'
メモリ食うと思うが
879NAME IS NULL:2008/09/18(木) 17:40:24 ID:???
列Aの情報を列Bにコピーするにはカーソル使わないと無理でしょうか?
SQLServer2005っす。
880NAME IS NULL:2008/09/18(木) 21:07:16 ID:???
>>879
update テーブル名 set 列B = 列A;
881NAME IS NULL:2008/09/19(金) 11:32:45 ID:???
>>879
助かりました。ありがとうございます。
882NAME IS NULL:2008/09/19(金) 13:27:26 ID:???
レコードを並びかえるのには、orderbyを使いますけど、
フィールドを並び替えるにはどうすればよいでしょうか。

K A B C D Z
-----------
1 5 7 2 3 0
2 6 4 8 5 0

上のようなテーブルの各レコードのAからDを並び変えて、
次のようにしたいのです。

K A B C D Z
-----------
1 2 3 5 7 0
2 4 5 6 8 0

よろしくお願いします。
883NAME IS NULL:2008/09/19(金) 13:40:41 ID:???
1.考え方が根本から間違ってることに気が付く。
2.クライアントプログラムで処理して書き戻す。
3.ストアドで何とかする。
4.特定のDBMSに依存の高い命令を探し出してくる。MSSQLのUNPIVOT/PIVOTなど。

1で踏みとどまれれば幸せになれます。
884NAME IS NULL:2008/09/19(金) 13:50:07 ID:???
1を選んで再考します。
885NAME IS NULL:2008/09/20(土) 19:51:49 ID:n7Rb1Bhb
COUNT関数で、複数のレコードが返って来るのは、何が悪いのでしょうか?
少なくとも、私の頭とSQLが悪いのは解るのですが。

どのような場合に、集計関数の結果が複数レコードを返すかを教えて下さい。
886NAME IS NULL:2008/09/20(土) 20:00:13 ID:???
GROUP BY使ったとき
887NAME IS NULL:2008/09/20(土) 22:07:48 ID:???
プログラム板から誘導されて来ました。

JAVAからoracleのselect文を発行する際、to_date()の第二引数(書式)を小文字で
書くのは間違いでしょうか?

(例)to_date(DATE型カラム, 'yyyy-m-dd hh24:mi:ss');

一応、日付は正しく取得されるのですが・・・

いろいろな本やHPでは、大文字で説明が載っています。
(もし、間違いならなぜ間違っているのか知っていれば教えて下さい。)
888NAME IS NULL:2008/09/20(土) 22:42:50 ID:???
>>887
SQLでは大文字小文字の区別はない。
ただし、引用符の中は区別する。
引用符の中を小文字で書いて大文字と同じ結果を返すのは
たまたまその関数がそういう仕様になっているだけ。

例えば以下の関数は違う結果を返す。
select to_char(sysdate, 'DAY') from dual;
select to_char(sysdate, 'Day') from dual;
select to_char(sysdate, 'day') from dual;
889NAME IS NULL:2008/09/21(日) 16:12:50 ID:k9DAfvjI
A列
100
200
300
のデータがあるとき
A,B
--
100 100
200 300
300 600
の2列の結果を出したいんですが、どうすればいいんでしょうか。
890NAME IS NULL:2008/09/21(日) 16:32:37 ID:???
B の生成規則がわからん。

ピンポイントでその結果欲しいなら

select A, case A when 100 then 100 when 200 then 300 when 300 then 600 end as B from ...

でいいと思うけど、まさかそう言うわけじゃないだろ。
891889:2008/09/21(日) 16:40:10 ID:???
>>890
すまそ、これです
100(0+100)
300(100+200)
600(300+300)

加算してく感じです
892NAME IS NULL:2008/09/21(日) 16:43:12 ID:???
>>891
右側は A 列の値として、左側はどっから持ってくるんだよ?
893NAME IS NULL:2008/09/21(日) 16:43:35 ID:???
エスパーすると、
BはA以下のAのSUMだと思われ。

100→100
200→100+200=300
300→100+200+300=600

まぁ、Oracleだと分析関数ですぐに答えが出る訳だが。
select A,SUM(A) over (order by A RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from TABLE;
894NAME IS NULL:2008/09/21(日) 16:45:48 ID:???
少しエスパってみると、
SELECT a,(SELECT sum(a) FROM Table WHERE a <= T1.a) AS b FROM Table AS T1;
895889:2008/09/21(日) 16:48:28 ID:???
>>893,892
ありがd
896NAME IS NULL:2008/09/21(日) 16:51:29 ID:???
規則性が見いだせないのによく皆さん分かりますね…
897NAME IS NULL:2008/09/21(日) 22:54:55 ID:???
↓のようなSQL書いてますが、TとSは同じ文なんですけどもっと簡略化できたりしますか?


SELECT * FROM
(
 SELECT id,kubun,COUNT(kubun) as '件数'
 FROM result INNER JOIN contents
 ON result.case_id = contents.case_id
 GROUP BY kubun,id) as T
INNER JOIN
(
 SELECT id,sum(cnt) as '合計'
 FROM (
  SELECT id,kubun,COUNT(kubun) as '件数'
  FROM result INNER JOIN contents
  ON result.case_id = contents.case_id
  GROUP BY kubun,id
 ) as S
 GROUP BY id
) as C
ON T.id = C._id
898NAME IS NULL:2008/09/21(日) 23:18:32 ID:???
cntってどこから出てくるんだ?
899NAME IS NULL:2008/09/21(日) 23:23:59 ID:???
WITH(共通表式)が使える処理系なら何も考えずに短くはなる
900897:2008/09/21(日) 23:37:24 ID:???
すみません。cnt='件数'です。

>>899
おお。こんな便利なキーワードが!!
これでいけそうです。ありがとうございます。
901NAME IS NULL:2008/09/22(月) 23:12:18 ID:???
oracleでlikeで
%ABCだとINDEX使わない。 
ABC%だと使う。
%ABC%も使わない。 
じゃあ、A%BだとINDEX使いますか?
902NAME IS NULL:2008/09/22(月) 23:39:34 ID:???
A%で使われるのと同程度には期待できるんじゃない?
903NAME IS NULL:2008/09/22(月) 23:44:25 ID:???
AでINDEX RANGE SCAN
904NAME IS NULL:2008/09/23(火) 03:30:24 ID:???
ふと思った。
_ABCもインデックス使われないのかな?
905NAME IS NULL:2008/09/23(火) 03:37:28 ID:???
前方一致のみなんじゃないの?
だったら >>904 も使われない。
906NAME IS NULL:2008/09/23(火) 17:19:44 ID:???
みなさんトリガーって使ってますか?
AP側でもトリガーでもできることならトリガー優先?
907NAME IS NULL:2008/09/23(火) 17:28:26 ID:???
>>906
AP優先。
トリガー利用のメリットがある場合には採用する。
908NAME IS NULL:2008/09/24(水) 02:04:43 ID:???
たとえAPで対処できても、複数のシステムから操作するとかあるとトリガにする。
909NAME IS NULL:2008/09/24(水) 10:02:37 ID:???
906です。
>>907-908
ありがと。トリガーのメリットがよく理解できていないので調べてきます。
910NAME IS NULL:2008/09/25(木) 01:17:28 ID:/83mRYQd
tbl1
colA | colB |
01  |  0 |
02  |  1 |
03  |  0 |

tbl2
colA | colC  |
01  | 1000 |
02  | 2000 |
03  | 3000 |

上記の2つのテーブルがあったとして、tbl1のcolBに1が入っていないレコードのcolAで
tbl2を検索し、該当するtbl2のcolCを抽出したい場合、どのようなSQLを組めばいいでしょうか。
下記のSQL文ですと、処理が重すぎて時間がかかりすぎてしまいます。

select X.colC from tbl2 X
where X.colA not in ( select Y.colA from tbl1 Y where Y.colB = 1)
911NAME IS NULL:2008/09/25(木) 01:25:49 ID:???
>>910
join か exists
好きな方使え。
インデクスを適正に設定してることが前提で。
912NAME IS NULL:2008/09/25(木) 01:39:23 ID:/83mRYQd
>>911
select X.colC from tbl2 X
where not exists ( select * from tbl1 Y where Y.colB = 1 and X.colA = Y.colA)

こういうのが思いついたのですが、うまくいきません。
他にどういう記述があるのでしょうか
913NAME IS NULL:2008/09/25(木) 03:14:53 ID:???
>>910
select colC from tbl2 where colA in (select colA from tbl1 where colB <> 1);
でなにがだめなの?
914NAME IS NULL:2008/09/25(木) 06:49:06 ID:???
>>913
>>910が遅いんだったら、>>913はさらに遅いんじゃないかな
915NAME IS NULL:2008/09/25(木) 07:19:44 ID:???
下のどっちかだろうな。
どっちが速いかはやってみないと分からん。

select colC
from tbl2
   inner join
   (select colA from tbl1 where colB <> 1)
   using (colA)
;

select colC
from tbl2
where exists (select *
       from tbl1
       where colB <> 1
       and tbl1.colA = tbl2.colA)
;
916NAME IS NULL:2008/09/25(木) 08:11:06 ID:???
題意からしてtbl1.colAはuniqueだろうから、これでいいだろ

select X.colC
from tbl1 Y, tbl2 X
where Y.colA = X.colA
and Y.colB <> 1
917NAME IS NULL:2008/09/25(木) 12:47:11 ID:???
自宅で仕事以外でのデータベースの使い道教えて下さい。MYSQL導入しました。
918NAME IS NULL:2008/09/25(木) 12:51:06 ID:???
スレ違い
いろいろ練習に使ってみ
そのうち何でもDBにしないと気がすまなくなるw
919NAME IS NULL:2008/09/25(木) 19:58:31 ID:???
仕事以外って、お前の仕事なんか知るかって感じだ
920NAME IS NULL:2008/09/25(木) 20:06:38 ID:???
>>917
釣り針が凄く太いです
921NAME IS NULL:2008/09/25(木) 23:49:15 ID:???
>>917
違法にダウンロードしたアニメの整理
922NAME IS NULL:2008/09/26(金) 00:50:55 ID:???
趣味で遊ぶならXMLDB
XPathとXQueryだけで1日がつぶれる
923NAME IS NULL:2008/09/26(金) 21:40:39 ID:???
>>910
こんなん考えてみました

select X.colC from tbl2 X
left join ( select colA from tbl1 where colB = 1) Y
on X.colA = Y.colA
where Y.colA is null
924NAME IS NULL:2008/09/28(日) 09:54:53 ID:???
すんません
どこで聞いたらいいのかわからなくて、ここで聞かせてください

ストアドを使ってパラメータをDBI・DBDで受け取りたいのですが
ストアド側が

create proc{ @hoge, int … @err_cd char(4) output, @err_cd2 char(4) output}
…処理
return 0

というような中身で
明示的にselect @err_cd1 , @err_cd2を返すような処理が含まれていなくてreturn 0がDBIに渡されています

outputのパラメータをDBIで受け取るにはどうしたらいいのか。
質問する場所がここでだめぽでしたら他に移ります。。。がどこに移ったらいいのかわからない状態のなので誘導おながいしまつ
925NAME IS NULL:2008/09/29(月) 14:57:03 ID:???
926NAME IS NULL:2008/09/30(火) 05:30:43 ID:OGY1l09Y
MySQL 5.0

id (primary), title, name・・・
id, category, article, date・・・
上のようなテーブルで、idをキーに内部結合し、双方のテーブルのデータを幾つかと、各id毎のdateの数を抽出したいと思っています。

結合してデータ幾つか、各id毎のdateの数と片方ずつなら何とかなるのですが、同時に抽出出来ないでしょうか。
927NAME IS NULL:2008/09/30(火) 05:48:10 ID:???
>>926
手抜きせずに、サンプルデータと得たい結果サンプルを書いた方がいいよ。
928NAME IS NULL:2008/09/30(火) 19:15:09 ID:K1OiLJVv
select * from 商品

コード 商品名
000001 品物1
000002 品物2
000003 品物3

上記のようなテーブルがあります。これに入荷年月が今月ということで、

コード 商品名 入荷月
000001 品物1 200809 
000002 品物2 200809
000003 品物3 200809

のように、select文のみを使って入荷月を一律で追加してまとめて表示させたいのですが、
どのようにすればいいでしょうか。oracle10gです。
929NAME IS NULL:2008/09/30(火) 19:32:24 ID:???
select コード, 商品名, '200809' as 入荷月 from 商品
930NAME IS NULL:2008/09/30(火) 19:57:49 ID:K1OiLJVv
>>929
ありがとうございました。asを使えばそのまま表示できるのですね。
初歩的な質問で申し訳ございませんでした。。。
931NAME IS NULL:2008/09/30(火) 20:18:14 ID:???
asを使わなくてもそのまま表示できるが・・・
select コード, 商品名, '200809' from 商品
932NAME IS NULL:2008/09/30(火) 20:19:57 ID:???
入荷月はどうした
933NAME IS NULL:2008/09/30(火) 20:31:06 ID:???
要求仕様を見ることのできない人かと一瞬思ったが、

> asを使えばそのまま表示できるのですね。

これに対するレスなんだろう。
934NAME IS NULL:2008/09/30(火) 22:51:40 ID:???
そもそも型は文字列型でいいのかといらん心配をしてしまう俺。
935NAME IS NULL:2008/09/30(火) 23:46:49 ID:???
むしろ文字列型以外にどうやって200809なんて表示させるのかと。
日付型だったとしてもto_charすんだろ?
まさかNLS_DATE_FORMATで指定するとか?
936NAME IS NULL:2008/10/01(水) 00:01:55 ID:???
> 表示させたい
って書いてるのにね。

> 入荷年月が今月ということで
どうせ気にするならこっちを気にしようよ、と思わなくもないんだけど。
937NAME IS NULL:2008/10/01(水) 03:41:02 ID:lipi35He
自分が現在触っているDBの名前を確認したいときは、どのようなコマンドを打てばよいのでしょうか?
ご教授いただけると幸いです。
938NAME IS NULL:2008/10/01(水) 05:28:33 ID:???
ポータブルな方法という意味であれば、存在しないのでは。
939NAME IS NULL:2008/10/01(水) 10:20:41 ID:???
環境依存ですな
940NAME IS NULL:2008/10/01(水) 13:40:27 ID:???
oracle6以来久しぶりにSQLさわるので
ものすごく初歩的なところであほになってます
こっぱずかしい質問ですが、助けてください
MS ACCESSです

table A
colA|colB
ああ|0
いい|1
うう|0
ええ|0
このテーブルで、名称マスタなんか使わないで
暫定でselect発行して「0=あほ、1=ばか」に名称変更して

colA|colB
ああ|あほ
いい|ばか
うう|あほ
ええ|あほ

このように見たいのですが
どういうselect発行すればよいでしょうか
教えてください
941NAME IS NULL:2008/10/01(水) 13:45:01 ID:???
case
oracle ならdecodeでも可
942NAME IS NULL:2008/10/01(水) 14:15:02 ID:???
access case でぐぐってみたけっか
switch でやるらしいので書いてみたところ

select z.colA,switch(z.colB=0,'あほ',z.colB=1,'ばか') as colB from A z

これでいけました
caseは知らないなぁ…
decodeなら使ったような気が…
リハビリの道のりは遠い

ありがとうございました
943NAME IS NULL:2008/10/02(木) 00:39:13 ID:???
数万件入ってるDBから
セレクトするときに
同時に計算したセレクト文を書くのがいいのか

あらかじめ計算した結果をいれといて呼び出すほうがいいのか
株価の前日比ですが・・・

どっちが軽く動くでしょうか

SQLserverです

前者だと計算する必要があって後者だとデータが一列分増えるのですが
944NAME IS NULL:2008/10/02(木) 00:42:30 ID:???
>>943
たかだか数万件なら、その場の計算で十分っぽい。
が、検証してトレードオフを判断しろよ
945NAME IS NULL:2008/10/04(土) 17:31:37 ID:???
100万件のレコードから、5行目から10行までのレコードを取得したいと思っています。
各レコードには、レコード番号が存在し、それが行数に比例しているので、
select文に行数を指定したいと思っています。
次のようなsqlだと、

select * from table where number >= 5 AND number <= 10

レコード番号が5から10であるレコードを取得するということで、
全てのレコードをチェックするようになり、非常に低速です。
特定の行のみにアクセスすることはできますでしょうか。
環境はmysqlです。
946NAME IS NULL:2008/10/04(土) 17:34:59 ID:???
>>945
MySQL のことは知らんが、index 貼れば済む話なんじゃ?
あと、offset とか limit とかないの?
947NAME IS NULL:2008/10/04(土) 18:01:39 ID:???
select * from table order by number limit 5 offset 5;
>>946 の言うとおり、number に index 張っとかないと、遅いでしょうね。
948NAME IS NULL:2008/10/04(土) 19:54:10 ID:???
>>947
MySQLはそのSQLでindexが効く?
もし使われるなら、相当優秀なオプティマイザだけど。
949NAME IS NULL:2008/10/04(土) 21:31:51 ID:???
945です。
色々とアドバイスありがとうございます。
単にindexを作成すれば、高速化されました。
お騒がせしました。
950NAME IS NULL:2008/10/05(日) 10:34:36 ID:???
CREATE VIEW foo AS
SELECT i.hash, p.name
FROM i, m, p
WHERE i.hash = m.hash AND m.name_id = p.name_id;

CREATE VIEW bar AS
SELECT i.hash, p.name
FROM i INNER JOIN m
ON i.hash = m.hash
INNER JOIN p ON m.name_id = p.name_id;

この2つっておんなじ? 何か違いあったりする?
951NAME IS NULL:2008/10/05(日) 12:21:57 ID:???
SQL Server 9.00.3068.00 SP2 Express Editionです。
与えられたDateTime型の時刻から5分未満切捨ての時刻を
「人の目で見て時刻とわかる形(例: '2008/10/01 10:45')で」得たいのですが
スマートな(実行効率が良く、できれば簡潔性も併せ持つ)書き方をお教えください。
GROUP BY句に書き、かつSELECT結果にも含めることを意図しています。

機能的には DATEDIFF(minute, '2008/9/1', [SmpTime])/5 でとりあえず
時刻[SmpTime]の5分未満切捨てが実現できましたが、これでは人の目で見て時刻に見えません。
SQLではなくクライアントプログラムのロジックで変換しろと言われそうですが、
SELECT結果をADO.NETのDataSetに即格納して即表示したい事情でそれは最後の手段としたいのです。

なお、SQLの参考書を頼りにDATE_FORMAT()の使用を考えたんですが、上記バージョンのSQL Serverで
 PRINT DATE_FORMAT(GETDATE(), '%Y')
を実行すると、
メッセージ 195、レベル 15、状態 10、行 1
'DATE_FORMAT' は 組み込み関数名 として認識されません。
と言われ、DATE_FORMAT()を使えずにいます、、
(PRINT文実行にはSQL Server Management Studio Version 9.00.2047.00使用)
952NAME IS NULL:2008/10/05(日) 12:38:46 ID:???
>>950
オプチマイザがどう判断するかわからんけど、
仮に
 i, mの列数:5000万列
 i.hash = m.hashに該当するiの行数: 2億行
 m.name_id = p.name_idに該当するmの行数: 10行
とかのケースを考えれば、
 WHERE i.hash = m.hash AND m.name_id = p.name_id
なら高々2億行スキャンすれば結果(10行以下)が出てくるのに対し、
同じ結果を出すのに
 i INNER JOIN m ON i.hash = m.hash INNER JOIN p ON m.name_id = p.name_id
は途中でi INNER JOIN m ON i.hash = m.hashの中間結果(2億行×1億列の新しい表)が発生するので莫大なメモリを無駄に消費しそう、、
953NAME IS NULL:2008/10/05(日) 13:31:17 ID:???
>>952
意味が同じかどうか聞いてるんじゃないの?
954NAME IS NULL:2008/10/05(日) 13:57:07 ID:???
次スレのテンプレ用にマニュアルの一覧作ってみた。

-----
SQL言語リファレンス一覧

Oracle Database
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-02/toc.htm

Microsoft SQL Server
http://msdn.microsoft.com/ja-jp/library/bb510741.aspx

IBM DB2 Database
http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp (目次から参照情報→SQL)

PostgreSQL
http://www.postgresql.jp/document/pg833doc/html/sql.html

MySQL
http://dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html
955951:2008/10/05(日) 14:44:05 ID:???
見落とした。WHERE ANDとINNER JOIN の対比だけ考えてたが
>950をよく読むと、さらにビュー(fooとbar)を作ると来ているので
データベースエンジンによってビューがどのように最適化されるかをも問われている。

見かけ上fooとbarが同等になるのは当然として、
fooやbarにアクセスしたときのデータベースエンジンの実行計画を比較せねばならない
>950はあまり一筋縄ではいかない問い。
956NAME IS NULL:2008/10/05(日) 16:17:34 ID:???
>>952
ふつう、SQL92 JOINに書き換えたからといってそんなアホな実行計画になるDBMSなどない。
3テーブル以上の結合順序が変わるとか、より高度な最適化が効いたり効かなかったりといった
違いが出る場合はあるけど。
957NAME IS NULL:2008/10/06(月) 00:10:41 ID:???
こうやったらどう動くか推測するんじゃなくて
質問してるバカに実行計画の取り方を教えるべき
958NAME IS NULL:2008/10/06(月) 03:58:30 ID:???
>>954
乙。

それにしても>>1の質問テンプレを見てくれない人が多いなぁ。
なんで、DBとバージョンを書かないんだろう。
"SQL" の指す物が"SQL Server" とか "MySQL"と思いこんでいるとかかな?
特にMySQLなんてサブクエリが使えない4.0以前のものが結構現役で動いているようだし。
959NAME IS NULL:2008/10/06(月) 04:24:42 ID:???
>>947,948
俺も気になったのでPostgreSQL8.3と郵便番号テーブル(13万行)を使って試してみた。
結果ソートにIndex参照されているようで断然速い。

# EXPLAIN ANALYZE SELECT * FROM Table ORDER BY column LIMIT 5 OFFSET 5;

Index無し
----------------------------------
Limit (cost=5866.04..5866.05 rows=5 width=98) (actual time=216.572..216.580 rows=5 loops=1)
-> Sort (cost=5866.02..6170.52 rows=121799 width=98) (actual time=216.561..216.567 rows=10 loops=1)
Sort Key: column
Sort Method: top-N heapsort Memory: 18kB
-> Seq Scan on Table (cost=0.00..3233.99 rows=121799 width=98) (actual time=0.010..94.643 rows=121799 loops=1)
Total runtime: 216.629 ms

Index有り
----------------------------------
Limit (cost=0.56..1.12 rows=5 width=98) (actual time=0.028..0.036 rows=5 loops=1)
-> Index Scan using table_idx on Table (cost=0.00..13639.14 rows=121799 width=98) (actual time=0.017..0.026 rows=10 loops=1)
Total runtime: 0.081 ms

2674倍でちょっと驚き。つか、今まで知らなかったのが恥ずかしい...orz
960NAME IS NULL:2008/10/06(月) 09:26:29 ID:???
最近のoptimizerの勉強もしとかないと
共通コーディングのルールも「バカ」と思われそうだな
961NAME IS NULL:2008/10/06(月) 10:35:01 ID:???
某案件ではJOINする順番にテーブルの別名をA,Bとするってのがあって萎えた
962NAME IS NULL:2008/10/06(月) 11:28:47 ID:???
素朴な質問をして申し訳ないが、
サブクエリでSELECT したフィールドをキーにしてJOINするとき、
そのキーには index は生成されていない。←この認識で合ってる ?
だから、サブクエリ経由より、一旦temp table に出力して index 作ってから
JOIN した方が速いことがある。←これ正しい ?
963NAME IS NULL:2008/10/06(月) 13:17:45 ID:???
だから環境を書けとあれほど
964NAME IS NULL:2008/10/06(月) 16:52:08 ID:QZhXlWAd
>>962
件数や環境、DBによって左右される(たぶん)ので
テストデータ作って検証するのが一番速くて確実
965NAME IS NULL:2008/10/06(月) 17:35:24 ID:bING3OmZ
>>963
という事は環境によって、サブクエリの結果にindexが生成される事があるって事?
966NAME IS NULL:2008/10/06(月) 18:19:30 ID:???
環境指定してくれないと生成されるかどうか確かめられないだろ
ひょっとしたら作成される環境もあるかも知れないわけだし
エスパーじゃないんだからみんな確かめないと解らんのだよ
967NAME IS NULL:2008/10/06(月) 18:32:11 ID:???
さすがにサブクエリの結果にインデックス作っちゃうような処理系はないだろう。

ただしサブクエリの結果をハッシュテーブルにして
そのままハッシュジョインにもっていく処理系ぐらいはありそうだし
もしかしたらサブクエリを真面目に実行せずに
はじめから欲しい結果だけをうまいこともってくるように
最適化しちゃう処理系もあるかもしれない。
968NAME IS NULL:2008/10/06(月) 19:04:29 ID:QZhXlWAd
環境を指定しろと言っているヤツは、細かな環境の違いで起こる挙動の違いまで逐一把握しているのか?
969NAME IS NULL:2008/10/06(月) 19:11:31 ID:???
環境によってはわかるからだろ。
970NAME IS NULL:2008/10/06(月) 19:15:15 ID:???
>>968
環境の違いを知ってるのではなく同じ環境を作って試してみるから
環境を教えろと言ってるわけで
971962:2008/10/06(月) 19:36:35 ID:???
>>967
>ただしサブクエリの結果をハッシュテーブルにして
>そのままハッシュジョインにもっていく処理系ぐらいはありそうだし

こういうお話が伺えてよかったです。
手元の mysql 5.0.51b では、サブクエリを使うと(少なくともpostgresql 8.2.6 より)かなり遅くなることがあって、
サブクエリにインデックスを作るような処理系はあるのだろうかと、素朴に思って気軽に伺ったのですが。
御存じないものを、わざわざ環境を作ってまで確かめて頂くには及びません。
有難うございました。
972NAME IS NULL:2008/10/06(月) 21:38:04 ID:???
>>968
分かる可能性が高くなることはどんどん書くべきだと思います。
973NAME IS NULL:2008/10/06(月) 21:44:31 ID:???
質問した奴だけ勝手に納得されても困る。
974NAME IS NULL:2008/10/06(月) 23:07:58 ID:???
>>959
見たところ、order by number でindexが使われたみたいだな。
SeqScanはrows=121799のままだから、limit/offsetに効いたわけではなさそう。

100000から100005までとかだったら、number>=100000 and number<=100005 との
差が現れるんじゃないかな。
975NAME IS NULL:2008/10/06(月) 23:48:59 ID:???
>>1に書く文章を考えてみた。
参考リンクは>>2以降へ格下げで。

-----
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:SQL質疑応答スレ 6問目
http://pc11.2ch.net/test/read.cgi/db/1210940477/
976NAME IS NULL:2008/10/07(火) 00:12:58 ID:rKyIKabx
PostgreSQL8.3.0で、

CREATE TABLE test (
AAA bit(32)[2]
);

のようなテーブルを作成し、これにレコードを挿入しようとしたのですが、

INSERT INTO test VALUES('{(1)::bit(32), (2)::bit(32)}');

と書くとエラーとなってしまいうまくいきませんでした。
(エラー内容はうろ覚えなのですが、'(' is not valid binary… とかでした)

カラム名を省略せずに書くとうまくいくのですが、省略して書きたい場合はどうすればいいのでしょうか?
977NAME IS NULL:2008/10/07(火) 03:01:36 ID:???
>>951
T-SQLにDATE_FORMATなんてあったっけ
「'DATE_FORMAT' は 組み込み関数名 として認識されません」
はそういう意味じゃ?

DATEDIFF(minute, '2008/9/1', [SmpTime]) の戻り値って
'2008/9/1 0:0:0' という時点から[SmpTime]という時点までの差を
minute (Integer)で求めるってことじゃないの

そんで /5 って商がでると思うけど切捨てが実現できたの?


こんなのしか思いつかないけど

declare @SmpTime datetime
set @SmpTime='2008/9/1 1:36:32.123'

select
convert(varchar(16),
dateadd(mi,- (datepart(mi,@SmpTime)%5),@SmpTime )
,120)
+ ':00'
または
select
convert(varchar,year(@SmpTime)) + '/'
+ convert(varchar,month(@SmpTime)) + '/'
+ convert(varchar,day(@SmpTime)) + ' '
+ convert(varchar,datepart(hh,@SmpTime)) + ':'
+ convert(varchar,datepart(mi,@SmpTime) - (datepart(mi,@SmpTime)%5)) + ':00'

そもそもADO.NETでDataSetてことはアプリでは.NetFramework使用だろうから
フォーマット(「人の目で見て時刻とわかる形」)するならアプリ側のほうが断然得意のはずと思うのだが。
ASP.NETであれ、DataGridViewであれDatetime型オブジェクトの表示用formatが用意されてないっけか
978959:2008/10/07(火) 03:57:33 ID:???
>>974
> 100000から100005までとかだったら、number>=100000 and number<=100005 との
> 差が現れるんじゃないかな。

そういうことっすな。LIMIT 5 OFFSET 100000 ってしたら、全行(12万)読み込むのと
変わらなくなります。ただ、インデックス無しの場合、
------------------------------------
Limit (cost=26680.44..26680.45 rows=5 width=98) (actual time=904.381..904.392 rows=5 loops=1)
-> Sort (cost=26430.44..26734.94 rows=121799 width=98) (actual time=676.771..838.306 rows=100005 loops=1)
Sort Key: column
Sort Method: external merge Disk: 13880kB
-> Seq Scan on Table (cost=0.00..3233.99 rows=121799 width=98) (actual time=0.010..103.218 rows=121799 loops=1)
Total runtime: 908.560 ms

ソート処理にディスクへの書き出しが発生していて、さらに時間がかかっている。
これはどちらかというと、LIMIT 5 OFFSET 5 の様な先頭付近取り出し時にうまくやっている
と取った方がいいかもね。


>>976
INSERT INTO test VALUES (ARRAY[1::bit(32),2::bit(32)]);
979NAME IS NULL:2008/10/07(火) 13:43:26 ID:P8lUOwPo
TABLE表のNAMEカラムから
全ての名前の組み合わせを表示したいのですが

SELECT A.NAME AS A_NAME, B.NAME AS B_NAME FROM TABLE A, TABLE Bだと

A_NAME B_NAME
田中      田中
伊藤      田中
鈴木      田中
佐藤      田中
田中      伊藤
伊藤      伊藤
鈴木      伊藤
佐藤      伊藤
田中      鈴木
伊藤      鈴木
.....

といった具合になってしまいます
2行目の伊藤&田中と5行目の田中&伊藤が重複する具合になるのですが
これを解消するにはどういう書き方をしたらよいのでしょうか?
980979:2008/10/07(火) 13:50:35 ID:???
質問して早々ですがちょうどぐぐっていたところ
ピッタリの条件のサイトが見つかりました
自己解決しましたスレ汚しすみません

WHERE句でA_NAME<>B_NAMEで同じものを排除し
A_NAME > B_NAMEで同じ組み合わせで順序が違うものを排除ですね
char型にたいして演算子を使うのは思いつきませんでした
981NAME IS NULL:2008/10/07(火) 21:41:50 ID:YGlBjA2M
複数の表から抽出するためのSQLを教えてください。

表A
職員番号,部署番号・・・etc
表B
職員番号,客の名前(漢字),客の名前(カナ)・・・etc

上記から職員番号・部署番号・客の名前(カナ)・客の名前(漢字)だけをまとめて抽出したいです。
職員番号はAもBも同一で複数いる職員のうち今回調べたいのは一人です。
その一人が受け持った複数のお客様を表示したいので条件句では職員番号xxxxで指定します。

試しにあほなりに下記のように考えてみましたが無理でした。
分かる方お願いします。
SELECT 表A.職員番号,部署番号,客の名前(カナ),客の名前(漢字)
FROM 表A,表B
WHERE 表A.職員番号=’xxxx’
982NAME IS NULL:2008/10/07(火) 21:46:42 ID:???
>>981
JOIN
983NAME IS NULL:2008/10/07(火) 22:07:02 ID:???
SELECT 表A.職員番号,部署番号,客の名前(カナ),客の名前(漢字)
FROM 表A JOIN 表B ON 表A.職員番号=表B.職員番号
WHERE 表A.職員番号=’xxxx’

ありがとうございます。
こうでしょうか?
本当に浅い知識しかなく、JOINというのも今はじめて知ってネットで
調べて使ってみたのであっているのかまったく分かりません・・。
他の句に関しては問題なさそうでしょうか??
984NAME IS NULL:2008/10/07(火) 22:09:04 ID:YGlBjA2M
うっかり下げ進行でID表示されてませんが>>983=>>981です
985NAME IS NULL:2008/10/07(火) 22:39:11 ID:???
>>983
Bにレコードが全然ない職員がいない前提ならそれでいいのでは。
今確認できない状況にいるのかな。
986NAME IS NULL:2008/10/07(火) 22:59:55 ID:???
今は申し訳ありませんが確認できない状況にあります。
もしも、その前提がない場合は

SELECT 表A.職員番号 OR 表B.職員番号,部署番号,客の名前(カナ),客の名前(漢字)
FROM 表A JOIN 表B ON 表A.職員番号=表B.職員番号
WHERE 表A.職員番号=’xxxx’ OR 表B.職員番号=’xxxx’

こんな感じでしょうか・・・
フィールド名にORを使っていいのか分かりませんが・・
987NAME IS NULL:2008/10/07(火) 23:38:33 ID:???
>>986
表Aに全ての職員の情報があり、表Bにレコードを持たない職員がいる場合はこう
SELECT 表A.職員番号,部署番号,客の名前(カナ),客の名前(漢字)
FROM 表A LEFT OUTER JOIN 表B ON 表A.職員番号=表B.職員番号
WHERE 表A.職員番号=’xxxx’

表Bにしか存在しない職員がいる場合はこう
SELECT 表B.職員番号,部署番号(Bにしか存在しない職員の場合、ここはNULLになる),客の名前(カナ),客の名前(漢字)
FROM 表A RIGHT OUTER JOIN 表B ON 表A.職員番号=表B.職員番号
WHERE 表B.職員番号=’xxxx’

表Aにしか存在しない職員がいてかつ、表Bにしか存在しない職員がいる場合はこう。
SELECT (表A.職員番号 と、表B.職員番号のうち、NULLじゃないほうを取得する処理),
部署番号(Bにしか存在しない職員の場合、ここはNULLになる),客の名前(カナ),客の名前(漢字)
FROM 表A FULL OUTER JOIN 表B ON 表A.職員番号=表B.職員番号
WHERE 表A.職員番号=’xxxx’ OR 表B.職員番号=’xxxx’
職員番号のところはDBMSによって異なる。COALESCEとかISNULLとかNVLとか
988NAME IS NULL:2008/10/08(水) 11:59:32 ID:???
es
989NAME IS NULL:2008/10/09(木) 01:10:21 ID:x5qY1cjN
SQLSeaver2005で時間と数値の足し算の関数とかってなにかありますか?

時間(時分{1400 char(4)など})の列と分のみ(130分など)の列があり、
それを足し算して正しい時間(例で言うと、1610)になるようにしたいのですが
なかなかできません。
もしお時間ある方おられましたら教えてくださいませ。
990NAME IS NULL:2008/10/09(木) 03:07:54 ID:???
>>989
http://japan.internet.com/developer/20071113/26.html
これ見つつ、キャスト、部分文字列取得でいけるかな
991NAME IS NULL:2008/10/09(木) 03:21:56 ID:x5qY1cjN
ありがとうございます。もう一つだけ教えていただけないでしょうか?

cast(         --以下時部分
case when cast(substring(time,3,2) as int) + cast(btime as int) = 60
then cast(substring(time,1,2) as int) + 1
when cast(substring(time,3,2) as int) + cast(btimeas int) > 60
then cast(substring(time,1,2) as int) + cast(Floor(btime/60) as int)
when cast(substring(Stime1,3,2) as int) + cast(btime as int) < 60
then substring(time,1,2)
end as char(2))
      +  --以下分部分
cast(
case when cast(substring(time,3,2) as int) + cast(bikotime1 as int) = 60
then '00'
when cast(substring(time,3,2) as int) + cast(btime as int) > 60
then cast(substring(time,3,2) as int) + cast(btime as int)%60
when cast(substring(time,3,2) as int) + cast(btime as int) < 60
then cast(substring(time,3,2) as int) + cast(btime as int)
end as char(2))
このようにすると分が60分の場合は、'00'を入れているはずが'0'しかはいらず、
また、時部分が一桁だと、'9 45'などのようになってしまいます。
長々とすみませんが、どうかお力を・・・
992NAME IS NULL:2008/10/09(木) 03:29:00 ID:???
>>991
TIME型とINTERVAL型に変換して足せば?
SELECT CAST(substring(時間の列 FROM 1 FOR 2) || ':' || substring(時間の列 FROM 3 FOR 2) || ':00' AS TIME) + CAST(分の列 || 'mins' AS INTERVAL) FROM Table;
993NAME IS NULL:2008/10/09(木) 03:39:24 ID:x5qY1cjN
>>992
回答ありがとうございます。
SQLSeaver2005なので使えない関数が多くて、Time型やINTERVAL型も
使えないんです・・・
994992:2008/10/09(木) 04:22:31 ID:???
あーTIME型は他でもいけそうだけど、INTERVAL型がないのはきついなぁ。
ってことで、スマンが俺はパス。

さっき書き忘れたけど、SQL Serverスレで聞いた方がよくね。
995NAME IS NULL:2008/10/09(木) 07:29:01 ID:???
次スレが立つ気配が無いので
>954と>975を参考にスレ立てでもしようかと思ったがダメだった
996NAME IS NULL:2008/10/09(木) 13:15:29 ID:???
>>995を参考にたててみた

SQL質疑応答スレ 7問目
ttp://pc11.2ch.net/test/read.cgi/db/1223525474/
997NAME IS NULL:2008/10/09(木) 15:25:30 ID:???
DATEADD(n, left(col_hhmm, 2) * 60 + right(col_hhmm, 2) + col_minute, '0:0') as calc_time
こういう感じを想定していたんだけど、いざやってみるとその後のHHMM形式にすることが大変かもしれない
998NAME IS NULL:2008/10/09(木) 21:00:34 ID:???
>>989
declare @t1 char(4)
declare @t2 int
set @t1='1400'
set @t2=130
declare @d datetime
-- 1900/1/1 00:00:00 からの経過時間
select @d = dateadd(mi,@t2,convert(datetime,'1900-01-01 ' + substring(@t1,1,2) + ':' + substring(@t1,3,2)))
select convert(varchar,@d,120)
-- 24時間以上考慮の場合
select datediff(mi,'1900-01-01 0:0:0',@d) / 60,datediff(mi,'1900-01-01 0:0:0',@d) % 60

こんな感じでどすか
目的のフォーマットにはしてないけど。
999NAME IS NULL:2008/10/09(木) 21:35:36 ID:???
1000なら藤井名人
1000NAME IS NULL:2008/10/09(木) 21:36:44 ID:???
1000なら藤井名人
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。