[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 07/24 16:35 / Filesize : 155 KB / Number-of Response : 470
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

SQL質疑応答スレ 6問目



1 名前:NAME IS NULL mailto:sage [2008/05/16(金) 21:21:17 ID:???]
参考リンク
sql.main.jp/cont/sql/map.html
www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
oraclesqlpuzzle.hp.infoseek.co.jp/
www.techscore.com/tech/sql/

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

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

2 名前:NAME IS NULL mailto:sage [2008/05/16(金) 21:22:37 ID:???]
過去ログ

SQL質疑応答スレ pc8.2ch.net/test/read.cgi/db/1056973582/
SQL質疑応答スレ Part 2 pc8.2ch.net/test/read.cgi/db/1103113155/
【帰ってきた】SQL質疑応答スレ pc8.2ch.net/test/read.cgi/db/1124178925/
【帰ってきた】SQL質疑応答スレ 2問目 pc8.2ch.net/test/read.cgi/db/1141622643/
【帰ってきた】SQL質疑応答スレ 3問目 pc11.2ch.net/test/read.cgi/db/1160458216/
【帰ってきた】SQL質疑応答スレ 4問目 pc11.2ch.net/test/read.cgi/db/1176553195/
SQL質疑応答スレ 5問目 pc11.2ch.net/test/read.cgi/db/1193486961/

3 名前:NAME IS NULL mailto:sage [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
;

4 名前:NAME IS NULL mailto:sage [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
;

5 名前:NAME IS NULL [2008/05/18(日) 10:58:59 ID:6+oG6BiD]
インデックスの勉強がしたいのですが、
どういった方法がいいでしょうか?
たとえばインデックスの効果が体感できる
勉強方法とか教えてください。


6 名前:NAME IS NULL mailto:sage [2008/05/18(日) 13:20:40 ID:???]
今時のPC性能だと趣味で勉強するレベルのデータ量では体感は不可能だと思うが。

7 名前:NAME IS NULL mailto:sage [2008/05/18(日) 13:38:41 ID:???]
INDEXが有ることでSELECTが遅くなる
と紹介されることが多いけど、自分でも体験してみたいです。

8 名前:NAME IS NULL mailto:sage [2008/05/18(日) 13:53:04 ID:???]
INDEXが有ることでSELECTが遅くなるなんてどこで紹介されてるんだ?

それはともかく、手っ取り早くテストデータ作るなら
PostgresとかMySQLについてるベンチマークでいいんじゃね?

9 名前:NAME IS NULL mailto:sage [2008/05/18(日) 17:29:02 ID:???]
間抜けなインデックスが足を引っ張る、なんてのはあるけどね。
最近のおりこうさんなオプティマイザだと、そうそうないんじゃないかな

10 名前:NAME IS NULL mailto:sage [2008/05/18(日) 17:45:53 ID:???]
前スレからのつづきで
auto_increment振ってみたらやっぱ順番バラバラで
auto_incrementフィールドの連番を振りなおしたい

やりたいことは
今あるテーブルのあるフィールドを昇順として
auto_incrementフィールドに1から連番をつけたいです。
お願いします(>_<)



11 名前:NAME IS NULL mailto:sage [2008/05/18(日) 17:47:22 ID:???]
>>10
たぶん、DB によるんだろうけど、一般的な解としては
同じ構造のテーブルに入れ直す、ってとこじゃない?

12 名前:10 mailto:sage [2008/05/18(日) 17:52:52 ID:???]
別のテーブルを作るってこと?
名前は変えたくないんでできれば、今のテーブルを更新したいです。

色々調べてみてUPDATEとかRowNumでできそうな気がしたけど、わからんかったorz

13 名前:NAME IS NULL mailto:sage [2008/05/18(日) 17:54:36 ID:???]
別のテーブルに入れた後、元のテーブルを削除して、
新しいテーブルを元の名前にすればOK

テンポラリテーブルを使ってもいいし。

14 名前:10 mailto:sage [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フィールドまでまんまコピーされてしまうし。

15 名前:NAME IS NULL mailto:sage [2008/05/18(日) 18:23:41 ID:???]
auto_incrementをやめればいい

16 名前:10 mailto:sage [2008/05/18(日) 18:29:59 ID:???]
そっか。ちょっと調べてみまふ
ありがとう

17 名前:NAME 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回となると難しくて困っています。


18 名前:NAME IS NULL mailto:sage [2008/05/18(日) 22:06:26 ID:???]
>>17
UNION

19 名前:NAME IS NULL [2008/05/18(日) 22:29:45 ID:toQ3X+jn]
ありがとうございます。

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

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

(csvに吐いて処理するので、カラム数が合って欲しいです)

20 名前:NAME IS NULL mailto:sage [2008/05/18(日) 22:38:17 ID:???]
あー、ごめんごめん。

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



21 名前:NAME IS NULL [2008/05/18(日) 23:18:37 ID:toQ3X+jn]
>その結果と社員表を INNER JOIN すれば OK だね

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

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

この場合みたいに、
中間的な表を介して3つの表で外部結合させる時の
空カラムの出し方が分かりませんでした。

22 名前:NAME IS NULL mailto:sage [2008/05/18(日) 23:52:20 ID:???]
> 外部結合すれば勝手に空のカラムが出るけど、

join の left, right, inner, outer の意味わかってる?

23 名前:NAME 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行目が分かっていません…

24 名前:NAME IS NULL mailto:sage [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.講座名 = :講座名

25 名前:NAME IS NULL mailto:sage [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)
;

26 名前:NAME IS NULL mailto:sage [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. 編集処理完了後、ロックフィールドを空にし、処理フラグを立てて更新する


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

上記の処理に何かまずい所があるのでしょうか?

27 名前:NAME IS NULL mailto:sage [2008/05/19(月) 15:42:17 ID:???]
>>26
2の時点で一旦COMMITすれば起きないんじゃない?

ただ、3〜4が失敗した場合に2がロールバックされないという
新たな問題が発生することになるけど。

28 名前:NAME IS NULL mailto:sage [2008/05/19(月) 16:19:45 ID:???]
返信ありがとうございます

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

ちなみに分離レベルはデフォルトのREAD COMMITEDです

29 名前:NAME IS NULL mailto:sage [2008/05/19(月) 23:35:05 ID:???]
表のとある項目から、後ろから3桁目の数字が0である項目を抜き出したいのですがどうすればよいのでしょうか?
likeを使ったりしてるのですがわかりません。

30 名前:NAME IS NULL mailto:sage [2008/05/19(月) 23:46:13 ID:???]
>>28
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 を使用するキュー リーダーは、他のトランザクションによってロックされたキュー エントリを、
ロックが解除されるまで待たずにスキップして、次に使用可能なキュー エントリへ進みます。




31 名前:NAME IS NULL mailto:sage [2008/05/19(月) 23:54:02 ID:???]
>>29
ヒント:
SELECT
 SUBSTRING(RIGHT(T.COL1,3),1,1)
  FROM TABLE T

SQLServerならこれで右から3桁目がわかる。
varcharだけどね。

32 名前:NAME IS NULL mailto:sage [2008/05/20(火) 00:03:13 ID:???]
>>29
WHERE ある項目 LIKE '%0__'
ある項目が数値型なら文字列型にキャストする

33 名前:NAME IS NULL mailto:sage [2008/05/20(火) 13:08:54 ID:???]
>>31-32
ありがとうございます。
しかしうちはoracleな上、likeは使わずにやってみろと言われ頭がパンクしそうです(´・ω・`)
文字列の変換がヒントだと言われたのですが……アウアウ

34 名前:NAME IS NULL mailto:sage [2008/05/20(火) 13:28:57 ID:???]
>>33
WHERE SUBSTR(ある項目, -3, 1) = '0'

35 名前:NAME IS NULL mailto:sage [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

よろしくお願いします。

36 名前:35 mailto:sage [2008/05/20(火) 22:51:18 ID:???]
ごめんなさい書きもれました
AK、BK=NULLも出勤日扱いです

37 名前:NAME IS NULL mailto:sage [2008/05/20(火) 23:19:23 ID:???]
2008/05/07 も結果に入れたいってところに無理があるような。
ありえる日付を全て列挙した別テーブルを用意するのが常道じゃね?

38 名前:NAME IS NULL mailto:sage [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

39 名前:NAME IS NULL mailto:sage [2008/05/20(火) 23:21:27 ID:???]
5/7もいれるのか!


40 名前:NAME IS NULL mailto:sage [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 mailto:sage [2008/05/20(火) 23:50:49 ID:???]
>>37, >>39
> 2008/05/07 も結果に入れたいってところに無理があるような。

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

>>37 の言う通り、日付マスタ用意するかストアドで動的に生成する
ぐらいしか思いつかない。

42 名前:35 mailto:sage [2008/05/21(水) 00:26:42 ID:???]
皆さんレスありがとうございます。
そうなんです。
2008/05/07 も結果に入れたい仕様なんです^^;
未来方向に確実に入力するのかは客次第で致し方ないとして

私の、数少ない経験でも
歯抜けな複数のカレンダーって何事?
もーテーブル設計のミスとしか思えないのですが
客が既設に拘りテーブルの統合や新設(特にマスター系)を極端に嫌うので...
#マスターが増えれば自分の仕事が増えるからいやだと嫌がったので
#自動でマスターを更新しますって言っても聞きいれてもらえなかった

43 名前:NAME IS NULL mailto:sage [2008/05/21(水) 21:07:07 ID:???]
やはり馬鹿がコンピュータを使うとろくな事がないな w

44 名前:NAME 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 =

45 名前:NAME IS NULL mailto:sage [2008/05/21(水) 22:21:20 ID:???]
>>42
歯抜けがせいぜいn日、とか、AとBを組み合わせると歯抜けがなくなる、
ならどうにかなるのでは

46 名前:NAME IS NULL mailto:sage [2008/05/21(水) 23:20:35 ID:???]
バカがコンピュータでやってくる

47 名前:35 mailto:sage [2008/05/21(水) 23:49:16 ID:???]
>>45 様ありがとうです。

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

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

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



48 名前:NAME IS NULL mailto:sage [2008/05/22(木) 00:21:18 ID:???]
手入力の無い日は自動入力するような仕組みを入れたほうがいい。

49 名前:NAME IS NULL mailto:sage [2008/05/22(木) 00:34:43 ID:???]
>>47
勝手な予想だが、再帰使えば何とかなるような気がする。

気のせいかもしれないけど。

50 名前:NAME IS NULL mailto:sage [2008/05/22(木) 00:35:14 ID:???]
>>49
親フィールドってなによ?



51 名前:NAME IS NULL mailto:sage [2008/05/22(木) 20:06:24 ID:???]
UNIONなどは使用せずに以下のような
結果を1回の問い合わせで取得することは可能でしょうか?

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

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




52 名前:NAME IS NULL mailto:sage [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

53 名前:NAME IS NULL mailto:sage [2008/05/22(木) 21:25:31 ID:???]
ROWCOLってなんだ・・・・
ROW_NUMBER() OVER(ORDER BY Col1)
の間違い。


54 名前:NAME IS NULL mailto:sage [2008/05/22(木) 21:45:43 ID:???]
「UNION などは使用」しない理由を書いた方がいいんじゃないか。

55 名前:NAME IS NULL mailto:sage [2008/05/22(木) 21:50:35 ID:???]
>>54
UNIONを使用したくない理由は
実際は該当のレコードを取得するのに
相当コストの高いSQLになってしまうので
検索を複数回実行させたくないからです。

ちなみにDBはSQL Serverです。

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

できなそうですかね?

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

57 名前:NAME IS NULL mailto:sage [2008/05/22(木) 22:18:52 ID:???]
>>55
>>52はテーブルデータが2行のときしかうまくいかないんじゃないのか?
ちなみに俺はUNIONしか思いつかんけど。

>>56
「外部結合」のキーワードまで辿り着いてるのに何でできないんだ?

58 名前:NAME IS NULL mailto:sage [2008/05/22(木) 22:34:41 ID:???]
>>56
外部結合をやってみた、その内容を書いてみてもらえますか?

59 名前:NAME IS NULL mailto:sage [2008/05/22(木) 22:35:31 ID:???]
Jet って Left Outer Join ってできたっけ?

60 名前:NAME IS NULL mailto:sage [2008/05/22(木) 22:38:51 ID:???]
Jetかどうかで左右されるレベルじゃなくね?



61 名前:56 mailto:sage [2008/05/22(木) 22:47:53 ID:???]
早速のレスありがとうございます!!!!

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

SELECT
受注表.受注番号,
受注表.顧客コード,
顧客表.顧客名,
受注表.商品コード1,
商品表.商品名,
受注表.商品コード2,
商品表.商品名
FROM
((受注表
LEFT JOIN 商品表
ON 受注表.顧客コード=顧客表.顧客コード)
LEFT JOIN 商品表
ON 受注表.商品コード1=商品表.商品コード)
LEFT JOIN 商品表
ON 受注表.商品コード2=商品表.商品コード

62 名前:NAME IS NULL mailto:sage [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したほうが速いだろうねえ。。。

63 名前:56 mailto:sage [2008/05/22(木) 23:00:36 ID:???]
まちがえました!

FROM の中、

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

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

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



64 名前:NAME IS NULL mailto:sage [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.商品コード

65 名前:NAME IS NULL mailto:sage [2008/05/22(木) 23:21:20 ID:???]
>>55
UNIONのコストが高くなるのが嫌ならUNION ALLをつかいなさい。

66 名前:NAME IS NULL mailto:sage [2008/05/22(木) 23:24:52 ID:???]
>>62のやつ、後ろのTableName Bを2行のダミーテーブルにすれば
意外と使えるかもしれんと、今ふと思った。

67 名前:NAME IS NULL mailto:sage [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

68 名前:NAME IS NULL mailto:sage [2008/05/22(木) 23:34:38 ID:???]
>>55
> 相当コストの高いSQLになってしまうので

ちゃんと測定した?

って言う前に、そんなこと心配するならテーブル構造
見直した方がいいんじゃないかと...。

69 名前:56 mailto:sage [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.商品コード」のところにフォーカスがあたって、
エラーになります。間違っているのはどこでしょう??(;_;)



70 名前:NAME IS NULL mailto:sage [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.商品コード




71 名前:56 mailto:sage [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.商品コード;

72 名前:NAME IS NULL [2008/05/23(金) 04:21:22 ID:psBkKcpD]
ID,親のID,コンテンツ
というような構造でフォルダのような階層を表現しているとき、
あるIDを与えて、そこから上の階層のIDを一気に取得する方法ってありますか?
ファイルのパスを取得するような形です。

73 名前:NAME IS NULL mailto:sage [2008/05/23(金) 04:33:28 ID:???]
>>72
「SQL CONNECT BY」あたりでググる。

74 名前:NAME IS NULL [2008/05/23(金) 04:52:24 ID:psBkKcpD]
>>73
ありがとう。

75 名前:55 mailto:sage [2008/05/23(金) 17:15:09 ID:???]
結局>>67みたいなSQLで処理することにしました。

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

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

みなさん、いろいろありがとうございました。

76 名前:NAME IS NULL mailto:sage [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

これって何でですの?


77 名前:NAME IS NULL mailto:sage [2008/05/23(金) 17:40:50 ID:???]
単なる浮動小数点演算の誤差だろJK

78 名前:76 mailto:sage [2008/05/23(金) 18:39:36 ID:???]
>>77
あれだと、Numberで38桁、、、誤差だろJK
で話終わっちゃうよなぁ確かに。

79 名前:NAME IS NULL mailto:sage [2008/05/23(金) 21:27:07 ID:???]
Oracleだからという話ではないな。

80 名前:NAME IS NULL mailto:sage [2008/05/23(金) 23:26:36 ID:???]
IEEE754でぐぐると何か分かるかも



81 名前:NAME IS NULL mailto:sage [2008/05/24(土) 02:00:03 ID:???]
そんなアメリカの規格、知りませんのだ(><)

82 名前:76 mailto:sage [2008/05/24(土) 02:09:41 ID:???]
>>80
オイラ宛てでしたか。退社直後でした。すみません。
調べておくですわ。

データ30万件強のうち数件程度ありやがったが
ダメな場合の法則性みたいのが分かんね。


83 名前:NAME IS NULL mailto:sage [2008/05/24(土) 02:23:58 ID:???]
有効桁数というか、精度というか。
ま、テストデータ作ればすぐ分かるよ。

84 名前:76 mailto:sage [2008/05/24(土) 04:25:51 ID:???]
>>83
というか、ナンバー型とフロート型を掛けたらナンバー型に暗黙変換かかって
切り捨て部分が四捨五入になった
でいいっすか。

これで月曜の報告はのりきろうかと。
ついでに電卓片手に1円違うというのは勘弁してと言うわ。


85 名前:NAME IS NULL mailto:sage [2008/05/24(土) 13:42:17 ID:???]
>>84
銀行は1円合わないと銀行内を怒号が飛び交うというのに。
金がらみのシステムやるなら1円の差を馬鹿にしてはいけないよ。

86 名前:NAME IS NULL mailto:sage [2008/05/24(土) 13:44:41 ID:???]
つーか完全に仕様不備ですな

87 名前:NAME IS NULL mailto:sage [2008/05/24(土) 14:58:51 ID:???]
Oracle的には仕様で、使う側が勘違いしている典型的な例だな。

88 名前:NAME IS NULL mailto:sage [2008/05/24(土) 15:23:06 ID:???]
>>74
勘定系ならその言い訳した時点で全てが終わる。
素直にあやまっとけ。

89 名前:NAME IS NULL mailto:sage [2008/05/24(土) 15:33:58 ID:???]
勘定系やってるヤツでこんなバカいたらマッハでクビになると思うが。

90 名前:NAME IS NULL mailto:sage [2008/05/24(土) 16:44:59 ID:???]
IEEE754じゃなくて十進化浮動小数点の問題だろう。
指数部が10進数としての仮数部の小数点の位置を示すタイプの型。
Truncする前に既に 1359999.999... が丸まって桁が上がってるものと思われる。





91 名前:NAME 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

よろしくお願い致します。

92 名前:NAME IS NULL mailto:sage [2008/05/24(土) 17:49:42 ID:???]
>>91
結合して ORDER BY

93 名前:NAME IS NULL mailto:sage [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でもいい

94 名前:NAME IS NULL mailto:sage [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

95 名前:NAME IS NULL mailto:sage [2008/05/24(土) 21:08:03 ID:???]
>>85
あはぁん、言われるような気がしたわ

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

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

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



96 名前:NAME IS NULL mailto:sage [2008/05/24(土) 22:15:31 ID:???]
>余った金額は1件目に
むかし、実際の事件で銀行の金利計算で、小数点第1位以下を全部自分の口座に送るという
プログラムを作った奴がいてな、
その発見されかたも面白いんだが、小数点以下まできっちり計算する強欲なおばあさんの指摘でわかったそうだ。

97 名前:NAME IS NULL mailto:sage [2008/05/24(土) 23:09:27 ID:???]
サラミうめえw

98 名前:NAME IS NULL mailto:sage [2008/05/24(土) 23:43:01 ID:???]
俺、ビーフジャーキー

99 名前:NAME IS NULL mailto:sage [2008/05/24(土) 23:45:15 ID:???]
>95
勘定系で端数がある場合は明細サマリと総額とが合わない前提で「雑損雑役」とかに仕訳すると思われる。
無理して合わせてると却って会計担当者から指摘されそうな気が

100 名前:NAME IS NULL mailto:sage [2008/05/25(日) 00:49:35 ID:???]
>>96
それ知ってる。
むかしかぁ、リアルタイムだったな確か。

金額が大きすぎて怖くなったと新聞に出てたんで、自首だと思ってたわ



101 名前:NAME IS NULL mailto:sage [2008/05/25(日) 09:05:30 ID:???]
多通貨会計なシステムやっていると端数の問題はかならず出てくるんだけど、
その端数用の勘定科目を用意してちゃんと説明しないと、
監査の時にウダウダ言われる。

ただまあ、日本円だけで動いているシステムならそれくらいちゃんとヤレって希ガス

102 名前:NAME IS NULL mailto:sage [2008/05/25(日) 11:47:54 ID:???]
>>100
あの手の事件は一回だけじゃなくて、外国とかも含めていくつかある。

103 名前:NAME IS NULL mailto:sage [2008/05/25(日) 11:51:51 ID:???]
>>102
とてつもない金額になるんだろうね。

104 名前:NAME IS NULL mailto:sage [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日となります。


105 名前:NAME IS NULL mailto:sage [2008/05/25(日) 19:06:59 ID:???]
検証なし
SELECT
DATEDIFF(expr,expr2)

106 名前:NAME IS NULL mailto:sage [2008/05/25(日) 19:25:43 ID:???]
>>104
SUM(TO_DAYS(DateColumn) - TO_DAYS(基準日))

107 名前:NAME IS NULL mailto:sage [2008/05/25(日) 19:49:54 ID:???]
検証なし

SELECT
SUM(A.DAYS)
FROM
(
SELECT
 DATEDIFF(:基準日,T.COL:) AS DAYS
TABLE T
)A

108 名前:NAME IS NULL mailto:sage [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が複数ある場合を抜き出すにはどうすればいいですか?

109 名前:NAME IS NULL mailto:sage [2008/05/26(月) 13:42:03 ID:???]
その例で言うと、実際に抜き出すとどういうデータになるの?

110 名前:NAME IS NULL mailto:sage [2008/05/26(月) 23:10:38 ID:???]
エスパー&検証なし
SELECT
T.ID1,
T.ID2
FROM
TABLE T
HAVING COUNT(ID1) > 1



111 名前:NAME IS NULL mailto:sage [2008/05/26(月) 23:25:59 ID:???]
「検証なし」の人の回答がほぼ毎回間違っている件

112 名前:NAME IS NULL mailto:sage [2008/05/26(月) 23:31:59 ID:???]
発言通りじゃないですか。

113 名前:NAME IS NULL mailto:sage [2008/05/27(火) 02:30:55 ID:???]
>>111
しかもエスパーだから手がつけられないな
スプーン曲げます!って言ったら胴体が切断されるぜ

114 名前:NAME IS NULL mailto:sage [2008/05/27(火) 03:10:33 ID:???]
>>110
GROUP BY ...
無理に書かなくてもいいんじゃ?

115 名前:NAME IS NULL mailto:sage [2008/05/27(火) 10:38:49 ID:???]
質問者のあいまいなところを無理やり解釈したところがエスパーなんだろうけど
答え出ないから質問者の意図した通りかも検証できないなw

116 名前:91 [2008/05/27(火) 11:33:41 ID:98WRggUu]
>>92,93,94
ありがとう!!!

117 名前:NAME 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 '%検索文字列%'
;

神様ご教示お願いします。


118 名前:NAME IS NULL mailto:sage [2008/05/27(火) 17:37:58 ID:???]
文字コードの設定どうなってる?

119 名前:NAME 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 '%ほげ%' で検索している処理はうまく動いているので
文字コードは大丈夫なんじゃないかと。 後だし情報失敬。

120 名前:NAME IS NULL mailto:sage [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 '%検索文字列%')
だけの話だと思うが、何故にサブクエリ…



121 名前:NAME IS NULL mailto:sage [2008/05/27(火) 18:49:19 ID:???]
select * from tableB where A_ID_copy in (select A_ID from tableA where name_v1 like '%検索文字列%')
むしろこうするけどな。


122 名前:NAME IS NULL mailto:sage [2008/05/27(火) 20:07:39 ID:???]
>>121
コスト意識しようぜ

123 名前:NAME IS NULL [2008/05/27(火) 21:07:58 ID:+iz1hIp5]
>>120-122
ありがとうございます。
明日会社に着き次第試してみます。


124 名前:NAME IS NULL mailto:sage [2008/05/27(火) 21:18:37 ID:???]
>>122
え?>>120>>121はlikeで複数レコードにマッチした場合の挙動違うよ。
distinctつけないと同じにはならないし、求める結果はdistinct付きのほうでしょ?
そうするって事はソートのコストがかかるよね?

125 名前:NAME IS NULL mailto:sage [2008/05/27(火) 21:32:50 ID:???]
と思ったが、Bの内容も抽出したいのね。俺がバカでした。

126 名前:NAME IS NULL mailto:sage [2008/05/27(火) 21:33:56 ID:???]
Aだし。吊ってくるorz

127 名前:NAME IS NULL mailto:sage [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
のほうがさらに速いかもしれん。(変わらんかもしれん。)

128 名前:123 mailto:sage [2008/05/28(水) 13:48:53 ID:???]
試してみました。
どれも何とか使えそうです。
今回は>>120のを改変して使わせていただきます。

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

本当に助かりました。
ありがとうございます。

129 名前:NAME IS NULL mailto:sage [2008/05/28(水) 15:02:12 ID:???]
>>128
Aの複数レコードにマッチするような検索してみるとどうなる?
%だけでもいいけど。

130 名前:NAME IS NULL mailto:sage [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




131 名前:NAME IS NULL mailto:sage [2008/05/28(水) 19:40:05 ID:???]
>>130
>>4

132 名前:NAME IS NULL mailto:sage [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書きすぎ。

133 名前:NAME IS NULL mailto:sage [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


134 名前:NAME IS NULL mailto:sage [2008/05/28(水) 23:12:13 ID:???]
検証ありでも間違っている件

135 名前:NAME IS NULL mailto:sage [2008/05/29(木) 00:46:09 ID:???]
あってんじゃね?

136 名前:NAME IS NULL mailto:sage [2008/05/29(木) 00:56:27 ID:???]
ヒント:6

137 名前:NAME IS NULL mailto:sage [2008/06/01(日) 00:12:33 ID:???]
上半期でも下半期でもない6月になりましたよ。

138 名前:NAME IS NULL mailto:sage [2008/06/01(日) 00:17:00 ID:???]
6月のことはなかったことに

139 名前:NAME IS NULL mailto:sage [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です。よろしくお願い致します。

140 名前:NAME IS NULL mailto:sage [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でした



141 名前:NAME IS NULL mailto:sage [2008/06/01(日) 16:15:15 ID:???]
>>139
case

142 名前:NAME IS NULL mailto:sage [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

143 名前:NAME IS NULL mailto:sage [2008/06/01(日) 16:56:03 ID:???]
>>142
nullじゃなくて「0」。

case T1.OLD_ID when '0' then '' else T2.NAME


144 名前:NAME IS NULL mailto:sage [2008/06/01(日) 17:00:34 ID:???]
>>142
> MySQLは使ったことが無い。

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

JOIN が必要かどうか >>139 をちゃんと読み直すように。

145 名前:NAME IS NULL mailto:sage [2008/06/01(日) 17:04:09 ID:???]
JOIN は必要だろ?

146 名前:NAME IS NULL mailto:sage [2008/06/01(日) 17:34:45 ID:???]
JOINは要るな。つーかこういうケースは>>142で十分じゃね?
何かの間違いでIDが0のレコードが入らない限りは


147 名前:>>145 mailto:sage [2008/06/01(日) 17:41:15 ID:???]
>>142, >>145-146
ああすまん、全然勘違いしてた。m(_._)m

148 名前:>>144 mailto:sage [2008/06/01(日) 17:43:02 ID:???]
名前欄間違ってるし... orz
>>145>>144

149 名前:NAME IS NULL mailto:sage [2008/06/01(日) 18:56:37 ID:???]
>>141-148
>>142さんのSQL文で動きました
どうもありがとうございました

150 名前:NAME IS NULL mailto:sage [2008/06/01(日) 20:24:16 ID:???]
>>144



151 名前:NAME IS NULL mailto:sage [2008/06/01(日) 21:07:03 ID:???]
アッー!

152 名前:NAME IS NULL mailto:sage [2008/06/03(火) 19:41:01 ID:???]
1から研修中の者です。

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

主キーとGROUP化との関連なんてあるんですか?
盗み聞いたもので、情報も少ない上、先輩にも聞けなくて困ってます。

153 名前:NAME IS NULL mailto:sage [2008/06/03(火) 19:49:45 ID:???]
>>152
予想されることはいくつかあるが、ここで聞くには情報不足。
その先輩とやらに確認して来い。

154 名前:152 mailto:sage [2008/06/03(火) 19:56:48 ID:???]
>>153
そこを何とか・・・。
ヒントとか、キーワードだけでいいんで、お願いします・・・。
先輩と言っても、完全な自社の人じゃなくて、
ちょっと聞きにくすぎます・・・。

155 名前:NAME IS NULL mailto:sage [2008/06/03(火) 20:24:29 ID:???]
>>152
情報が少ないんでしょ?で、こっちは研修内容すら知らないわけで、
>>152よりも情報が少ない状態だ。
それでなにをどうすればいいんだ?
SUMをかけるか否かという議論に対して、どちらでも結果は同じって
意見が出るような元の状態が把握できない。

156 名前:152 [2008/06/03(火) 20:45:08 ID:jK/ipXPe]
ですよね・・・すみません。
お時間とらせてしまって申し訳ないです。
ありがとうございました。

157 名前:NAME IS NULL mailto:sage [2008/06/03(火) 20:50:59 ID:???]
GroupByに入れても入れなくてもSumに影響はない→一意に特定する為のキーではない
GroupByは全表走査されるからindexがない(と思われる)ものは入れたくない


158 名前:NAME IS NULL mailto:sage [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で日時の表記が違う上に結合が出来なくて困ってます。
なぜ結合が出来ないかというと、それもまた同じ理由で時間まで表記されているものとそうでないものがあるからです。
どうぞご教授ください。

159 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:08:12 ID:???]
>>158
日付が文字列で入ってるってこと?
to_dateで変換して結合できないかな。

160 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:08:55 ID:???]
必要な部分だけ切り取る or 付け加える



161 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:27:09 ID:???]
>>159
date型なんですが、どうやらあとから追加したものらしく昔の記録は日付までしか入ってないんですよね。
それが理由で結合できないっぽいです。

>>160
そのやり方がわからなくて_| ̄|○
TRUNCを使うとか……

162 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:31:20 ID:???]
左から8桁 substring で切り取って、TO_DATE してでOKだろ?


163 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:40:10 ID:???]
>>161
平日だけ抽出したベタのアクセスログが欲しいのか
平日だけ抽出してから何らかの集計をするのか。

前者なら両方to_charでYY/MM/DDとしてからJOINするしかないような
気がするけど、後者なら日ごとに一旦集計してからJOINすれば速いかも。

164 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:40:58 ID:???]
Oracleにdate_truncって無いのかな?
date_trunc('day',表1.アクセス日時) = date_trunc('day',表2.休日)
なんで平日だけ抽出するのに休日のカラムと結合するのかは知らんが。

165 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:47:11 ID:???]
>>162
メモった。

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

>>164
休日しかないからです_| ̄|○

166 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:47:47 ID:???]
>>164
休日マスタと外部結合して、休日じゃないなら平日ってことかと。
祝祭日とか、組織固有の休日とかあるし。

167 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:48:54 ID:???]
結合というか、not in (select ...) でいいな。

168 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:54:07 ID:???]
not inなんか使うSEとかPGとは仕事したくない

169 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:56:16 ID:???]
>>168
なんで?

170 名前:NAME IS NULL mailto:sage [2008/06/03(火) 22:59:05 ID:???]
>>166
Exactly

>>167
出来ればそうしたいんです(´・ω・`)



171 名前:NAME IS NULL mailto:sage [2008/06/03(火) 23:08:27 ID:???]
>>168
俺も気になる。なんで?

172 名前:NAME IS NULL mailto:sage [2008/06/03(火) 23:12:44 ID:???]
where not exists (
select * from 休日
where 休日の日付 = to_date(to_char(アクセス日時, 'YY/MM/DD'), 'YY/MM/DD')
)

とかは?

173 名前:NAME IS NULL mailto:sage [2008/06/03(火) 23:29:33 ID:???]
not in とかパフォーマンスは少し考えれ

174 名前:NAME IS NULL mailto:sage [2008/06/03(火) 23:36:08 ID:???]
>>173
それじゃ、今回のケースはどうすんの?

175 名前:NAME IS NULL mailto:sage [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.休日 にインデックスを張ってればいい。

176 名前:NAME IS NULL mailto:sage [2008/06/04(水) 00:01:19 ID:???]
>>174
not inはほとんどの場合(NULLを考慮する必要がない場合)、
not existsに書き換え可能。
そしてほとんどの場合not existsのほうが速い。

最近のオプティマイザは賢いから速度は変わらない場合もあるけど
まあひとつのセオリーだし。

177 名前:175 mailto:sage [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型に変換する関数インデックスをはっとく。


178 名前:172 mailto:sage [2008/06/04(水) 00:23:15 ID:???]
>>177
ORACLEってDATE型に時分秒はいってるんでないの?
んで、date_truncもないっぽいのでto_date(to_char())としたんだけど。。
勘違いも甚だしかったかしらorz

179 名前:NAME IS NULL mailto:sage [2008/06/04(水) 00:41:39 ID:???]
Oracle の DATE 型には時分秒が入る。
date_trunc はないけど、trunc で時分秒を切り捨てられる。

180 名前:175 mailto:sage [2008/06/04(水) 00:46:57 ID:???]
>>178
いや、俺もOracle使いじゃないので...。

>>179
DATE型に時分秒が入るとなると表2.休日もtruncしておいた方が良さそうだな。



181 名前:NAME IS NULL mailto:sage [2008/06/04(水) 01:55:00 ID:???]
>>179
なる。truncってのがあるのね。
それ使ってやるのがらくぽ。

182 名前:NAME IS NULL mailto:sage [2008/06/04(水) 13:56:16 ID:???]
158です。
177さんのやり方でできました。
みなさんありがとうございます。

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


\(^o^)/

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

当時がどうだったかを出すのはよくあることだね。履歴もってる?
無いなら無理ぽいかなー

184 名前:NAME IS NULL mailto:sage [2008/06/04(水) 23:39:00 ID:???]
履歴ないと無理だろ

185 名前:NAME 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



186 名前:NAME IS NULL mailto:sage [2008/06/05(木) 16:12:01 ID:???]
>>185
その2列をキーにすればいいだけかと

187 名前:NAME IS NULL mailto:sage [2008/06/05(木) 16:25:08 ID:???]
>>186
ほんとだ!できた!
ありがとうごじゃいます。
知らなかったです。。

188 名前:NAME IS NULL [2008/06/05(木) 16:25:31 ID:0y2BUk44]
AUTO_INCREMENTでIDを自動挿入しています。
ここで質問なんですが、あるタプルをdeleteしたらそこの番号が空白になりますよね?
一覧表示したときにIDも表示してると歯抜けになって格好悪いのですが、
IDを詰めることはできませんか?
それとも気にするべきではありませんか?

189 名前:NAME IS NULL mailto:sage [2008/06/05(木) 17:41:05 ID:???]
>>188
気にするべきではありません

空き番号を管理したいなら削除した空き番号を管理するテーブルが必要になる。
そういった種類のIDを管理したいなら独自に番号管理のための仕掛けを持つべきで、
オートナンバーを使うべきではない。

190 名前:NAME IS NULL [2008/06/05(木) 18:34:45 ID:xXH7eX/Q]
だね。
言い換えると、AUTO_INCREMENTは行削除された事を残す仕組みでもある。




191 名前:NAME IS NULL mailto:sage [2008/06/05(木) 20:08:57 ID:???]
>>188
抽出時に連番がほしいなら連番が出るようなクエリを書けばいいと思う

192 名前:NAME IS NULL mailto:sage [2008/06/06(金) 11:15:54 ID:???]
oracle使ってます。


データの取得をbetweenなどを使って手動でやっていたのですが、先月分を自動的に取得できるようにしろといわれました。
where句の中でどうすればいいか困っています。
ご教授よろしくお願いします。

193 名前:NAME IS NULL mailto:sage [2008/06/06(金) 12:00:59 ID:???]
>>192
WHERE to_char(日時, 'YY/MM') = to_char(now(),'YY/MM');

194 名前:NAME IS NULL mailto:sage [2008/06/06(金) 12:04:40 ID:???]
また違った、先月分だったな...orz
WHERE to_char(日時, 'YY/MM') = to_char(now()-interval'1 month','YY/MM');
Oracle使いじゃないので書式は違うかも。

195 名前:NAME IS NULL mailto:sage [2008/06/06(金) 13:44:30 ID:???]
>>193-194
ありがとうございましたー。
いいヒントになって助かりました。

196 名前:NAME IS NULL mailto:sage [2008/06/06(金) 16:27:34 ID:???]
上の人に便乗して。
オラクル使ってます。

毎週月曜に実行するSQLがあるとして、自動的に先週分のデータを取得するにはどうすればよろしいでしょうか?
to_charを使ってやりたいのですが予約語がわからず_| ̄|〇

197 名前:NAME IS NULL mailto:sage [2008/06/06(金) 16:30:26 ID:???]
予約語がわからないってヘルプぐらい読めよ・・・

198 名前:NAME IS NULL mailto:sage [2008/06/06(金) 16:40:35 ID:???]
>>196
思いつき、年をまたぐ週に難あり。
WHERE EXTRACT(week FROM 日時) = EXTRACT(week FROM now()-interval'1 week');
OracleにEXTRACTが無かったらdate_part()を試してみて。

199 名前:198 mailto:sage [2008/06/06(金) 16:49:58 ID:???]
疑問と老婆心
date_trunc()があれば年をまたいでいても問題ないのだけど、
WHERE date_trunc('week' , 日時) = date_trunc('week' , now()-interval'1 week');
Oracleのtruncって週単位の切り捨ては出来ないのだろうか?

200 名前:NAME IS NULL mailto:sage [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')



201 名前:NAME IS NULL mailto:sage [2008/06/06(金) 23:02:10 ID:???]
ごめんね、oracleほとんどしらないから、ごめんね

202 名前:NAME IS NULL mailto:sage [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つ持つ人がいる、また、会社や役職で検索するためです

質問が不慣れなため、前提条件など足りないかもしれませんが、
指摘して頂ければ説明させて頂きますのでよろしくお願いします

203 名前:NAME IS NULL mailto:sage [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使いでもないので、参考程度に。

204 名前:NAME IS NULL mailto:sage [2008/06/07(土) 19:50:10 ID:???]
>>203
ありがとうございます!
試してみてお返事しますんで、時間下さい

205 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:06:05 ID:???]
>>202
「列」が同じやつ、例えば
 所属ID 所属部署 順序 列
 11 ○商事 1 1
 11 ○課 2 1
は連結して「役職1列目」に表示するんだよな?

同じ「列」には最大2つ、とか決まっていればできるけど
決まっていなければ無理じゃね?

206 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:08:53 ID:???]
役職ごとに最大4件のレコードが役職テーブルにある、ってことでいいんかな。
役職を5つ持つ人については、5件のレコードを結果として出していいの?

207 名前:NAME IS NULL mailto:sage [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です

よろしくお願いします


208 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:26:01 ID:???]
その説明でまったくわからなくなった・・・

複数の役職を持つサンプルデータだしてよ。

209 名前:NAME IS NULL mailto:sage [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,にエラー文が表示され”宣言が必要です”とでます。
いろいろいじってはみたのですが、わかりません。
どのようにして解決したらよいでしょうか?
分かる方いましたら、よろしくお願いします。





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

と、いうカンジになります
すいません、役職という言葉が分かりにくくさせていました
役職テーブルは所属と役職を合わせたものと言ったらわかってもらえますか

212 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:41:08 ID:???]
>>211
ほげ商事総務部長 山田太郎
ほげ商事人事部長 山田太郎

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

>>210
スレ違い。VBスレへGo


213 名前:NAME IS NULL mailto:sage [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'
;

214 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:43:54 ID:???]
>>209
そうなんです、ドシロウトなもんでデータベースを作る時には正規化ということを
しないといけないという観念だけで自分なりに正規化したつもりでした

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

もしよろしければ、テーブル構成などもご指導いただけるとありがたいです
その場合スレ違いでしたら移動しますので誘導していただけると有難いです

215 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:45:33 ID:???]
>>213
それだと無理っぽい気が。

個人テーブルと所属テーブルは 1:1で JOIN して、
役職テーブルからはサブクエリを使うしかないんじゃね?

216 名前:NAME IS NULL mailto:sage [2008/06/07(土) 20:47:23 ID:???]
>>214
 1&2&3 4 5

 1 2 3&4&5

は、どういう条件で区別すんの? おれなら、1 2 3 4 5 で取得しておいて、
クライアントアプリなりで結合するな。

217 名前:213 mailto:sage [2008/06/07(土) 20:51:10 ID:???]
全然ダメじゃん。。。
>>213は忘れてくれ。

218 名前:213 mailto:sage [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'
;

かっこ悪。。。

219 名前:202 mailto:sage [2008/06/07(土) 21:05:53 ID:???]
>>218
ありがとうございます

case when が使えなさそうなので、iifに置き換えて試してました
>>213ダメでしたか、何度もすいません、試してみますのでお待ちください

220 名前:NAME IS NULL mailto:sage [2008/06/07(土) 21:12:27 ID:???]
>>214
テーブル構造はデータの意味のみで考え、
印刷レイアウトはDBの外で考えるべき。
同時に考えようとしているから変なことになっちゃうんだな。



221 名前:202 mailto:sage [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)'の構文エラー:演算子がありません。」というエラーになります

私の分かる範囲では悪いところが無さそうなんですが、どこか悪いところがあるんでしょうか?
もう少し色々試行錯誤してみますのでお待ちください

222 名前:NAME IS NULL mailto:sage [2008/06/07(土) 21:13:21 ID:???]
>>221
単純に Access でサブクエリが使えないだけとか。

223 名前:213 mailto:sage [2008/06/07(土) 21:15:20 ID:???]
>>221
文字列連結が「&」じゃないのかも。

224 名前:NAME IS NULL mailto:sage [2008/06/07(土) 21:16:36 ID:???]
別名指定に As が必要だったっけ?

225 名前:202 mailto:sage [2008/06/07(土) 21:19:29 ID:???]
>>222
えっ、そうだとしたらヤバいですね、調べてみます

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

>>224
別名指定も As は省略可能なハズですが、調べてみます


226 名前:NAME IS NULL mailto:sage [2008/06/07(土) 21:32:19 ID:???]
>>224
テーブルの別名指定の As は省略可能のようですが、
列名の別名指定の As は省略できないようです

もうちょっと試してみます

227 名前:NAME IS NULL mailto:sage [2008/06/07(土) 21:37:29 ID:???]
>>222
SELECT *
FROM 個人テーブル
WHERE 氏名 = (SELECT 氏名 FROM 個人テーブル WHERE 個人ID = 3);

は、通ったんですが、これが通ったからといってサブクエリが使えるという保証にはならないでしょうか?
この辺はいまだによく分かっていません
お分かりの方、助言よろしくお願いします

228 名前:202 mailto:sage [2008/06/07(土) 21:48:36 ID:???]
>>218
ちょっと私の技量では検証に時間がかかりそうなのでしばらく時間を下さい
結果は必ず報告しますので、お世話になった皆さんありがとうございました

229 名前:202 mailto:sage [2008/06/07(土) 21:57:13 ID:???]
>>209
ありゃ、連結する場所の条件を勘違いしてたか、スマソ。

他の人も言ってるけど、役職テーブルを設計し直すか、
クライアント側で連結した方が良さそうだよね。

230 名前:229=203 mailto:sage [2008/06/07(土) 21:58:06 ID:???]
↑レス番まで間違えた。




231 名前:202 mailto:sage [2008/06/07(土) 22:05:14 ID:???]
>>229
データベースはホントにド素人なのですが、こういう場合は役職テーブルに
役職1列目、役職2列目、役職3列目を持ってしまうモノなのでしょうか?

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

このような場合はどのようなテーブル構成にすればよいのでしょうか?

232 名前:NAME IS NULL mailto:sage [2008/06/07(土) 22:11:02 ID:???]
>>231
組織と役職は分けるべきだと思われ

233 名前:NAME IS NULL mailto:sage [2008/06/07(土) 22:11:16 ID:???]
>>231
 個人テーブル(個人ID, 氏名など)
 組織テーブル(組織ID, 組織名, 上位組織ID)
 所属テーブル(個人ID, 組織ID, 役職など)
ぐらいだとテーブル構造としてはきれいだと思う。
再帰クエリ書かなきゃいけなくなったりするからちょっと大変だけど。

234 名前:NAME IS NULL mailto:sage [2008/06/07(土) 22:25:48 ID:???]
>>232
ありがとうございます
すいません、例には書いていませんでしたが、親会社と子会社の
関係も内包したかったためにこんな形になってしまいました。
どっちにしても、作りが悪いんですね

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

こうして質問させて頂いてよく分かったのは、何にしても自分のSQLを書く
技量が決定的に不足していることに尽きると思います
自分なりに少しずつ勉強しているつもりですが、
もう一度みっちり基礎から勉強しないとダメなようです
いきなり身の丈に合わないモノを作ろうとしていたようです
みなさん、ご助言ありがとうございました

235 名前:NAME IS NULL mailto:sage [2008/06/07(土) 22:31:51 ID:???]
accessで再帰はかけんだろが

236 名前:NAME IS NULL mailto:sage [2008/06/07(土) 23:24:11 ID:???]
ちゃんとした要求を出せばちゃんとした設計を誰かがしてくれると思う。
列の定義があいまいでどうしようもない。
おそらく分ける必要がないのに、分けることが前提で書き込んでいるからおかしくなる。

237 名前:NAME IS NULL mailto:sage [2008/06/07(土) 23:25:23 ID:???]
Access ならどうせそんなに巨大な処理はしないだろうから、
プログラム側で再帰の処理すればいいと思うんだが。

238 名前:NAME IS NULL mailto:sage [2008/06/08(日) 00:25:53 ID:???]
再帰クエリはいらなくね?
相関クエリは使うかもだが。

239 名前:NAME IS NULL mailto:sage [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


240 名前:NAME IS NULL mailto:sage [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
とサブクエリにしちゃえば。



241 名前:NAME IS NULL mailto:sage [2008/06/08(日) 02:19:18 ID:???]
>>240
HAVINGでcount()を使うのですね、勉強になりました
(key,val)はユニークなのでサブクエリを使う必要もなかったです

ありがとうございました

242 名前:NAME IS NULL mailto:sage [2008/06/08(日) 02:51:40 ID:???]
ぶっちゃけ val IN(v1,v2・・・はいらないんじゃ?
ユニークなんだから数だけ数えればOK

243 名前:NAME 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 という結果が欲しいのです。

244 名前:NAME IS NULL mailto:sage [2008/06/08(日) 03:37:55 ID:???]
>>242
絞らないとval にv2を持つもの(k1のみ)なんかの場合はまずいっしょ。

>>243
>>4

245 名前:NAME IS NULL mailto:sage [2008/06/08(日) 03:39:37 ID:???]
っと>>4の場合とちょと違うか、んで俺はパス。スマソ

246 名前:243 mailto:sage [2008/06/08(日) 03:55:26 ID:???]
>>244-245
ご回答ありがとうございます。
しかし、ご指摘の通り、>>4と少し違います。

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

もっとSQLの勉強しなくちゃなぁ。
なお、引き続きご回答および何らかのヒントをお待ちしております。

247 名前:NAME IS NULL mailto:sage [2008/06/08(日) 04:08:24 ID:???]
>>246
カラム数が自動で増えるのは_。
連結する手もあるが、文字列連結集約関数が無いと現実的に_。
MySQLには文字列を連結"||"の代わりにconcat関数があるみたいだけど、集約関数じゃないからやっぱり_ぽ。
-- 試しにSELECT concat(var) FROM Table GROUP BY name ってやって味噌。
explode(',',var)みたいな集約関数を自作すれば桶。


248 名前:NAME IS NULL mailto:sage [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で実行できるかどうかは知らない。すまん。


249 名前:NAME IS NULL mailto:sage [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;

250 名前:NAME IS NULL mailto:sage [2008/06/08(日) 07:39:56 ID:???]
>>234
MS Access 使うということは、結果を「レポート」で出力できるんでしょ?
なら、連結とかは SQL ではなくて「レポート」で VB 使えば簡単だと思う。



251 名前:NAME IS NULL mailto:sage [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副問い合わせ不可です。
よろしくお願いします。

252 名前:NAME IS NULL mailto:sage [2008/06/08(日) 22:43:22 ID:???]
- どこにどんだけ時間がかかっているのか?
- インデックスをどう作ってあるのか?

それを書いて出直せ


253 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:02:31 ID:???]
>>251
AでWhere kind = 表示する表の種別
をしないってことは表示したい表が最高得点じゃない時は出したくないってこと?

254 名前:202 mailto:sage [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以上に大事なモノを得られたようです

255 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:17:04 ID:???]
>>251
テンポラリテーブル同士のJOINが遅いんだろ。

Bがテンポラリテーブルと元テーブルのJOINになるようにしてみたら?

256 名前:NAME IS NULL mailto:sage [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

257 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:19:05 ID:???]
>>256
実行時間がわからずに、どうやって効果が出たかを判断するんだよハゲ

258 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:19:30 ID:???]
C.userId LIKE B.userId

C.userId = B.userId
にしてみ

259 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:20:46 ID:???]
サブクエリを使ってはいけない理由もしりたい

260 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:27:28 ID:???]
>>256
どういうインデックスがあるかも分からずにチューニングするのはほとんど不可能。

>>259
MySQL4.0だからと思われ。



261 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:28:48 ID:???]
>>255>>258 っぽいな。今のところ。

262 名前:251 mailto:sage [2008/06/08(日) 23:40:48 ID:???]
インデックス調べてみたんですが、ただ単に
ALTER TABLE MYTABLE ADD INDEX (userId)
とすればよいのでしょうか?
やってみたんですが、やはり変わりませんでした。
一応scoreとkindも作りましたが…
時間は体感10秒くらいです。

263 名前:251 mailto:sage [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⇒「=」の理由がなぜか分かっていませんが(^^;

264 名前:NAME IS NULL mailto:sage [2008/06/08(日) 23:53:11 ID:???]
>#LIKE⇒「=」の理由がなぜか分かっていませんが(^^;

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

相当重症レベルだから。

265 名前:NAME IS NULL mailto:sage [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 上に
表示するデータだけを抽出とか考えましたが、スマートじゃないし、システムリソースを無駄に喰ってしまいます。
何か、いい方法はないでしょうか?




266 名前:NAME IS NULL mailto:sage [2008/06/09(月) 00:35:18 ID:???]
俺は LIMIT かけるときは SQL_CALC_FOUND_ROWS を付けて検索して
直後に SELECT FOUND_ROWS() で総件数を取ってる

267 名前:NAME IS NULL mailto:sage [2008/06/09(月) 00:45:14 ID:???]
全件とってから表示だけを50件にすればいいんじゃないの?


268 名前:NAME IS NULL mailto:sage [2008/06/09(月) 01:30:42 ID:???]
>>267
Google みたいに 約509,000 件中 とかなると、結構リソース食われそうだが。

(ちなみに、これは SQL_CALC_FOUND_ROWS の検索結果ね。)

269 名前:NAME IS NULL mailto:sage [2008/06/09(月) 02:40:06 ID:???]
まあ件数先にもってくるのがいいかな。
でもLIMIT使うなら、ORDER BY とセットと考えたほうがいい。

270 名前:NAME IS NULL mailto:sage [2008/06/09(月) 08:29:47 ID:???]
>>266
まさにこれです。ありがとう。

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()




271 名前:202 mailto:sage [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を書けるようになりたいと思います

272 名前:NAME IS NULL mailto:sage [2008/06/09(月) 18:20:06 ID:???]
>>270
それってMySQLでよかったと思える機能の一つだよなー
Postgresだとどうするんだろう?

273 名前:NAME IS NULL mailto:sage [2008/06/09(月) 19:45:04 ID:???]
>>268
googleはmysqlなんて使ってない。

ソフトの規模にあった最適なdbを選択するべき。

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

275 名前:NAME IS NULL mailto:sage [2008/06/09(月) 20:26:48 ID:???]
>>273
Google は単なる例。

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

# >>273 は応用力 "0" だな。

276 名前:NAME IS NULL mailto:sage [2008/06/09(月) 21:25:55 ID:???]
TRUNCATE

277 名前:NAME IS NULL mailto:sage [2008/06/10(火) 00:04:43 ID:???]
例の使い方を間違えてて偉そうにww

278 名前:NAME IS NULL mailto:sage [2008/06/10(火) 00:51:55 ID:???]
そもそもサーバ20万台とかそういう次元の世界と比較してどうすんのさ?

279 名前:NAME IS NULL mailto:sage [2008/06/10(火) 08:21:39 ID:???]
お前らスレ違いだから他所行ってやれ。


280 名前:NAME IS NULL mailto:sage [2008/06/10(火) 13:25:59 ID:???]
すんません教えてください
mdbなんですが、SQLでbinaryデータのinsertの記述を教えてください><



281 名前:NAME IS NULL mailto:sage [2008/06/10(火) 14:15:04 ID:???]
>>280
まずググれよ。


282 名前:NAME IS NULL mailto:sage [2008/06/10(火) 14:51:55 ID:???]
>>281
知らないならレスしないで下さい。うざいだけです。

283 名前:NAME IS NULL mailto:sage [2008/06/10(火) 16:38:44 ID:???]
これは…何と言うか…スルー推奨w

284 名前:NAME IS NULL mailto:sage [2008/06/10(火) 17:03:49 ID:???]
>>283
知らないならレスしないで下さい。うざいだけです

285 名前:NAME IS NULL mailto:sage [2008/06/10(火) 17:04:23 ID:???]
こんなスレにまで飛び火してんのかw

286 名前:NAME IS NULL mailto:sage [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´

287 名前:NAME IS NULL mailto:sage [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´

288 名前:NAME IS NULL mailto:sage [2008/06/10(火) 18:22:19 ID:???]
>>285-287
知らないならレスしないで下さい。うざいだけです

289 名前:NAME IS NULL mailto:sage [2008/06/10(火) 19:22:13 ID:???]
>>282,284,288
これにレスしないで下さい。うざいだです。

290 名前:NAME IS NULL mailto:sage [2008/06/10(火) 21:36:10 ID:???]
AppendChunk使えよ



291 名前:NAME IS NULL mailto:sage [2008/06/10(火) 22:26:27 ID:???]
>>277-278
Google だけに反応してるバカは引っ込んでな。

292 名前:NAME 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 適当な終点日

こんな感じです。

293 名前:NAME IS NULL mailto:sage [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´ 

294 名前:NAME IS NULL mailto:sage [2008/06/11(水) 20:35:06 ID:???]
>>292
日付を数値に変換できるなら、割り算で求められるだろ

295 名前:NAME IS NULL mailto:sage [2008/06/11(水) 21:11:35 ID:???]
>>292
それ例えば、3日おきのレコードを 100レコード一気に生成したいとか言ってるの?

ストアドか、再帰を使わないと無理じゃね?

296 名前:NAME IS NULL mailto:sage [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 処理を行いたい。

297 名前:296 mailto:sage [2008/06/11(水) 22:40:05 ID:???]
う〜ん…これって、SQL でやるには無理があるな。
ストアドかもしくは、ホスト側のプログラミング言語で行った方がいいような気がしてきた。

298 名前:NAME IS NULL mailto:sage [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 〜)


299 名前:296 mailto:sage [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 〜)
なるほど。こういうのがありましたか。ありがとうです。

300 名前:NAME IS NULL mailto:sage [2008/06/11(水) 22:59:11 ID:???]
ほんとに関係なくて申し訳ないんだけど、
シングルクォートじゃ無くてバッククォートを使ってるのってなんで?
なんか意図があるのか、単に適当なのかがちょっと気になって。。。



301 名前:NAME IS NULL mailto:sage [2008/06/11(水) 23:04:47 ID:???]
おまえの 。。。 ←この方が気になるわ

302 名前:NAME IS NULL mailto:sage [2008/06/11(水) 23:33:04 ID:???]
         すまんかった
            ↓
すまんかった→ >>301 ←すまんかった
            ↑
         すまんかった

303 名前:NAME IS NULL mailto:sage [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 の代わりって何になるの?

304 名前:292 mailto:sage [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 を作成してから集計に利用しようかと。

もっとうまい方法ありましたらご教授願います。

305 名前:296 mailto:sage [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

306 名前:NAME IS NULL mailto:sage [2008/06/11(水) 23:55:09 ID:???]
>>304
2008-06-02 の立場は?

307 名前:NAME IS NULL mailto:sage [2008/06/11(水) 23:57:56 ID:???]
>>305
dual ってのは、Oracle で使われる疑似的なテーブル。

select '結果' from dual

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

select '結果'

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

あとよ、解らないとか開き直るなよ。そんなんだと、誰も何も
教えてくれなくなるぞ。

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

309 名前:NAME IS NULL mailto:sage [2008/06/12(木) 00:17:20 ID:???]
>>308
だから説明してんだろうが。

少しは調べるなりしろよハゲ

310 名前:292 mailto:sage [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 <





311 名前:NAME IS NULL mailto:sage [2008/06/12(木) 03:08:53 ID:???]
>>308
あいたた。

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

>>310
週単位の集計ならtrunc使えば一時テーブル無しで実現できるけど、
3日ごとがmustならちょっと思いつかないです。

312 名前:NAME IS NULL mailto:sage [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してやれば出来なくもない。

313 名前:312 mailto:sage [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()と外部結合すれば一発で出るんじゃない。

314 名前:292 mailto:sage [2008/06/12(木) 11:13:51 ID:???]
>>312
PostgreSQL の generate_series() は僕も使いたいと思ってました。
count_update_at は 0 でも出したので別表は必須かなぁと。

SQL だけでは難しそうなことがわかっただけでも助かります。
ストアドの方向で頑張ってみます。


315 名前:NAME 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




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

どなたかご教授お願いします

316 名前:NAME IS NULL mailto:sage [2008/06/12(木) 12:56:33 ID:???]
NGExのAA判定であぼ〜ん喰らってるのか
妙にレス番が飛んでると思ったら…

317 名前:NAME IS NULL mailto:sage [2008/06/12(木) 15:29:52 ID:???]
>>315
素直に ID, 人名, 科目名,得点 にして
1,A君,A、30
2,A君,B、50

とすればいいと思うが…。

318 名前:NAME IS NULL [2008/06/12(木) 16:14:26 ID:6xiyr5j2]
同じ構造のテーブル2つからのデータを、1つのテーブルから引っ張ったような取り方ってできないでしょうか?


319 名前:NAME IS NULL mailto:sage [2008/06/12(木) 16:22:09 ID:???]
UNIONもしくはUNION ALLで

320 名前:318 [2008/06/12(木) 16:30:01 ID:6xiyr5j2]
> 319
まさに! ありがとう!



321 名前:NAME IS NULL mailto:sage [2008/06/12(木) 21:41:49 ID:???]
>>310
欲しい結果の

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

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

SQL は存在しない行を作るのは苦手なので、アプリ側で何とかするとかできない?

322 名前:NAME IS NULL mailto:sage [2008/06/12(木) 22:21:09 ID:???]
Oracle使ってます。

いつ式を動かしても決まった期間(ex.先週月曜から日曜まで)のデータ(ex.個数)を取りたいのですが、
daysとddを使ってそれぞれ求めろといわれて困ってます。
sysdate-1だとその日の00:00:00になっちゃうし……お助けください。

323 名前:NAME IS NULL mailto:sage [2008/06/12(木) 22:24:18 ID:???]
>>322
過去ログみろハゲ

324 名前:NAME IS NULL mailto:sage [2008/06/12(木) 22:27:39 ID:???]
>>322
>>200

325 名前:NAME IS NULL mailto:sage [2008/06/13(金) 08:31:03 ID:???]
>>323 m9(^Д^)プギャーーーッ

326 名前:NAME IS NULL mailto:sage [2008/06/13(金) 10:33:53 ID:???]
>>200 もりっぱな過去ログ

327 名前:NAME 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を一行にまとめて取得することは可能ですか?

328 名前:NAME IS NULL mailto:sage [2008/06/15(日) 23:23:52 ID:???]
Bの行数が固定なら可能

329 名前:NAME IS NULL mailto:sage [2008/06/15(日) 23:24:44 ID:???]
>>327
列の数が可変な問合せはできない

330 名前:NAME IS NULL mailto:sage [2008/06/15(日) 23:39:17 ID:???]
列は固定っぽいけどな。
チョイ前にでてたけど、MySQLならgroup_concatだったけ、
他のDBならそれに類似する関数があれば可能じゃね。



331 名前:NAME IS NULL [2008/06/16(月) 00:38:14 ID:ks4mqQf9]
>>328
>>329
>>330
ありがとうございます。
Bの行数が可変だと無理っぽいんですね・・・、わかりました。


332 名前:NAME IS NULL mailto:sage [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

333 名前:NAME IS NULL mailto:sage [2008/06/16(月) 11:46:27 ID:???]
一時テーブルを作る時に既にあるテーブルのスキーマから作ること可能?

334 名前:NAME IS NULL mailto:sage [2008/06/16(月) 11:51:41 ID:???]
like使え
使えないDBがあるかどうかは知らんけど

335 名前:NAME IS NULL mailto:sage [2008/06/16(月) 22:04:06 ID:???]
>>333

select * into #hoge_A from hoge_B where 1 = 0

列名と型だけだけど。

336 名前:333 mailto:sage [2008/06/16(月) 22:19:09 ID:???]
>>335
where 1 = 0の意味が理解できてませんが、ありがとうございます。
助かります。


337 名前:NAME IS NULL mailto:sage [2008/06/16(月) 22:22:58 ID:???]
>>336
1 = 0 は常に不成立。
データは1件もコピーされずに構造だけがコピーされる。

338 名前:NAME IS NULL mailto:sage [2008/06/16(月) 22:55:52 ID:???]
>>335

それって、SQL Server固有じゃね?

339 名前:333 mailto:sage [2008/06/16(月) 23:04:04 ID:???]
なるほどー。
書き忘れてましたが今回はSQLServerなので、これでOKでした。

340 名前:NAME IS NULL mailto:sage [2008/06/17(火) 15:43:03 ID:???]
ちょっと質問なんすけど
ネットで手軽にできる方法ってないの?



341 名前:NAME IS NULL mailto:sage [2008/06/17(火) 15:51:23 ID:???]
何が?

342 名前:NAME IS NULL mailto:sage [2008/06/17(火) 15:53:16 ID:???]
自分のデータベースを向こう側に置いておけるサービスってこと

343 名前:NAME IS NULL mailto:sage [2008/06/17(火) 16:00:45 ID:???]
レンサバでデータベースを使えるとこなんていくらでもあるだろ?

344 名前:NAME IS NULL mailto:sage [2008/06/17(火) 16:23:07 ID:???]
>>342
向こう側って…
三途の川の向こうならスレ違いだぞ。


345 名前:NAME IS NULL mailto:sage [2008/06/17(火) 16:53:20 ID:???]
レンタルサーバってブログ見たく簡単にはいきませんよね?
無料でアレくらい簡単にできるのないかな、と思ってるんですが

346 名前:NAME IS NULL mailto:sage [2008/06/17(火) 17:03:50 ID:???]
DBを使おうって人ならレンタルサーバくらい簡単に扱えるだろう
なんでネット上にDBを置きたいのかもわからんが

それにそもそもスレ違い、ここはSQLスレだ

347 名前:NAME IS NULL mailto:sage [2008/06/17(火) 17:14:20 ID:???]
そうですね。スレ汚し失礼しました

348 名前:NAME IS NULL [2008/06/18(水) 19:44:21 ID:sQ0WAAAy]
SQL> @^@^@^
2 @^@^@^
3 @^@^@^


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

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

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

ちょう初心者の質問ですいません。

349 名前:NAME IS NULL mailto:sage [2008/06/18(水) 19:46:01 ID:???]
>>348
スレ違い。

ターミナルなりコンソールなりのヘルプ読め

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

上記だと
いいい 1
ううう 1
が取得結果です



351 名前:NAME IS NULL mailto:sage [2008/06/18(水) 20:22:35 ID:???]
下、なんて概念、SQL にはないから。

having sum(フラグ) = count(名前) でよさげだな。
もしくは、not in とかで。


352 名前:NAME IS NULL mailto:sage [2008/06/18(水) 22:27:17 ID:???]
味の向こう側なら貧乏スレで

353 名前:NAME IS NULL mailto:sage [2008/06/18(水) 23:36:31 ID:???]
>>351
350じゃないけどあんた賢いな
そういう使い方あったんだ

354 名前:NAME 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です。

355 名前:NAME IS NULL mailto:sage [2008/06/20(金) 11:03:27 ID:???]
>>354
インデックスの有無で変わる。
つか、なんかその順序に書かれた内容って
アバウトすぎないか?

356 名前:NAME IS NULL mailto:sage [2008/06/20(金) 19:01:08 ID:???]
トランザクションの分離レベルを知りたいんじゃないの?

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

上のマニュアルにひととおり説明は書いてあるけど
分からなければ「トランザクション 分離レベル」とかでぐぐったほうがいいかも。

357 名前:NAME IS NULL [2008/06/21(土) 22:32:23 ID:aYrRkWAw]
【本日VIP投票日ですた】●第3回全板人気トナメ●【反省会会場】
yutori.2ch.net/test/read.cgi/news4vip/1214054829/

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


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

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


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


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


まだまだ俺たちはおわれねぇ!!!!!!!!!!!!!!!!!!

358 名前:NAME IS NULL mailto:sage [2008/06/21(土) 22:49:58 ID:???]
出て行け。

359 名前:NAME IS NULL mailto:sage [2008/06/23(月) 18:57:41 ID:???]
同じDB内に4つのテーブル
tableA,tableB,tableCとtableX がございます。
いずれも構造は同じでデータだけ異なっています。

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

tableA,tableB,tableCのテーブル名が変更できない場合、
良い方法を教えて下さい。お願いしまうs!


360 名前:NAME IS NULL mailto:sage [2008/06/23(月) 19:08:48 ID:???]
読むのはともかく、tableAに書く場合はAとX両方に書きたいって事か?
単純にVIEWを作ればいいような気はするんだけど



361 名前:NAME IS NULL mailto:sage [2008/06/23(月) 19:16:16 ID:???]
書くのもXだけでOKなんです。
つまりtableA〜Cは、その名前だけ生きて、
中身は全く利用されない状態なんです。

教えて頂いた「VIEWを作る」というのを早速調べてみます!

362 名前:NAME IS NULL mailto:sage [2008/06/23(月) 20:03:36 ID:???]
>>361
シノニムが使えるならシノニムでもいい。


363 名前:NAME IS NULL mailto:sage [2008/06/23(月) 20:17:17 ID:???]
>>362
ありがとうございます!
MySQL5.0.24ですが使えるのでしょうか・・・

364 名前:NAME IS NULL mailto:sage [2008/06/23(月) 21:05:45 ID:???]
>>363
Viewにしとけwww


365 名前:NAME IS NULL mailto:sage [2008/06/23(月) 22:58:56 ID:???]
viewだと同じテーブル名にできないんじゃね?

366 名前:NAME IS NULL mailto:sage [2008/06/24(火) 05:47:15 ID:???]
>>365
要件としては、
select * from tableAが
実際はselect * from tableXで良い訳だから、
既存のtableA,tableB,tableCのデータを全て
tableXに移行した上で、
tableA,tableB,tableCをdrop、
んで、view作ればいいだろ。


367 名前:NAME IS NULL mailto:sage [2008/06/24(火) 06:37:15 ID:???]
>>366
dropとかアホじゃねえの。
そんなことしていいなんて一言もいってないし。

abcをUNIONしたVIEWにカスケード更新、削除ってできたっけ?

368 名前:NAME IS NULL mailto:sage [2008/06/24(火) 06:55:45 ID:???]
名前すら変更してはいけないテーブルを drop て …
abc が更新されないなら UNION ALL したXを create table as すればいいんだろうけど、キーが重複したりしてないのかな。

369 名前:NAME IS NULL mailto:sage [2008/06/24(火) 07:19:53 ID:???]
>>361からすると、tableA〜Cの中身をtableXに移行する必要すらなさそうな
ただSQLでtableA〜Cを使ってるから変更できないと読めるが、実際のとこどうなん?

370 名前:NAME IS NULL mailto:sage [2008/06/24(火) 08:13:13 ID:???]
俺もtableA〜Cという名前でアクセスできれば
テーブルでもビューでも良いような気がするけど。



371 名前:NAME IS NULL mailto:sage [2008/06/24(火) 08:16:58 ID:???]
要求仕様不明確ってことで

372 名前:NAME IS NULL mailto:sage [2008/06/24(火) 08:30:36 ID:???]
>>367
しちゃいかんともいってない罠。


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



つ〜ことで、>>371でFA。

373 名前:NAME IS NULL mailto:sage [2008/06/24(火) 08:32:12 ID:???]
>>372
そもそも、DBを停止できないとも言われてないから、
クライアントからの接続遮断して、
VIEW作るなりのメンテナンスすれば良いだけジャマイカ?


374 名前:NAME IS NULL mailto:sage [2008/06/24(火) 09:36:44 ID:???]
皆さんありがとうごぜいます!

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

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

ちなみにVIEWを試してみたのですが、
CREATE VIEW `tableA` AS SELECT * FROM `tableX`;
もとのtableAからデータが読み出されました・・

375 名前:NAME IS NULL mailto:sage [2008/06/24(火) 11:15:25 ID:???]
tableAを消せばVIEWから読むだろ

376 名前:NAME IS NULL mailto:sage [2008/06/24(火) 15:54:44 ID:???]
情報小出し厨の質問は荒れる。

377 名前:NAME IS NULL mailto:sage [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
);

378 名前:NAME IS NULL mailto:sage [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)
とかじゃダメなのかな?


379 名前:NAME IS NULL mailto:sage [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);

380 名前:NAME IS NULL mailto:sage [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毎の人数を表示したいときはどうすればいいですか?



381 名前:NAME IS NULL mailto:sage [2008/06/24(火) 19:11:12 ID:???]
↑ちなみにMySQLです
かなりの初心者なのでよろしくお願いします

382 名前:NAME IS NULL mailto:sage [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

383 名前:NAME IS NULL mailto:sage [2008/06/24(火) 19:35:03 ID:???]
>>380
>>382の別解
SELECT truncate(height,-1),count(truncate(height,-1)) FROM Table1 GROUP BY truncate(height,-1);

384 名前:383 mailto:sage [2008/06/24(火) 19:37:16 ID:???]
ちょっと訂正。
SELECT truncate(height,-1),count(height) FROM Table1 GROUP BY truncate(height,-1);

385 名前:NAME IS NULL mailto:sage [2008/06/24(火) 19:40:05 ID:???]
>>378
>>379
>>382
ありがとうございます、色々試してみます・・・
むずかしいですね、パフォーマンスも怪しいですし。

386 名前:NAME IS NULL mailto:sage [2008/06/24(火) 19:47:43 ID:???]
>>384
ありがとうございました

求めていた結果が出ました!
ありがとうございます。
二時間近く悩んでいたので助かりました

387 名前:NAME IS NULL mailto:sage [2008/06/24(火) 22:24:27 ID:???]
二時間w
もっと考えろよw


388 名前:NAME IS NULL mailto:sage [2008/06/25(水) 00:21:30 ID:???]
俺なら30分で2発はイケる。

389 名前:NAME IS NULL mailto:sage [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が重複して結果が返ってきて、
期待通りに結果が得られません。

390 名前:NAME IS NULL mailto:sage [2008/06/25(水) 05:52:32 ID:???]
>>389
列1でGROUP BYして、
列2のMAX取れば良いだけでは?




391 名前:NAME IS NULL mailto:sage [2008/06/25(水) 05:59:05 ID:???]
おぉ、こんな朝早くからレスありがとう。

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

できました。ありがとう

392 名前:NAME 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勉強中です・・・難しい・・助けてください

393 名前:NAME IS NULL mailto:sage [2008/06/26(木) 23:07:48 ID:???]
普通に Group By して Count() でとればいいだけじゃない?

#val なんてカラム名はやめれw

394 名前:NAME IS NULL mailto:sage [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でわけたいけど合計されてしまう

395 名前:NAME IS NULL mailto:sage [2008/06/26(木) 23:49:05 ID:???]
あたりまえだろハゲ

id もグループ化しないからそうなるんだよ

396 名前:NAME IS NULL mailto:sage [2008/06/26(木) 23:54:16 ID:???]
ハゲ言うな

397 名前:NAME IS NULL mailto:sage [2008/06/26(木) 23:55:32 ID:???]
>>395
!!!!!!
ありがとうありがとう!!!!寝られる!!!
まだハゲてないですやばいけどw

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

398 名前:NAME IS NULL mailto:sage [2008/06/27(金) 00:21:18 ID:???]
悪いけど、オマエラと違ってフサフサだよ

399 名前:NAME IS NULL mailto:sage [2008/06/27(金) 01:07:50 ID:???]
次の質問まだー?

400 名前:NAME 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を教えてください。




401 名前:NAME IS NULL mailto:sage [2008/06/27(金) 17:13:16 ID:???]
>>400
一般解はないでしょ。

歯抜けになっていないテンポラリテーブルを作って、
NOT IN / NOT EXISTS で。

402 名前:NAME IS NULL mailto:sage [2008/06/27(金) 18:04:14 ID:???]
>>400
二つの条件のうち、「重複していないキー」は「ユニークなキー」ということでSQLで論理式
による選択が可能だが、もう一つの条件の「使用していないキー」の意味がチョット記述が
不十分で解らん。000〜999が使用可能なキー値として未使用なキー値を列挙したいのか?

403 名前:NAME IS NULL mailto:sage [2008/06/27(金) 18:18:27 ID:???]
∞や小数にも対応して欲しい、と。

404 名前:NAME 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つ以上のテーブルの場合の対応もお願いします

405 名前:NAME IS NULL mailto:sage [2008/06/27(金) 20:22:37 ID:???]
>>404
結果の2行目は間違いだよな。
UNION ALL じゃなくて UNIONで桶。
同じならAでもBでもどちらでもいいじゃん。
ってどうやってみわけるん?

406 名前:NAME IS NULL mailto:sage [2008/06/27(金) 20:28:01 ID:???]
>>404
B を優先するなら、B に対して、

from A Where not in / not exitst B

の結果を Union すればいいんじゃね?

407 名前:NAME IS NULL [2008/06/27(金) 20:32:40 ID:ttER4GEw]
>>405,406
ありがとうございます

>>405
テーブル構成も全く同じではなく微妙に違いますので

408 名前:405 mailto:sage [2008/06/27(金) 20:37:21 ID:???]
スマソ、寝ぼけてた。

409 名前:NAME IS NULL mailto:sage [2008/06/28(土) 14:00:29 ID:???]
??????????????毎日新聞社による日本人女性への誹謗中傷??????????????

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

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

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

つまり日本国民は
www.vipper.net/vip552788.jpg

410 名前:NAME IS NULL mailto:sage [2008/06/28(土) 15:27:04 ID:???]
もしくはOUTER JOIN だな



411 名前:NAME IS NULL mailto:sage [2008/06/28(土) 15:40:39 ID:???]
>>410
>>404の話?
OUTER JOINでどう実現するのかkwsk

412 名前:NAME IS NULL mailto:sage [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

ではだめなん?

413 名前:NAME IS NULL mailto:sage [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;


414 名前:NAME IS NULL mailto:sage [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 なんだよ?

415 名前:NAME IS NULL mailto:sage [2008/06/28(土) 21:25:48 ID:???]
何でそんなに改行するの?

416 名前:NAME IS NULL mailto:sage [2008/06/28(土) 21:47:43 ID:???]
段落 / 文章・コード種別 で改行してるだけですが、何か?

417 名前:NAME IS NULL mailto:sage [2008/06/28(土) 21:54:29 ID:???]
(・∀・)truncate!

418 名前:NAME IS NULL mailto:sage [2008/06/29(日) 05:40:54 ID:???]
>>414
> b.DATE が null のケースを考慮する必要があるのか?
full outer join してるから
和集合をとるって話じゃないの?


419 名前:NAME IS NULL mailto:sage [2008/06/29(日) 10:51:37 ID:???]
>>418
いや、そもそも >>404 の例で DATE 列に Null はないし、
そうでなくても、>>413 の on a.DATE = b.DATE の意味は
知ってるよね?

420 名前:NAME IS NULL mailto:sage [2008/06/29(日) 11:03:56 ID:???]
>>419
>>412はINNER JOIN、>>413はFULL OUTER JOIN。
この違い分かってる?



421 名前:NAME IS NULL mailto:sage [2008/06/29(日) 12:02:37 ID:???]
なんで >>412 がでてくるのかわけわからん。

422 名前:NAME IS NULL mailto:sage [2008/06/29(日) 12:19:27 ID:???]
ん?
>>412=>>414=>>419>>413に反論してるんじゃなかったの?

まあどっちにしろ>>419はFULL OUTER JOINの意味を分かってなさそう。

423 名前:NAME IS NULL mailto:sage [2008/06/29(日) 12:42:33 ID:???]
アッ、すまん。

俺の勘違いだったわ。

424 名前:NAME IS NULL mailto:age [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 は同じデータ型です。

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

どなたか教えて下さい。宜しくお願いします。


425 名前:NAME IS NULL mailto:sage [2008/06/29(日) 18:25:59 ID:???]
>>424
だって、FROM 句に出てきてないじゃん・・・

426 名前:NAME IS NULL mailto:sage [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

427 名前:NAME IS NULL mailto:sage [2008/06/29(日) 18:26:48 ID:???]
>>424
回答としては、JOIN をしてその結果を SELECT で出す、ってことになりますね。

428 名前:NAME IS NULL mailto:age [2008/06/29(日) 19:18:30 ID:???]
>426、427様
ありがとうございます。

>425
だって、FROM 句に出てきてないじゃん・・・
→すみません。良く意味がわからないのですが・・・。
初心者すぎてすみません。

429 名前:NAME IS NULL mailto:sage [2008/06/29(日) 19:20:28 ID:???]
>>428
SQL だと、基本的に FROM 句で指定したテーブルから、列を指定するでしょ?


430 名前:NAME IS NULL mailto:age [2008/06/29(日) 21:40:08 ID:???]
>429
ということは、サブクエリのFROM句からの列は結果として指定できないということですか?
初心者の質問で大変恥ずかしいですが、ご回答を宜しくお願いします。



431 名前:NAME IS NULL mailto:sage [2008/06/29(日) 21:45:05 ID:???]
>>430
メインクエリの FROM 句にないテーブルからは、SELECT 句で指定できませんよ。
(SELECT 句で FROM まで指定する方法はありますけど)

初心者、というなら、参考書でも読んでみたらどう?

432 名前:NAME IS NULL mailto:age [2008/06/29(日) 21:54:11 ID:???]
>>431
大変恐縮です。ありがとうございました。

私の参考書には載っていない、ご回答でした。
ありがとうございました。

433 名前:NAME IS NULL mailto:sage [2008/07/01(火) 14:35:18 ID:???]
MySQLのupdate分で以下はどうすればいい?

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

これを

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

に一発変換したい。

434 名前:NAME IS NULL mailto:sage [2008/07/01(火) 14:48:00 ID:???]
「オレ4」はあるのか。もしあったら「オレ4」のままか、それとも「オマエ オレ4」になるのか。

435 名前:433 mailto:sage [2008/07/01(火) 14:49:43 ID:???]
オレ4 があれば オマエ オレ4 にしたい。
元のテーブル内の名前が「オレ」で始まるデータすべての前に、
「オマエ」をつけたい。

436 名前:NAME IS NULL mailto:sage [2008/07/01(火) 15:26:19 ID:???]
UPDATE table SET 名前 = 'オマエ ' || 名前 WHERE 名前 LIKE 'オレ%';

MySQLで動くのかは知らない。

437 名前:NAME IS NULL mailto:sage [2008/07/01(火) 15:27:04 ID:???]
update `テーブル`
set `名前` = "オマエ " + `テーブル`.`名前`
where like 名前 `オレ%`

438 名前:NAME IS NULL mailto:sage [2008/07/01(火) 15:56:43 ID:???]
MySQLってreplace使えなかったっけ?


439 名前:433 mailto:sage [2008/07/01(火) 16:01:52 ID:???]
>>436, 437

ダメでした....

>>438

Replaceは Delete−>Insertじゃ??

440 名前:NAME IS NULL mailto:sage [2008/07/01(火) 16:02:47 ID:???]
ダメってどうだめだったんだ?
ちょっとググってみたが、MySQLはANSIモード以外は|| 使えないからCONCAT 使えってあったけど。



441 名前:NAME IS NULL mailto:sage [2008/07/01(火) 16:09:16 ID:???]
また、情報小出し厨か…

442 名前:433 mailto:sage [2008/07/01(火) 16:23:52 ID:???]
>>440

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

update テーブル set 名前=concat('オマエ ',名前) where 名前 like 'オレ%'

443 名前:NAME IS NULL mailto:sage [2008/07/02(水) 00:18:13 ID:???]
それくらい自分で変換しろよw

444 名前:NAME IS NULL mailto:sage [2008/07/02(水) 02:46:04 ID:???]
まったくだな。答だけを求めて自分で何とかしようとは思わないんだな…
9割以上のヒント出てるのに。

445 名前:NAME 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があれば教えてください。



446 名前:NAME IS NULL mailto:sage [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);

こんな感じ?

447 名前:NAME IS NULL mailto:sage [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 好きなように

か。

448 名前:NAME IS NULL mailto:445 [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 が使えないようです。
惜しいです。

449 名前:NAME IS NULL mailto:sage [2008/07/02(水) 18:47:24 ID:???]
>>448
>>377に類似の質問がある。
回答は>>379とか>>382にあるけど、
>>445の前者みたいに素直に2文に分けたほうがいいと思う。
パフォーマンス面から言っても保守性から言っても。

450 名前:NAME IS NULL mailto:sage [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)

おながいします



451 名前:NAME IS NULL mailto:sage [2008/07/02(水) 22:45:29 ID:???]
>>450
日本語で説明しろハゲ

452 名前:NAME IS NULL mailto:sage [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%

ちょっと説明しづらいです・・・

453 名前:NAME IS NULL mailto:sage [2008/07/02(水) 23:11:32 ID:???]
>>452
そういうのはいいんだよw

何行になる可能性があるのか、すなわち、X、Y ってのは
何種類あんの?

454 名前:NAME IS NULL mailto:sage [2008/07/02(水) 23:38:47 ID:???]
単純にサブクエリで割ればいいだけなんじゃね。
そのまま、type / (SELECT sum(type) FROM Table) ってすると効率悪そうなので、
実際のSQLはもう一ひねり欲しいところだけど。

455 名前:NAME IS NULL mailto:445 [2008/07/02(水) 23:47:04 ID:???]
>>449
ありがとうございます。
>>>445の前者みたいに素直に2文に分けたほうがいいと思う。
>パフォーマンス面から言っても保守性から言っても。
そうすることにします。>>379>>382は理解できませんでした。

456 名前:NAME 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
human7.2ch.net/test/read.cgi/ms/1215003832/
★祭り★ 【毎日・変態報道】 毎日新聞、「2ちゃんねる」を名指し…「女性社員中傷書きこみで法的措置」で★26
mamono.2ch.net/test/read.cgi/newsplus/1215016627/
【記者】毎日新聞の英語版記事で日本を侮辱【豪人】
academy6.2ch.net/test/read.cgi/english/1213971760/
【Daily】毎日新聞英語版がひどすぎる 3【WaiWai】
society6.2ch.net/test/read.cgi/mass/1214603376/
【毎日新聞】 iチャネル解約スレ 【変態報道】
hobby11.2ch.net/test/read.cgi/keitai/1214802475/

457 名前:NAME IS NULL mailto:sage [2008/07/03(木) 05:54:13 ID:???]
>>453
Hinmeiは30個ほどあったと思います(A,B,C,D・・・と続く)
Typeは必ずX,Yの2個です
なので、全体で60行ほど出力?

>>454
会社行って試してみます、一応帰宅後結果書き込みます


458 名前:NAME IS NULL mailto:sage [2008/07/03(木) 07:28:03 ID:???]
>>457
計算式は、その行の goukei / Sum(goukei) Group By Hinmei でいいの?

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

あと、>>454 じゃ絶対通らないからなw

459 名前:454 mailto:sage [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



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

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

人のサーバなんでファイル出力とかできません
今はlimit 100,50みたいに原始的なことやってます




461 名前:NAME IS NULL mailto:sage [2008/07/03(木) 12:23:51 ID:???]
>>460
RDBMSが何かで変わると思わないか?

462 名前:NAME IS NULL mailto:sage [2008/07/03(木) 13:47:33 ID:???]
というか、クライアントに何使ってるか、とk。

463 名前:NAME IS NULL mailto:sage [2008/07/03(木) 20:56:21 ID:???]
【国際】PlayStationサイトにSQLインジェクション攻撃…悪意のあるコードが埋め込まれる - アメリカ
mamono.2ch.net/test/read.cgi/newsplus/1215043341/

464 名前:NAME IS NULL mailto:sage [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が返ってきて欲しいのですが、どうすればいいでしょうか?
よろしくお願いします


465 名前:NAME IS NULL mailto:sage [2008/07/04(金) 16:47:29 ID:???]
>>464
括弧の数があってないような?

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

こんな感じでいいの?

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

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

よろしくお願いします

467 名前:NAME IS NULL mailto:sage [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


468 名前:NAME IS NULL mailto:sage [2008/07/04(金) 19:37:40 ID:???]
SQL SERVER 2005なのですが、
delete文で削除したデータは戻せないでしょうか?

469 名前:NAME IS NULL mailto:sage [2008/07/04(金) 19:50:59 ID:???]
>>468
はい






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<155KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef