このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 12問目
http://toro.2ch.net/test/read.cgi/db/1316769778/
よくある質問1
(問)
ID | DATE | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg
このようなテーブルから、下記のように
1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff
各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。
(答)
select A.ID,
A.DATE,
A.DATA
from TableName A
inner join
(select ID, max(DATE) as MAX_DATE
from TableName
group by ID
) B
on A.ID = B.ID
and A.DATE = B.MAX_DATE
;
よくある質問2
(問)
key data
----------------
1 a
1 a
1 b
1 b
1 a
2 b
2 a
2 a
というテーブルから
key a b
--------------------
1 3 2
2 2 1
というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。
(答)
SELECT key,
SUM(CASE data WHEN 'a' THEN 1 END) AS a,
SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
よくある質問3
(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B
HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか
(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;
(答2)
select *
from TableName T1
where not exists (select *
from (values 'A', 'B', 'C') T2 (HOGE)
where not exists (select *
from TableName T3
where T1.ID = T3.ID
and T2.HOGE = T3.HOGE
)
)
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
よくある質問5
(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい
例:201006を指定したら、以下の結果を得たい
20100601
20100602
・
・
・
20100630
(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。
どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
賛否の分かれるところでしょう。)
with TEMP (NUM) as (
select 1 from dual
union all
select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;
※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
どのみちお奨めしません。
以上、テンプレ終わり
乙
前スレはすまんかった
>>1乙
同じく申し訳ない。スレチ話題進行させてしまった。
どうも
やっぱ前スレの984は無理ですかね
>>12 前スレにちゃんとレスあるよ。
あとは自分でdatetimeをフォーマットする関数見つけてくればいいだけだよ。
か、もしくは文字列として扱って文字数で切ってもいいと思うけど。
それをDISTINCT付けて呼び出せばいいだけ。
>>13 なるほどわかりました
DateTimeをフォーマットして時刻を切り捨ててDistinctすれば良いってことですね
やってみますどうもです
SQLServerならConvertで111だな
ある期間において注文してくれた顧客IDを、日付ごとに一覧するには、次のようにします。
select date(created_at), customer_id
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
group by date(created_at), customer_id
order by date(created_at), customer_id
ここで、ある期間において注文してくれた顧客数(重複を排除したユニーク数)を知るにはどうしたらいいでしょうか。
select count(distinct customer_id)
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
>>19 すみません、正しくは「ある期間において注文してくれた顧客数(重複を排除したユニーク数)を *日付ごとに* 知るにはどうしたらいいでしょうか」でした。
少しは応用しろよ
select order_date, count(*) from
(
select distinct date(created_at) as order_date, customer_id
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
)
group by order_date
order by order_date;
試してないので無保証
>>22 副問い合わせ使うんですか、なるほど!
あとgroup by使わなくてもdistinctでいけるんですね。大変勉強になりました。
ありがとうございました。
副問い合わせ使わんでも、COUNT(DISTINCT customer_id)でいける気がするんだが
質問しに来たら「よくある質問1」がドンピシャだった
こうかな
select date(created_at), count(distinct customer_id)
from sales_orders
where date(created_at) between '2012-08-01' and '2012-08-07'
group by date(created_at);
仕事柄毎日SQLをごりごりしてるんだけど未だに苦手な小計なんですが
グルーピングIDの番号って何か規則性があるんでしょうか?
小計中計大計とか出す時いつも結果を見ながらグルーピングIDの番号を調べているんですが面倒臭くて
SQLをメンテすると番号変わったりするし大嫌いなんだけどパフォーマンスを考えたらロールアップ以外の選択肢は無いし
>>27 自分がつかってるDBMSが何かもわからないのか?
まずそのマニュアル見ろよ
ORACLEとSQL Serverで見る限りではGROUPING_IDは指定した各項目がビットに割り当てられる数値っぽいが
2進数解らんのか?
なんでそんな態度悪いの?
にちゃんなんてこんなもんだろ。
優しく対応して欲しいなら、Oracle なり MS のセミナーとかに行けよ。
2chだからわざと態度悪くしてるの?
この程度で態度悪いと思うなら見ない方が良いと思うぞ
出た見ないほうがいい
自分で調べたりしないくせに人に優しく教えるよう強要するって図々しいなあ
何でこのスレにいるんだ
36 :
30:2012/08/11(土) 11:16:04.73 ID:???
>>28 なんて、ちゃんと答え書いてあるし、まっとうな回答だと思うが。
そもそも、会社で先輩に聞いてもこんな回答だろ。
37 :
NAME IS NULL:2012/08/11(土) 11:57:14.45 ID:9f4DSmDL
どなたかご教示ください。お願いします。
環境:SQLServer 2008
目的は、以下のようなデータでの、カラムBのnull以外の件数の取得です。
A(int) ・B(int)
------ ・----
100 ・ ・ null
count(B)の結果は0件となり正しいですが、・「警告: NULL 値は集計またはその他の SET 演算で削除されました。」・と警告が出ます。
この警告を取り除くにはどのようにすればよいでしょうか。
実験用に以下のクエリで再現できます。
select・
COUNT(null_column)・
from・
(
・ ・ select cast(null as int) null_column
) A
よろしくおねがいします。
やりたいこととクエリとテーブルの例がまったくかみ合わないんだが。
SET ANSI_WARNINGS OFF
39 :
37:2012/08/11(土) 13:36:24.71 ID:???
〉38
実行したら警告出なくなりました。
ありがとうございます。
それでいいんだ…
>>28はきっと小計の出し方しらなかったと思う、んで知ったかぶりするためにすぐ調べた
でも難しくてムキー
質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい
環境:postgresql 9.0
価格変動テーブル
kakaku_datetime name price
2012-08-01 10:00:00 トマト 100円
2012-08-01 10:00:00 バナナ 200円
2012-08-10 10:00:00 バナナ 180円
2012-08-15 10:00:00 トマト 150円
売上履歴テーブル
uriage_datetime name
2012-08-01 12:00:00 トマト
2012-08-05 18:00:00 トマト
2012-08-08 15:00:00 バナナ
2012-08-16 19:00:00 トマト
を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。
uriage_datetime name price
2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる
2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる
2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる
2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる
よろしくお願いします。
前スレよりコピペ
770* 名前:sage [] 投稿日:2012/06/21(木) 12:06:59.60 ID:oEiJL9az
すまん、763です。具体的に言うと
株価Tab(時刻、株価)
為替Tab(時刻、$\為替レート)
を株価のテーブルをメインにして
SELECT時刻、株価、$|為替レート
にしたいんだけど株価と為替の時刻は当然一致していないけど、
株価の時刻からみて最新の為替レートを表示したいんです。
よろしくおねがいします。
777 名前:NAME IS NULL [sage] 投稿日:2012/06/21(木) 19:14:27.33 ID:???
>>770 こうかな?
select *
from A T1
left outer join
B T2
on T1.a1 >= T2.b1
where not exists (
select *
from B T3
where T1.a1 >= T3.b1
and T2.b1 < T3.b1
)
order by a1
;
>>44 素早い回答有り難うございます!ちょっと試してみましたが何とかなりそうです!
EXISTSとINの違いをわかり安く教えてもらえませんか?
一緒です
というのは嘘です
INは項目、EXISTSは行
NULLを含む含まないで違うんじゃなかった?
少し前に簡単な表で説明してくれてたが何だったかなあ
select文では、joinを使えば複数のテーブルを使った条件式が指定できます。
-- Sales部門に属する従業員の一覧
select e.id, e.name, e.saraly from employees as e
join departments as d on d.id = e.department_id
where d.name = 'Sales';
同じことをupdate文でもしたいのですが、どうすればいいでしょうか。
-- Sales部門に属する従業員のデータを更新
update employees as e set saraly = saraly + 10
join departments as d on d.id = e.department_id
where d.name = 'Sales';
副問い合わせを使えばできますけど、できればselect文と同じようにjoinを使って指定したいです。
update employees as e set saraly = saraly + 10
where e.department_id in (select id from departments where name = 'Sales');
よろしくお願いします。
>>52 SQL Server なら FROM で書けるけど
他DBは知らない
標準SQLではjoinはfrom句かmerge文のusing句にしか書けず、
from句はselect文(かサブクエリ)にしか書けない
t1
id str
1 a
2 b
3 c
t2
id str
1 d
2 e
3 f
t3
id t1.id t2.id
1 1 1
2 1 2
3 1 3
4 2 1
5 3 1
6 3 3
こういうテーブルがあります
left joinで結合したところ
t1.id t1.str t2.id t2.str t3.id
1 a 1 d 1
1 a 2 e 2
1 a 3 f 3
2 b 1 d 4
3 c 1 d 5
3 c 3 f 6
こうなりました
これを
t1.idが2でt2.idが2か3はnullなので入っていません
同様にt1.idが3でt2.idが2のとこもnullなので入っていません
これを入れて
t1.id t1.str t2.id t2.str t3.id
1 a 1 d 1
1 a 2 e 2
1 a 3 f 3
2 b 1 d 4
2 b 2 e null
2 b 3 f null
3 c 1 d 5
3 c 2 e null
3 c 3 f 6
こんな感じのを取得したいのですがどのようなSQLをかけばいいでしょうか?
使用DB SQLite3
>>56 t1とt2で直積取って、それにt3を外部結合
SQLite3ってCROSS JOIN使えたっけ?
58 :
56:2012/08/20(月) 12:47:20.36 ID:???
>>57 cross joinは使えるみたいです
外部結合はleft outer joinが使えるらしいので試したのですが
使い方が悪いのかleft joinと結果が同じでした
ちょっとcross joinでいろいろ試してみます
>>58 left outer joinとleft joinは同じだぞ。outerが省略されただけ
t1とt2をcross joinしてからt3をleft joinするんだ
60 :
NAME IS NULL:2012/08/24(金) 02:20:07.64 ID:vyiuPUqc
マテビューでセレクトする項目に空白を含めたいのですが、可能でしょうか?
可能です
62 :
NAME IS NULL:2012/08/24(金) 06:02:53.93 ID:vyiuPUqc
では、セレクトするのは空白・型は日付型にできるでしょうか
お前の使ってるDBMSの日付型が空白を許容するなら可能
64 :
NAME IS NULL:2012/08/24(金) 18:28:51.27 ID:vyiuPUqc
え、マテビューで空白のselectって無理じゃない?
66 :
NAME IS NULL:2012/08/26(日) 21:04:43.22 ID:wqfUioWl
>>65 SELECTする取得元の項目がNOT NULLでなければいけた気がするよ
プログラムからSQLの呼び出しについての質問ですが、
以下のSQLのテンプレートがあり、@〜Cにweb画面から渡された値を展開しています。
インジェクション対応していなかったようで、その対応を考えてます。
インジェクションでサブSQLを実行され情報漏えいできなければなんでもいいとのことで、
「(」だけをケアすればいいかなと思い、「(」を削除して
Aは「'」を「''」にエスケープしますが、それ以外は「(」をカットしようかと考えています。
@とBにて、hogeの項目情報は公開されているので、他の項目を指定される文にはいいとの条件です。
select xx1, xx2 from hoge where @ = 'A' order by B C
「(」をカットだけすれば、とりあえず他テーブル情報を取得または更新されることは防げるでしょうか?
スレ違いだし、そのレベルでは話にならん
いいカモだなw
使用DB:postgresql
DBにこんなテーブルがあり
name price
りんご 100
バナナ 200
みかん 150
手元にこんなCSVデータがあって
りんご,150
みかん,100
CSVのデータを元に一括でUPDATEしたいです。
name price
りんご 150
バナナ 200
みかん 100
CSVデータの文字列加工はPHP使うので大体のことは出来ます。
最悪1行ずつUPDATEでいいのですが、行数が多いので出来ればSQL発行を1回にしたいです。お願いします。
1回ってINSERT文みたいにつなげたいってこと?
そのまま1行ずつ書いて、BEGIN ENDで挟むだけじゃだめかね。
そうです、UPDATEでも
INSERT INTO fruits (name,price) VALUES(りんご,150),(みかん,100)
みたいな書き方で1回ですっきり出来る方法はないかなーと。
特にないのならご私的の通りこんな感じで行こうと思います。
BEGIN;
UPDATE fruits SET price = 150 WHERE name = りんご;
UPDATE fruits SET price = 100 WHERE name = みかん;
END;
×ご私的
○ご指摘
74 :
70:2012/08/28(火) 13:21:10.26 ID:???
なぜそうしたいかというのは、「UPDATE大量発行より1回の発行のほうが軽いだろJK」という思い込みが理由なので、
もし何らかの方法があるとしても負荷は大して変わんねーよということであれば
>>72のでもいいです。
(UPDATE対象は1万レコードくらい、カラムは数個)
UPDATE fruits
SET price = CASE
WHEN name = りんご THEN 150
WHEN name = みかん THEN 100
ELSE price END;
76 :
70:2012/08/28(火) 17:22:36.39 ID:???
まずDBにワークテーブル作って、そこにCSVの内容突っ込んでから
SQLで更新かければ、更新のSQLは1行ですむぞ
同じ名前が複数あったとき困る気がする、、スクリプトで排除するのかな
大体、単価をマスターに含めること自体が
部分関数従属がだな
って、確認せずに書いてもいないことを思い込みで進めて、後で困るパターン。
使用DB:mysql5
t1
id str
1 a
2 b
3 c
t2
id t1.id t1.id
1 1 2
2 2 3
3 3 1
このふたつのテーブルを結合して
id t1.id t1.str t1.id t1.str
1 1 a 2 b
2 2 b 3 c
3 3 c 1 a
こういう結果を得る方法はありますか・・・?
select * from t1 a
INNER JOIN t2 b on b.id = a.id
and b.id = a.id
とやってみても、idが2つあるので結合出来ないです。
t2のカラム名おかしくね?
t2にt1を2回JOINするだけだと思うけど
同じテーブルを複数JOINできるよ
t2のカラム名、いくらmysqlでもこんなカラム名許すわけないよな
t2って実テーブルじゃないのか?
とりあえずt2のカラム名ちゃんとしてれば、t1に別名つけて2回Joinすればいけるはずだが
許しちゃうんだなこれが
select 1 as `t1.id`
複数のテーブルを結合して、その列名のみを取得するのはできるのでしょうか?
教えてください
SQLServerです。
SQL Server知らんからググったが、syscolumnsとサブクエリ使えばいけるんじゃね
列名のみ取得ってのがイマイチ何をどうしたいのか解らんな
where 1=0とかで良いような気もする
列名も知らないDBを使って何かしようとしてるの?
SQLインジェクションのやり方の質問か
>>87 どうやったらできますか?
調べてもよくわかりません。
教えてください
>>91 それ結合とか関係ないな
システムテーブルってDBMS固有な場合が多いし、SQL Serverのスレ行って聞け
INFORMATION_SCHEMA が使えるだろ。
画期的なDBメンテツールを開発中なの鴨試練
こんなスレで聞いてるぐらいだから、あらぬ方向に画期的なツールになりそう…
97 :
NAME IS NULL:2012/09/05(水) 21:54:02.90 ID:DaBfuwdT
SQL Server 2005です
INSERT テーブル名
SELECT
"あ",
"い",
"う",
(SELECT A列
FROM 別のテーブル名
WHERE B列 = 0)
これってサブクエリの制限にひっかかるのでしょうか?
コンパイルは通るみたいですが・・・
INSERTの構文調べようか
>>97 サブクエリの制限ってのが何を言ってるかよくわからんが
単一行を返すことを期待するサブクエリが複数行返したらエラーになった気はするな
それは実行時エラーで、コンパイル(つか文法チェック)ではエラーにはならない
SQL ServerならそのSQLは通る気がする
別のテーブル名 にB列=0の行が複数あれば実行時エラーがでる
そうじゃなければ多分動くだろ
>>98 ありがとうございます
職場で調べたつもりですが、なんかINSERT文だけは除外されるみたいな書き方でした・・・
>>99 ありがとうございます
そこまで到達しないとエラーかどうかわからないんですね・・・
RDBが職場にしかなく、しかもデータのトラブルでなかなか検証できないんですが、
確か、EXISTSなどがない限り、サブクエリにおいて・・・みたいなエラーメッセージでした
明日の午後にはテストがあるので急いで情報集めたいのですが、
とりあえず、仰るとおり、複数行が帰らなければよいのですね・・・・
101 :
100:2012/09/05(水) 22:43:08.27 ID:DaBfuwdT
すいません
こちらでした
http://www.agtech.co.jp/html/v9manuals/sp2/prog_gde/prog_gde-20-7.html WHERE 句のサブクエリは、検索基準の一部になります。SELECT、UPDATE および DELETE ステートメントでサブクエリを使用する場合は、以下の制限が適用されます。
サブクエリを小かっこで囲まなければならない。
サブクエリに UNION 句を含めることはできない。
外側のクエリの WHERE 句で ANY、ALL、EXISTS または NOT EXISTS キーワードを使用しないかぎり、サブクエリの選択リストには列名の式を 1 つしか組み込めない。
でもこれは、SQL Serverではない別のDBの話でした
すいません
そもそもそれWHERE句のサブクエリじゃないし
103 :
NAME IS NULL:2012/09/06(木) 12:26:18.97 ID:wb5oKqRc
mysql5.1.38のバージョンを利用してます
会員テーブル(usr_tbl)
|id|usr_name|usr_status|
受注テーブル(order_tbl)
|id|usr_id|order_name|order_price|order_status|
状態テーブル(status_tbl)
|id|status_name|
上記のような3つのテーブルを、JOINしてデータを取り出す時
select
u.usr_name,
s1.status_name,
o.order_name,
o.order_price,
s2.status_name
from
order_tbl as o
left join usr_tbl as u on o.usr_id = u.id
left join status_tbl as s1 on o.order_status = s1.id
left join status_tbl as s2 on o.order_status = s2.id
と言う書き方としていますが、status_tblを1回joinですます方法は
なにかあるんでしょうか?
104 :
NAME IS NULL:2012/09/06(木) 12:32:54.55 ID:wb5oKqRc
left join status_tbl as s1 on o.order_status = s1.id
の部分は
left join status_tbl as s1 on u.usr_status = s1.id
のミスです
usr_statusとorder_statusが別物なのだから無理
ordersテーブルから、顧客のユニーク数を数えたい。
いちおうこれでできたっぽい。
select count(*) from (select customer_id from orders group by customer_id) as t;
もっとうまい書き方があれば教えてほしい。
select count(dictinct customer_id) from orders
はうまくいかなかった。
当方 PostgreSQL 9.1
count(dictinct が使えないならそうするしかないんじゃない?
サブクエリはgroup byじゃなくてselect distinctのほうが自然な感じがするけど
>>106 うまくいかなかったってのはどう上手くいかなかったんだ?
ちなみにdistinctのスペル間違ってるけど、それ直してもだめか?
109 :
NAME IS NULL:2012/09/06(木) 22:55:45.59 ID:yurKVJdz
SELECT
CASE
WHEN @var = 1
THEN
ELSE
END
と
SELECT
IF @var = 1
ELSE
END
は普通のプログラミング言語と同じく好みの問題ですか?
標準的なSQLにIFなんてなかったはず
それが同一かどうかはそのDBMSのスレで聞くかマニュアルでも読んで自分で調べろ
>>107 select distinctなんてものがあるのか。知らなかった。ありがとう。
>>108 スペル直したらいけたorz お恥ずかしい サンクス
distinct はSQLの初歩の方で出てくるはずだが…
重複する結果を1行だけ欲しいというニーズがなかったのか?・・・w
order表
id, date, user
1, 2012-09-01, u1
2, 2012-09-02, u1
3, 2012-09-02, u2
4, 2012-10-01, u3
detail表
id, order_id, data
1, 1, aaa
2, 1, bbb
3, 2, aaa
4, 3, bbb
5, 3, ccc
6, 4, ccc
DB: postgreSQL 9.1
結合条件はorder.id = detail.order_id
欲しい結果
month, user, order_count, detail_count
2012-09, u1, 2, 3
2012-09, u2, 1, 2
2012-10, u3, 1, 1
よくある1:1..n関連の注文-注文明細タイプの2表から
月ごとにuserごとの注文件数と明細件数を1回で取得する方法はありますか。
115 :
NAME IS NULL:2012/09/07(金) 14:40:23.77 ID:v5vYUaTi
質問です。
UPDATE TABLE SET XYZ = REPLACE(REPLACE(XYZ,'A','1'),'B','2');
このような構文の場合、
1.テーブル内のすべての行のAを1にかえてから、Bを2にかえる
2.1行ずつAを1に、Bを2に置き換えていく
どちらの動きをするんでしょうか。
>>115 関数が入ったからと言って、XYZ = 何か を複数回UPDATEするってことはないはずだお。
厳密にいうならば、1と2、両方とも違う
あらかじめXYZの値に対して、リプレイスを2回かけて得られた値をUPDATEしているはず。
>>114 select date_trunc('month', date) as month,
user,
count(distinct order_id) as order_count,
count(*) as detail_count
from order T1
inner join
detail T2
on T1.id = T2.order_id
group by date_trunc('month', date) as month,
user
;
118 :
NAME IS NULL:2012/09/09(日) 23:52:06.85 ID:2/TvaXCv
SELECT *
FROM テーブルあ LEFT JOIN テーブルい ON テーブルあ.主キー = テーブルい.主キー
としたときに結合したあとの選択結果の列の順番はどのように決まるのですか
>>118 DBMSに依るだろうが多分テーブルあがインサートされている順になる気がする
列の順序にしても行の順序にしても、クエリで明示的に指定していない場合は
DBMSがテキトーに決めると思っておけ。
指定しない場合にどういう順序になるかなんて、考えるのは無駄。
122 :
NAME IS NULL:2012/09/10(月) 08:11:15.12 ID:j8POAroQ
ありがとうございました
>>117 遅くなりましたが欲しいデータが取れました
本当にありがとうございました
124 :
NAME IS NULL:2012/09/11(火) 15:44:47.43 ID:QVEYY1qN
今主キーと外部キーの勉強をしています。
「 id 名前 身長 体重 部活 」
と表示したい時、
以下のようなtableAとtableBがあった時の主キーと外部キーの設定は
・tableA … A_id(主)、名前、身長、体重
・tableB … B_id(主)、部活、A_id(外) として、
SELECT * FROM B_table right join A_table で結合すればいいのでしょうか?
部活は一人複数入ることも考えて上記のようにしました。
その例だと
人(人ID、名前、身長、体重、その他人としての特性)
部活(部活ID、部活名、その他部活としての特性)
人−部活(人ID、部活ID)
の3テーブルにするのが基本かと
>>124のtableBのB_idが何をしたいのかが謎すぎる
>>126 主キーの役割がわからないとは珍しい御仁だな
(部活,A_id)が候補キーであると考えないとtableB自体意味不明だが、
もしそうであればその複合キーの代理キーだな。
どうでもいいんだが
B right join A より A left join B の方がしっくりくるのは俺だけ?
まあとりあえず設計はスレ違いだな
>>130 そんなこと言うと代理キーは全部冗長だろうが
あ、代理キー論争は余所でやってね
親テーブル
Id, 資産
1, 100
2, 200
3, 400
子テーブル
Id, 親Id, 資産
1, 1, 10
2, 1, 20
3, 2, 10
4, 2, 20
5, 2, 30
6, 3, 10
から
Id, 資産
1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。
2, 70
3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。
4, 86
5, 96
6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。
という結果を得たい。
要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。
SQL で出来ます?
>>132 とりあえず
select
Id,
資産 + (select 資産 from 親テーブル where Id=t.親Id) / (select count(*) from 子テーブル where 親Id=t.親Id)
as 資産
from 子テーブル t
パフォーマンスとか、親が2件だったり0件だったりとか、切り捨てとかは考慮してない
134 :
132:2012/09/15(土) 08:24:23.00 ID:???
>>133 なるほどこんなことが出来るんだ。
子テーブルも数千件レベルだし夜間バッチ処理だから、パフォーマンスはそんなに
気にしなくてもいいと思ってる。
また親Id は一つなので親が2件はありえないし、親なしにならないように制約掛け
てるので多分大丈夫だと思う。
ありがとう。
>>134 しかし、SQLも危ない構造をしてるね。こうまでしてしまったのは誰だ。
fromかexists以外の部分にサブクエリを書くのはなんか格好悪いんだよな
select T1.Id,
max(T1.資産) + max(T3.資産) / count(*) as 資産
from 子テーブル T1
inner join
子テーブル T2
on T1.親Id = T2.親Id
inner join
親テーブル T3
on T1.親Id = T3.Id
group by T1.Id
order by T1.Id
;
>>136 おお、なんかよさげ。
こっちもありがとう。
>>135 危ない構造ってどういう事だ?
>>136 1:nで結合すると1側のテーブル項目が無駄に重複してるような気もする
まあ、その辺は好みの問題(単一行サブクエリのエラーの問題はあるけど)
最近のオプティマイザは賢いからなぁ
>>138 射影部分で結合を指定しているではないか。
あそこは本来 W への形式指定をするところだ。
この場合で言えば、意味的に W に書き込まれた
無名のテーブルに対して暗黙の結合が起こっている
ことになってしまう。
そんな逸脱を許してよい筈がない。
なんか難しくて良くわからんな
(単一値を要求する)サブクエリが結合だってこと?
それが何かを逸脱してて許されないの?
で、それがどう「危ない」の?
たんに学術的におかしいってだけなら、それ用のスレ立ててそこで論議してくれ
>>140 where Id=t.親Id とあるからには結合と見做される
親テーブルの資産は集約値でないから本来単一値には
なり得ない。
142 :
136:2012/09/15(土) 19:59:43.02 ID:???
>>140 なんか変な人きちゃったね
代わりに謝る
>>141 >集約値でないから本来単一値にはなり得ない。
なり得ないんじゃなくて、そうなる保証がないだけだろ
単一値になるかもしれないが、そうならないかもしれない
>>133は親が1件の場合以外は考慮してないと書いてある
つまりこのサブクエリが単一値になる事を前提としていることははっきり示してあると思うが
あるいは親テーブルの資産を集約すれば問題ないと?
つまりあのサブクエリが (select sum(資産) from 親テーブル where Id=t.親Id)なら問題ないの?
で、何が何を逸脱してて、何が危ないの?
親が2件以上あると単純にいかなくなるから危ないのではないかな
145 :
144:2012/09/15(土) 22:18:43.53 ID:???
追加 これ集約しても同じでしょ やはり基本は解の集合になる
私の書き込みの表現が適切でなかったのかもしれない。言い換えれば、
JOINはfrom句かwhere句の中でしか指定できないのがSQLだと思う。
ところが、
>>134 の例では、親テーブルの資産が複数取れてきてしまうと
<列指定>が原因で事実上のJOINを起こさなくてはならなくなる。
これは具合が悪いのではないか。
147 :
133:2012/09/16(日) 02:24:08.43 ID:???
>>144,145
実行時エラーの可能性を危ないと言うのであれば確かに危ない
集約すればスカラ値になることが保証されるわけだが、スカラ値が集合だと?
>>146 >JOINはfrom句かwhere句の中でしか
Joinはそうだな。で、
>>134(つか
>>133だろ)のどこにJoinって書いてる?
>親テーブルの資産が複数取れてきてしまうと
><列指定>が原因で事実上のJOINを起こさなくてはならなくなる
原因っていってる列指定ってのが、なにがどう問題なのかわからんが?
なぜ事実上のJoinを起こすんだ?あくまでもSelect対象のテーブルは一つしかないし、列リストにも1項目しかないんだが?
事実上の集約を起こすってならまだ話は解る。実際はそんな集約は起きないが
統計学とかの学術的にはどうかしらんが、SQLではカッコでくくったSelect文は式とみなされる
>133で要求されてる式はスカラー式で、結果として1項目で1行(または0行)であれば問題ないんだが?
たとえそのサブクエリのFromにJoinがあってもだぞ
>これは具合が悪いのではないか
親テーブルの資産が複数取れてきてしまうとたしかに具合は悪い
標準的なDBMSなら、その場合は実行時エラーになる(一部ならないDBMSもあるらしいが)
だから、親が2件だとダメだと断ってあるわけだが
ちなみに0件だとサブクエリのスカラー式がNULLを返すので、計算式全部がNULLになる
こっちの方が問題だろう
そして現実的にはWhereで主キーを指定する場合、1件か0件な事は保障できる
今回の例であれば親テーブルのIdなんだから、まあたぶん主キーだろう
そしてテーブルに親子関係があるのはテーブル名からまあ想像できる
そのばあい参照整合性制約をちゃんとかけてれば、親が0件でないことは保証できる
だからおそらく親が2件以上や0件ってことは起こらないだろうと思って
断りを入れた上でSQLにその考慮を入れてないんだが
mysql 5.5.19
select id, filename, a.author_id, b.author_name,
book_name, a.motoneta_id, motoneta
from manga_data_tbl a
left join author_tbl b
on a.author_id = b.author_id,
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
order by id;
で、
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
order by id' at line 6
になります。
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
のどこが悪いんでしょうか??教えてくださいm(__)m
left join motoneta_tbl c
on a.motoneta_id = c.motoneta_id
の前にコンマがあるからでは?
>>149 あぁぁぁ〜それだったのか〜orz
どうさしました。ありがとうございますm(__)m
151 :
NAME IS NULL:2012/09/24(月) 14:00:17.01 ID:HaYq/Rnn
あるカラムの値を0にそろえたいのですが、
UPDATE *** SET xxx = 0
と
UPDATE *** SET xxx = 0 WHERE xxx <> 0
ってどっちが一般的でしょうか?
0を0に置き換えて何が問題なの?
ロック
ログの量
トリガ
ぐらいを考慮して好きなように
154 :
NAME IS NULL:2012/09/24(月) 16:48:38.71 ID:QiS80YJo
Oracle10g
企業TBL
1:企業ID
2:企業名
3:電話番号
4:最終発送日
上記のようなテーブルがあり、同一企業でも
複数のレコードに登録されています。
電話番号が同一であれば、同一企業とみなし、
最終発送日を同一企業内で最新の日付で
一斉更新したいのですが、プログラムを使わず
SQL文だけで完結することは可能でしょうか?
下記のSQLで表示される電話番号のデータを
MAX(最終発送日)で更新するイメージです。
SELECT 電話番号,MAX(最終発送日),COUNT(*)
FROM 企業TBL
GROUP BY 電話番号
HAVING COUNT(*) > 1;
なんで企業TBLなのに企業IDで企業が一意に決まらないのかとか
電話番号が同一だったら同一企業なんて条件で本当にいいのかとか
突っ込みどころ満載だけどその要件通りのことは一応できる
update 企業TBL set 最終発送日 = (select max(最終発送日) from 企業TBL T2 where 企業TBL.電話番号 = T2.電話番号)
156 :
154:2012/09/24(月) 19:00:31.21 ID:QiS80YJo
>>155さま
ありがとうござます。
おしゃる通り、電話番号が等しければ同一企業と見なしてよいかは検討の余地があるところです。
すみません、テーブル構成を少し端折りましたが、親企業テーブルが別途あり、
同一企業が別の親にぶら下がる場合は、それぞれ別企業として登録する必要があるため、
このようなことが発生しています。
総務部と人事部が電話番号違ってたらどうすんの?とか本店と支店は電話番号違うから別企業になるのか?とか果てしなく疑問が出てくる
設計スレではないからいいけど
質問させてください。
SQLServerってSQL文の処理をサーバー側がやってくれたりします?
クライアントは命令出すだけで、実行はサーバーだったら良いなと。
現在までアクセスのmdbをNASで共有してきたのですが
Pen4(セレロン)クラスのPCでは遅いので。
考えてる通りの動作
てか、access から mysql 使えば安く済むよ
>>159 ありがとうございます。
その辺りも検討してみます。
実行がクライアント側だというなら、selectはテーブルの全rowをまずクライアント側にコピーするというのか?
質問する前に少しは考えろww
> selectはテーブルの全rowをまずクライアント側にコピーするというのか?
・うわっ、バカがいるww
AccessのdbファイルをNASで共有という今までのやり方そのものが
実データはネットワークを介した向こうでSQL実行はクライアント
という形だね。
select文だからといって常にフルテーブルスキャンとはならないのと
同じ理由でクライアントで実行するからといって常に全rowを手元
にコピーする必要はない。
バカだからよくわかんないや。
165 :
NAME IS NULL:2012/10/04(木) 00:53:40.21 ID:q2phKc+6
SQL server 2005
女子テーブル
ID name tops pants skirt
1 jyoshimei m l m
男子テーブル
ID name tops pants
1 danshimei xl xxxl
というテーブルがあってそれぞれに500人ほどのデータが入っています。
女子テーブルと男子テーブルの両方から pants のサイズ、トップスのサイズ、などで絞り込みしてリストを作りたいのです。女子のみスカートのサイズがあります。
どのように書けば良いのか教えてください。
union使え
TransactionSQLはわからないんですが
MySQLユーザな私だと
(SELECT name,tops,pants,'' AS skirt FROM 男子テーブル)
なんぞを女子テーブルとUNIONしちゃいますが。
168 :
NAME IS NULL:2012/10/04(木) 20:56:50.85 ID:q2phKc+6
169 :
NAME IS NULL:2012/10/05(金) 09:44:55.71 ID:xfWj/RNs
Oracleについてです。
テーブル1
列A(PK)
列B
列C
列D
があり、列B、列C、列Dの複合INDEXが1つ設定されています。
列B+列C+ 列Dで結合した列を
複数の値を条件に検索する必要があり、
WHERE 列B||列C||列D IN ('XX','XX','XX')
でとして検索しているのですが、
これではINDEXを使用してくれず、
検索が非常に遅くなってしまっています。
(テーブル1は200万件程度あります。)
テーブル構成は変更できず、INDEXまたは
SQLで解決する必要があるのですが、
何か検索を向上させる方法がありますでしょうか。
>>169 複合INDEX とは別に 列B,列C,列D にそれぞれINDEXを付ける。
171 :
NAME IS NULL:2012/10/05(金) 13:21:18.99 ID:hMuvgCWe
>>169 検索用のB,C,D列だけのテーブル(全部主キー)を作って
そこに該当レコードのキーを入れてJOIN
両方がINDEX SCANいなれば爆速
正規化してテーブルを分割した後にinsertやupdateする場合は
SQL文を二つに分けてinsertするのでしょうか?
一度にできる方法を教えてくれ
>>169 IN の中身が少なければ、B,C,Dそれぞれ単独indexを作って
where
(B=hoge1 and C=hage1 and D=moke1)
or
(B=hoge2 and C=hage2 and D=moke2)
or
・・・
>>176 単独いらない。というか単独インデックスだとふつうはそのうち一つ
しかつかわれない。
自分もINの中身が少なければこれで良いと思う。注意点は条件式を
複合インデックスを定義したときの列の順番で書くこと。
まあ最近のオプティマイザは頭良いけど。
列B||列C||列D のファンクションインデックスでいいだろ
>>172-173 VIEWを作ればVIEW越しに更新できるDBMSもあるけどね
まあ正規化のために分けたんなら別々のエンティティだから分けたんであって、
そうであれば別々に更新するのが意味的には正しいと思うけど
正規化とエンティティは全然関係ないんだが、いまだにこういう勘違いしている人がいるのな。
>>176-177 B,C,Dで連結してから検索してるってことは、たとえば
'X','',''
'','X',''
'','','X'
の3行がin('X','Y','Z')で引っ掛からないとダメってことだろ
素直に結合した状態のインデックスつくるか、条件指定の仕方を見直すかだな
182 :
NAME IS NULL:2012/10/17(水) 03:56:59.08 ID:pPy04zFq
SQLに関して質問です。MySQL5.1.41です。
【チームテーブル(team)】
--------------------
チームID チーム名
--------------------
1 巨人
2 阪神
3 中日
【選手テーブル(player)】
--------------------------------------
選手ID チームID 選手名 背番号
--------------------------------------
1 1 阿部 10
2 1 杉内 18
3 2 金本 6
4 2 鳥谷 1
5 3 岩瀬 13
6 3 谷繁 27
この条件で、各チームから背番号最少の選手を抽出するのが目的です。
結果イメージは、
----------------------------
チーム名 選手名 背番号
----------------------------
巨人 阿部 10
阪神 鳥谷 1
中日 岩瀬 13
です。SQLで
SELECT チーム名, 選手名, 背番号 FROM team LEFT JOIN player USING (チームID) WHERE MIN(背番号);
ではエラーになってしまいました。
ご教示宜しくお願いいたします。
集計関数の使い方をちゃんと勉強してくださいね
まずはこのあたりから
select チームID,min(背番号) from player group by チームID;
>>4が参考になるかもしれません
184 :
NAME IS NULL:2012/10/17(水) 14:57:03.90 ID:ptYm3Ltw
Oracleの検索で、100万件のテーブル検索を行うのですが、
検索結果で500件位表示される場合と、該当データがない場合では
該当データが無い方が表示に時間がかかります。
索引を使っていない検索なのですが、どういう理屈で
該当データが無い方が検索に時間がかかるのでしょうか?
なにそれこわい
というかそれはSQLじゃなくてRDBMSの問題なのでは
186 :
NAME IS NULL:2012/10/18(木) 01:10:04.11 ID:jxIImRzW
>>184 検索列は同じなの?
違う列でフルスキャンした結果ありませんとかじゃないだろうな
187 :
182:2012/10/18(木) 01:38:35.05 ID:otEnXaZA
>>183 回答頂きありがとうございます。
テンプレなので最初に見たのですが、
こちらの希望は最初のSELECT文で両テーブルからフィールドを取得するので、
うまくいきませんでした。
SELECT チームID, MIN(背番号) FROM player GROUP BY チームID
の結果は
----------------------------
チームID 背番号
----------------------------
1 10
2 1
3 13
なので、あとはこれに選手名とチーム名が抽出されれば解決なのですが、
この結合とサブクエリ(?)に関するSQLがうまくいきません…。
検索中に 500 件に達したら終わり
該当が無いから最後まで探そうとするから時間がかかる
ただそれだげ
SELECT チーム名, 選手名, 背番号
FROM team t, player p,
(SELECT チームID, MIN(背番号) as 最少背番号 FROM player GROUP BY チームID) m
WHERE t.チームID = p.チームID
AND p.チームID = m.チームID
AND p.背番号 = m.最少背番号;
190 :
184:2012/10/18(木) 09:48:12.50 ID:fR4udFJG
>>185 >>186 ありがとうございます。
アプリからの検索なので、渡している検索列は同一です。
すみません、複数のテーブルを使っているので、
INDEXを使ってるものと使っていないものがありました。
実行計画を見ると、どちらの検索条件も同じ計画に
なります。
例えば統計情報を更新していないとかで、こういった
事象も考えられますでしょうか。
>>190 >INDEXを使ってるものと使っていないものがありました。
>実行計画を見ると、どちらの検索条件も同じ計画
どっちだよ
検索の時間と表示の時間もちゃんと分けて考えてるか
193 :
182:2012/10/19(金) 02:56:07.44 ID:???
>>189 希望通りの結果となりました!どうもありがとうございます。
今まではJOINを使った結合しかやってなかったのですが、
こういうやり方もあるんですね。参考になりました。
備忘録として保存したいと思います。
194 :
190:2012/10/19(金) 12:14:42.93 ID:MO6yhadg
>>191 >>192 すみません、書き方が悪かったです。
使ってるものと使ってないというのは、
1個のSQL内で使用してる複数のテーブルで
INDEXを使ってるものと使っていないものが
あるという意味です。
existsは使っていません。
表示の時間はほとんどかっていません。
planはこんな感じですが。
|id | Operation |Rows | Cost |
-----------------------------------------------------------
| 0 | SELECT STATEMENT |21992 | 2668 |
| 1 | SORT ORDER BY |21992 | 2668 |
| 2 | HASH JOIN |21992 | 926 |
| 3 | TABLE ACCESS FULL | 3 | 2 |
| 4 | NESTED LOOPS |23991 | 922 |
| 5 | HASH JOIN |26172 | 922 |
| 6 | TABLE ACCESS FULL | 253 | 5 |
| 7 | HASH JOIN OUTER |26172 | 913 |
| 8 | HASH JOIN |26172 | 830 |
| 9 | TABLE ACCESS FULL | 112 | 2 |
|10 | VIEW |26172 | 826 |
|11 | FILTER | | |
|12 | SORT GROUP BY |26172 | 826 |
|13 | TABLE ACCESS BY INDEX ROWID| 523K| 826 |
|14 | INDEX FULL SCAN | 1570K| 26 |
|15 | TABLE ACCESS FULL | 5502 | 4 |
|16 | INDEX UNIQUE SCAN | 1 | |
というかさ
>>184は後出しが酷いよ。
簡単なスキーマ定義と問題になっているクエリぐらい書かないと。
184の書き方だと自分でも単一テーブルの全行スキャンの途中打ち切りを
まず疑うし、それがあとから複数テーブルのJoinとか、なんじゃらほい。
いきなり実行計画貼り付けられたところで要エスパーとまではいかなくても
答える方は無駄に面倒だ。
スキーマとクエリを提示、まずそこから。
not inとか使ってて、最終的に0件の方がアクセスするレコード件数が多いとかじゃないのか
>>196 そう思ってexistsを使ってるか確認してみた
SQL インジェクションやられた、あばばばば
199 :
NAME IS NULL:2012/10/20(土) 01:43:41.08 ID:/WZRtOi0
oracle10gのpro*cobolで、カーソルの逆方向読み(fetch prior)は可能でしょうか?
oracleのスレで聞けよ w
name like 'unkounkounko'
↑
これにワイルドカード使いたい場合どうすればいい?
'unkounkounko' like name
うんこをなめるのが好きだって?
MS SQL server 2012です。
TableA
商品名 製造数
A 1000
B 2000
C 1000
TableB
商品名 単価
A 100
A 120
B 90
C 120
C 125
TableBには同一商品名で複数の単価が登録されています。
TableBの商品名毎の一番高い単価を基にして
TableAの製造数 x 単価を求めたいのですが
一発で出す方法有りましたら教えてください。
得たい結果
A 12000
B 18000
C 12500
TableBから商品名ごとに最大値を求めるサブクエリ(max(),groupby 使用)と
TableAをジョインさせる
DBMS名「MySQL 5.0.95」
TABLE `items`
`itemID`,itemNAME`
'1','AAA'
'2','BBB'
'3','CCC'
'4','DDD'
'5','EEE'
'6','FFF'
TABLE `purchase`
`userID`,`itemID`
'1001','1'
'1001','2'
'1002','1'
'1002','2'
'1002','5'
'1003','1'
'1004','5'
'1004','6'
TABLE `recommend`
`itemID`,`rank`
'2','10'
'4','9'
'5','8'
'1','7'
上記のように、商品マスター `items` 購入履歴 `purchase` オススメリスト `recommend`
の3つのテーブルがあります。
ここで、特定の`userID`にオススメリストを表示したいのですが、
その際には、購入済みの商品は省いて表示したいと思います。
上記の例で`userID`='1001'には
itemID = '4' と itemID = '5'
だけを表示させていたと思います。
`item`テーブルの情報も含め
items.`itemID`,items.itemNAME`,recommend.`rank`
'4','DDD','9'
'5','EEE','8'
という結果を求めるためのSQLはどう書けばよいでしょうか?
>>207 特定のuserIDでいいんだったら、例えばuserID=1001の場合は
select I.itemID, I.itemName, R.rank
from item I, recommend R
where I.itemID = R.itemID
and I.itemID not in (select distinct itemID from purchase where userID=1001)
order by R.rank desc;
209 :
NAME IS NULL:2012/11/01(木) 05:32:31.48 ID:wt1+qLkC
MySQLの初歩的な質問です
テーブル名y2010 主キー 場所
場所 人口
----------------
東京 1500
大阪 800
福岡 500
・・・
テーブル名 y2011 主キー 場所
場所 人口
----------------
東京 1600
大阪 900
福岡 600
のようなテーブルがあるときに、
テーブル名 y_sum 主キー 場所
場所 人口
----------------
東京 3100
大阪 1700
福岡 1100
のように、複数のテーブルから主キーを含むフィールドを参照して
参照した或るフィールドの値の和を代入したフィールドをもつテーブルを新たに作成するには
どのようなクエリにすればよいのでしょうか?
おねがいしますm(._.)m おねがい
insert into y_sum
select a.場所,a.人口+b.人口 from y2010 a, y2011 b where a.場所=b.場所;
>>209 確認してないけど↓?
create table 新しいテーブル名
select y_view.場所, sum(y_view.人口)
from
(select 場所, 人口 from y2000
union all
select 場所, 人口 from y2011) y_view
group by y_view.場所
質問です。
開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は
ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))
で計算できます。
それで、
・select で距離を計算するときは round() するけど
・order by でソートする時は round() なしで(つまりfloatのまま)ソートする
ということをしたいです。
SQLはこんな感じになるんですけど、
select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance
from geo_data
order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))
これだと距離の計算が二重に行われてしまい、無駄です。
これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。
よろしくお願いします。
環境:PostgreSQL 9.1
副問い合わせ
こんなんじゃね?
select round(distance) from
(select ST_Distance(略) as distance from geo_data)
order by distance;
Apache Derbyでselect文を使ったストアドプロシージャーのサンプルが用意されているwebページを教えていただけないでしょうか
jdbcから下記のqueryを叩きたいのですが、冗長なためストアドプロシージャーにしてderbyから呼び出したいのです。
select Rating2.productID,Rating2.productName,MAX(UserDistance.Distance * Rating2.ratingValue) as SuggestionScore
from (select Rating3.CONSUMERNAME,Rating3.CONSUMERID,
Sum(abs(Rating2.RATINGVALUE * Rating3.RATINGVALUE))as Distance
from rating2,rating2 as rating3
where rating2.consumerID <> rating3.consumerID
and rating2.PRODUCTID = rating3.productID
and Rating2.consumerName = 'John'
group by Rating3.ConsumerName,Rating3.ConsumerID) as userDistance,
(Select ConsumerID,ProductID,ProductName,RatingValue from Rating2 where Rating2.productID not in(select productID from rating2 where ConsumerName ='John')) as Rating2
where userDistance.CONSUMERID = Rating2.CONSUMERID
group by Rating2.PRODUCTID,Rating2.PRODUCTNAME
order by SuggestionScore DESC;
スレ違い
VIEWにはできないの?
218 :
216:2012/11/11(日) 14:06:21.24 ID:???
>>217 スレ違い、すみませんでした。
ConsumerName = 'John'の部分を変数にしたいのでViewではなくストアドにしたかったのです。
どうやらDerbyのストアドはJavaで書かなければならないようなので、平文のまま組み込むことにします。
ネットで調べてsqlite他組み込みのDBMSは非常に早い事を知ったんですが
世間的にはmysqlやpostgres、oracleなど非組み込みDBMSが一般的です
なんで組み込みのDBMSが主流にならないのでしょうか?
早いというか、小さい、だな
プログラムが小さい
扱えるデータ量も小さい
土俵が違う
221 :
NAME IS NULL:2012/11/12(月) 23:58:42.67 ID:c7SF2yEW
SQLiteでログインとかパスワードとかどうしてる?
SQLite パスワード とかでググれ
少なくともスレチだ
224 :
NAME IS NULL:2012/11/14(水) 01:08:33.15 ID:vnD9R/B5
jinko menseki mitsudo
200 1000 null
100 1000 null
・
・
というテーブルで
mitsudoに jinko/menseki の計算結果を挿入するにはどうすればいいんでしょうか。
jinko menseki mitsudo
200 1000 0.2
100 1000 0.1
・
・
としたいです
225 :
NAME IS NULL:2012/11/14(水) 01:08:56.50 ID:vnD9R/B5
mysql5です
update hogehoge set mitsudo=jinko/menseki;
O(-人-)O アリガタヤ・・
ご教示お願いいたします。
・DBMS名とバージョン
SQL Server2008
・テーブルデータ
テーブル名:住所_MST
ID 住所
------------
001 住所A
002 住所B
003 住所C
004 住所D
005 住所E
006 住所F
008 住所G
010 住所H
・欲しい結果
IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした
仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします
なお、IDはキー設定されています
結果は下記のようになります
ID 住所
------------
001 住所A
002 住所B
003 住所C
004 住所D
005 住所E
006 住所F
007 新住所
008 住所G
010 住所H
IDを1〜最大値まで回してレコードが存在するか
チェックできないほど件数があるの?
>>229 .netの環境でマッチングしても良いかと思ったのですが
数十万件分のIDを3種設定するため処理が重いのです
SQL内でループさせてIDを設定できるのでしたら助言頂けると助かります_no
IDを再利用する意味が分からん。
そのままじゃ無理だろう
マスタの欠番のところにダミーレコードを入れるか
ID管理テーブルを別に作るか
いずれにしても、事前に全件をなめてどっちかを行う処理が必要
一応こんなんでもできるけど、IDの再利用なんかやめとけに一票
insert into 住所_MST
select min(ID)+1, '新住所'
from 住所_MST T1
where not exists (select * from 住所_MST T2 where T1.ID+1 = T2.ID)
;
234 :
228:2012/11/14(水) 23:26:45.77 ID:???
>>233 確かにID再利用は仕様変更の際に面倒になりそうですよね
桁数を7桁に増やしてIDを欠番にしてみようと思います
ソースですが若いIDから+1ずつ見てあげてマッチしなければ数値を設定といった感じでしょうか?
上記のような処理でしたらID欠番にしても動きますので良さそうですね!
参考にさせて頂きますm(_ _)m
一つの項目に複数の意味を持たせるのは基本的に設計として間違ってる
IDに、識別子としての意味と、連番としての意味の二つの意味を持たせるからそうなる
さすがにそれは的外れ
>>234 7桁…?
numericつかってるなら、それをintに変更することを検討してみてもいいかと。
関係ないけどdeleteで欠番にするよりフラグ用の列増やして使ってるか使ってないかのオンオフにした方が良くね
そんなの常識たったたらりら
データによっては完全削除が要求されるものもあるので「常識」とはいえない.
データ部分を削除してレコードは削除マーク付けて残しといても良いんじゃない?
コンプライアンス上問題になるケースもあるだろ
データは消して番号だけ残しておくのにそれは関係ないだろう
データベースなのにデータの無いレコードに何の意味があるの?
この場合IDそのものが必要なデータだろう。
すいません、超初心者です。
以下のSQLの意味がさっぱりわからないのですが、
ご教授いただけないでしょうか。
SELECT * FROM [{0}]
247 :
NAME IS NULL:2012/11/19(月) 00:56:11.37 ID:9MGZezeT
>>246 多分ミドルウェア(.NET?)でテーブル名を置換してるだけと思われる
SQLインジェクションで死ねるな。
そのための[]
ユーザとグループがN:Mの関係にあるとします。
create table users (
id serial primary key,
name varchar(100) not null
);
create table groups (
id serial primary key,
name varchar(100) not null
);
create table belongs (
user_id integer not null references users(id),
group_id integer not null references groups(id)
);
このとき、あるグループIDをもとに、そのグループに
含まれるユーザを列挙する場合、方法が2つあります。
-- joinする方法
select * from users
join belongs on belongs.user_id = users.id
where belongs.group_id = ?
-- 副問い合わせを使う方法
select * from users
where id in (select user_id from belongs where group_id = ?)
これって、どちらが効率がいいのでしょうか。
たとえばCPUの実行効率がいいのはこっちだけど、メモリ消費量が少ないのはこっちだとか、
そういうのを教えてください。
joinだろ
SQLは書いたとおりに処理されるとは限りません
実際にどう処理されるかはオプティマイザ次第
>>249 表 T があるとして
"T]; truncate table [T;" ってやられたらどうする?
ホストアプリも環境も不明でそんな話しても無意味
プリペアードステートメントじゃないの?
括弧部分はSQLの一部じゃないからそんなことやっても無駄w
sqli覚えたてでうれしかったとか
>>252 そのページは参考にはなりますが、250の質問については書かれてないようです。
ほかに参考になるページがあれば教えてください。
「SQL join 副問い合わせ 速度」とかでぐぐってるんですが、思うようなページが見つかりません。
そんなのRDBMSの実相によるだろ
両方のプラン見るんじゃだめなの?
SQLだけを見てどっちが早いかなんて解りません
基本を知らん奴に限ってまずパフォーマンスとか騒ぎ出すのが不思議。
>>247 了解です。ありがとうございました。
.netすれで聞いてみます。
プリペアードクエリじゃなくてストリングビルダーとかの気がするなぁ{0}
ってなるとインジェクションも可能になってきそうだけれど。
>>264てか、まだ聞かないとだめなぐらい情報が足りないのか
>>265 すんません、C#は初めてで・・・。
いま、やっと {0} の意味がわかりました。
とほほ。
267 :
254:2012/11/21(水) 02:13:18.28 ID:???
ほら、やっぱり C# じゃねーか。
>>257 は俺に謝れよ。
って言うのは置いといて、
>>266 がどの DBMS 使ってるのか知らんけど、
例えば SQL Server 使ってるなら System.Data.SqlClient の SqlCommand
とか SqlParameter クラスを勉強しておいた方がいいよ。
でないと SQL インジェクションとかエスケープとかで色々苦労するから。
>>267 C#なのは見た瞬間にわかるよ。
やっても無駄だって言ってるだろw
>>268 >やっても無駄だって言ってるだろw
はいはい、君の脳内 DBMS だとダメなんだろうな。
271 :
NAME IS NULL:2012/11/22(木) 16:02:12.28 ID:62kZrm3C
Oracle11gR2で
ID Count
1 3
2 2
3 3
こういうデータを元に
Seq ID
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 3
こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?
Seqはなくてもいい
なんとなく再帰と自己結合をすればいいのかなぁとは思うけど再帰クエリ使ったことないからわかんないや
274 :
NAME IS NULL:2012/11/22(木) 19:32:23.99 ID:eYp+vjTA
過去にOracleのINDEXでWHERE句の順番をINDEXの定義順にしないとINDEXが
使われないとか、複合INDEXの最初の項目を指定しないとINDEXが使われない
と聞いたことがあるのですが、Oracle11で検索してみるとそんなことも
ないように見えます。実際どうなのでしょうか?
例えば、あるテーブルにA,B,Cの複合INDEXが1つある場合に
@WHERE B=X AND A=X
AWHERE C=X
の検索でINDEXが使われるのか?
>>273 With REC(ID, idx, cnt) As
(
Select ID, 0, COUNT From TEST01
Union All
Select ID, idx+1, cnt From REC Where idx+1 <= cnt
)
Select ID, idx From REC Order by ID,idx;
こんな感じでできました。ありがとう!
>>274 昔のDBMSではそういうこともあったけど今どきのDBMSは賢いからな
>>274 なので、質問したりするときにはバージョンが大事だったりするんです。
278 :
NAME IS NULL:2012/11/22(木) 20:34:57.16 ID:eYp+vjTA
すると、Oracle11であるテーブルに↓のような
INDEXを作っていた場合
INDEX1 : A,B,C
INDEX2 : B,C,A
INDEX3 : C,A
INDEX4 : C,B,A,Z
INDEX4だけあれば、他は削除しても良い
という結論になりますでしょうか?
>>274 「そんなこともないよう」ってのはどうやって確かめたの?
実行計画見たなら質問するまでもないと思うけど。
例えばAだけを条件に検索する場合、
INDEX4でもテーブルフルスキャンよりは速いけど
INDEX1よりは遅い、というようになるのが普通。
(データのばらけ具合(カーディナリティ)にもよるので一概には言えんけど。)
その差が許容できるかとか、インデックスの数が多いと更新が遅くなることとか、
いろいろ考えてベストなバランスにもっていくのがチューニングという作業。
それと、
>>278の思想だとテーブルにあるすべての列をインデックスに入れればいい
とかいう考えに行き着いて、その結果テーブルスキャンよりインデックススキャンのほうが
遅いなんてことにもなりかねない。
281 :
NAME IS NULL:2012/11/24(土) 16:35:37.91 ID:SfsAXaIB
SQL Server 2000においてです。
テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのに
Or で接続する以外に検索する方法はありますか?
普通?に考えれば以下の方になるかと思いますが、これを簡易的?にインデックスが利く状態で書き換えたい。
> SELECT *
> FROM Tablehoge
> WHERE (電話番号="0123") OR (携帯番号="0123") OR (FAX="0123")
なので以下の様なものは却下になります。
> SELECT *
> FROM Tablehoge
> WHERE "|" & 電話番号 & "|" & 携帯番号 & "|" & FAX & "|" Like "*|0123|*"
where '0123' in (電話番号, 携帯番号, FAX)
かな
インデックスが効くかどうかは知らない
283 :
281:2012/11/24(土) 17:03:55.92 ID:???
>>282 うわ、目からうろこ。
そんな事も出来るんだ。全然そんな発想無かった。
正直、騙されてるなと思いつつテストしました。thx!
284 :
281:2012/11/24(土) 17:16:02.14 ID:???
あ、でもインデックスは使われない様だ。
と言うか OR句でも使われて無かったようだ…。
285 :
281:2012/11/24(土) 17:25:31.36 ID:???
>>284 訂正。
インデックスはちゃんと利用されていました。。
ぐぬぬ
>>282の書き方知らんかった
データベーススペシャリストのこの俺が・・・不覚 ガクッ
遅くなる
IN はなるべく使うなってばっちゃんが言ってた
オプティマイザが貧弱だったころのバッドノウハウ
290 :
NAME IS NULL:2012/11/25(日) 12:57:19.58 ID:ITwOfUhV
Orが駄目な理由は?
インデックスも知らない人ですか?
ご教授ください
■ACCESS 2010
・テーブルA
カラム:key1,key2,key3,key4,data1
・テーブルB
カラム:key1,key2,key3,key4,data2
・テーブルC
カラム:key1,key2,key3,key4,data3
・テーブルD
カラム:key1,key2,key3,key4,data4,data5
テーブルA〜Dをkey1〜key4で結合し、以下のテーブルを作成したいです。
・テーブルZ
カラム:key1,key2,key3,key4,data1,data2,data3,data4,data5
よろしくお願いします。
293 :
NAME IS NULL:2012/11/25(日) 16:16:52.40 ID:qYmr0nWB
>>292 試してないけどこんな感じ?
クエリデザイナで十分できると思うけど
SELECT
D.key1
,D.key2
,D.key3
,D.key4
,A.data1
,B.data2
,C.data3
,D.data4
,D.data5
FROM テーブルD AS D
JOIN テーブルA AS A
ON D.key 1 = A.key1
AND D.key 2 = A.key2
AND D.key 3 = A.key3
AND D.key 4 = A.key4
JOIN テーブルB AS B
ON D.key 1 = B.key1
AND D.key 2 = B.key2
AND D.key 3 = B.key3
AND D.key 4 = B.key4
JOIN テーブルC AS C
ON D.key 1 = C.key1
AND D.key 2 = C.key2
AND D.key 3 = C.key3
AND D.key 4 = C.key4
INTO TableZ
http://office.microsoft.com/ja-jp/access-help/HA001231498.aspx
データの状態によって結合もかわりそうだね
295 :
NAME IS NULL:2012/11/28(水) 10:08:24.34 ID:29vczbAS
複数のデータベースからデータを取り出したいのですが
似たようなデータが並んでいて、SELECTと同じようにコンマ区切りでやれば・・・と思い、
SELECT * FROM A,Bと
してみたのですが、取り出せず、
SELECT * FROM A B
としたのですが、Aのデータしか取り出せません。
どのようにすれば両方のデータを取り出せるのでしょうか。
共通のキーでくっつけるではなく、
A あほ
A ばか
A あほ
A あほ
B あほ
B ばか
B ばか
B あほ
のように取り出したいのです。
データベースじゃなくてテーブルじゃないの?
UNIONでつなげられるかな
あと試すにしても、マニュアルとかは見たほうがいいよ。
A,B はJOIN、A B は別名(A AS B の ASを省略したもの)になるからね。
union
299 :
NAME IS NULL:2012/11/28(水) 18:03:08.02 ID:29vczbAS
ありがとうございます、UNION ALLでうまくいきました!
300 :
NAME IS NULL:2012/11/29(木) 11:51:49.95 ID:3d0Pkdso
MS SQL server2012です。
下記のデータベースから
親の値=Aで検索して
子の値を取得し、さらに
子の値=親の値で検索したいのですが
求めたい結果を一気に表示する方法が
あったら教えてください。
親子
AB
BC
CD
XY
Z0
求めいた結果
親子
AB
BC
CD
よろしくお願いします。
>>300です。
すみません。親と子は別の列です。
>>300 with cte as
(
select 親,子 from テーブル where 親='A'
union all
select t.親,t.子 from テーブル t join cte on t.親=cte.子
)
select * from cte
;
>>302 ありがとうございます。
明日試してみます。
PHPのCakePHPというフレームワークである操作をすると、
SELECT `Friend`.`id`, `Friend`.`first_name`, `Friend`.`last_name`
FROM `friends` AS `Friend`
WHERE `Friend`.`first_name` = 'Andy'
AND `Friend`.`id` < 2000
ORDER BY `Friend`.`first_name` ASC
LIMIT 10
というようなクエリが出力されます。
ここで、
`Friend`.`id`
などで使われている、「ドット」にはどのような意味があるのでしょうか?
SELECT id, first_name, last_name
と記述した場合とどう違うのでしょうか?
単なる区切り
カラム名の前についてるなら、テーブル名(かその修飾名)との区切り
その前ならDBMSによっていろいろ。スキーマとかユーザとかデータベースだったり
>>305 複数テーブルの結合の場合には、同じフィールド名が現れることがあるから、
何々テーブルの何々フィールドという言い方が必要になることかあることは
解ると思う。この表現を一般化しただけ。表現として多くの場合冗長だが、
文法上問題はない。
309 :
305:2012/12/01(土) 02:05:23.78 ID:???
みなさん解説ありがとうございます。勉強になります。
SQL辞典の索引を見ても .(ドット) の記述が無く困っていたんですが、
初心者本のテーブルの結合の項目に説明がありました。
考えれば分かりそうなものを。
まあそう言うなって
説明してない本が悪い
313 :
NAME IS NULL:2012/12/05(水) 10:26:01.76 ID:rmdEDUmh
SET型について質問です。
'りんご', 'みかん', 'ばなな', 'めろん'
のようなfruitという名のフィールドがあった時、
'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?
WHERE `fruit` & 5
このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。
MySQL5を使用しています。
どなたかご教授お願いしますm(_ _)m
mysqlのwhere句でchar型の比較を行っているんですが、デフォルトでは大文字と小文字を区別しませんよね?
でも区別しちゃってるみたいなんですが、どっかで初期設定いじれるんでしょうか?
それと、mysqlから読み込んだデータをまたDBに格納する場合って、
またmysql_real_escape_stringとかでエスケープする必要あるんでしょうか?
>>314はすべて解決しました
ありがとうございました。
>>313 DBMSに固有の機能に関する質問はそのDBMSのスレで聞け
って、そっちでこっちに誘導されたのか
普通にandで条件2個書けばいいだけじゃないのか?
マニュアルみたらビット演算できるらしいから101とANDとって101と比べても行けるかもしれん
WHERE (`fruit` & 5 )=5 とか。mysql知らんから知らんけど
317 :
313:2012/12/05(水) 18:57:36.68 ID:rmdEDUmh
>>316 はい、誘導されてこちらへきました
そして、WHERE (`fruit` & 5 )=5 これで上手くいきました!
回答ありがとうございます!
わざわざマニュアルまでみて調べて頂き、本当にありがとうございましたm(_ _)m
318 :
NAME IS NULL:2012/12/05(水) 20:20:24.98 ID:AK9BWENG
MySQL5.1
table1
id,hoge1,hoge2
idが2,4,6の中で、hoge1が1,3,5のidを取得したい。
SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5));
このsqlでidが2,4,6の3件からの検索なりますか?
もっといいsqlありますか?
それでいいと思う
もっといいSQLはちょっと思いつかない
320 :
NAME IS NULL:2012/12/07(金) 13:52:11.17 ID:BCru92G9
複数のテーブルからデータを取るとき、selectを複数回実行するのと
joinを使ってメインのデータとそれに付随するデータをまとめて取得するのはどう使い分けたら良いんでしょうか?
たとえば、日記の記事(メイン)、タグ(サブ)、写真情報(サブ)という感じに
3つのテーブルがあるようなとき日記自体は1件しかないのにleft joinでとると何十行のデータになる場合があると思います
そうするとプログラムで整形する手間が生まれるし
でも、個別にselect()を3回実行するよりもjoinを使った方が速度は早いらしいし…
負荷とか速度とか、この兼ね合いは皆さんどういう風に判断してるんでしょうか
臨機応変
ケースバイケース
気分次第
プログラムがめんどいからこうするってのはないな
やっぱり速度が一番重要ジャマイカ
速いけどリソース食いすぎの場合は別途考える
速いとその分システムへの負荷が軽い(多分)
324 :
NAME IS NULL:2012/12/07(金) 23:53:54.50 ID:BCru92G9
>>321-323 ありがとうございます。
なんと言うか、320に書いた例だと、left joinを使ってやった場合返り値が$retだとして
$diary_title = $ret[0]['diary_title'];
みたいな形になるわけで、なんだか頭が悪そうというか美しくないというか他にやりようないのか
という気になっています
selectを3回実行すればクエリのエラーの確率も返り値のチェックの手間も3倍になるなどと
考えてしまうんですが、テーブル1つが対象のwhere以下の条件が3つ程度の単純なselect文が失敗する可能性なんて
考えるのは非現実的でしょうか?
325 :
NAME IS NULL:2012/12/08(土) 08:35:36.62 ID:PTDEWr+G
select文が失敗…?
デッドロックが激しすぎる状態とか?
テーブル名が途中で書き換えられるとか?
まあ複数回取得される同一の値のデータ量が多ければ
二回に分けるかな そんなに遅くならないよね?ね?と自分を安心させて
>>325,326
ですよね!普通ならありえないですよね
>>327 >まあ複数回取得される同一の値のデータ量が多ければ
そうなんです、「確かに一度でとれるけど、joinすればするほど何度も同じデータ引き出して無駄じゃないのか」
って気分でモヤモヤしてました
安心しました、ありがとうございました
>>324
カラムの数にもよるけどunion使って
3つのテーブルのデータを取得してくる方法も
ありかもね
331 :
NAME IS NULL:2012/12/12(水) 21:40:37.07 ID:DsyuUF3/
table a のaaa カラムを、
table b のbbbカラムで更新したい場合どのように書けばいいのでしょうか?
table a と table b の結びつきはこんな感じとします。
table a.aaaaaaa = table b. bbbbbbb
配列の作成 (select * from table_a order by aaa)
while( 配列がなくなるまで ){
table_a[].aaa = [ select bbb from table_b where table_a.aaaaaaa = table_b.bbbbbbb ]
}
update table_a
こんな感じで作れるのでしょうか?
具体的に、このようなサンプルはありますでしょうか?
table b. bbbbbbbの値が一意に決まるなら、これでどう?
update table_a set aaa = (select bbb from table_b where table_a.aaaaaaa=table_b.bbbbbbb);
>>332 最初それ書こうと思ったけど、
それだとサブクエリ側がtable_aのaaaとtable_bのbbbが等しいレコードが全部結果として出力されるから2レコード以上あったらエラーにならね?
例えばtable_aのaaaが1、2、3、5ってレコードがあって、table_bのbbbが1、2、4、5ってレコードがあったとすれば、
select bbb from table_b where table_a.aaaaaaa=table_b.bbbbbbb
このサブクエリの部分の結果は1、2、5になるからエラーになる気がするし、
仮に1レコードだけだったとしてもtable_aの全てのレコードのaaaカラムがその出力されたbbbに更新される気がする
実際試してないから分からんけど
table_a.aaaaaaa = table_b.bbbbbbb で取得する値が複数あったら、
一体どれでupdateすればいいの?
335 :
NAME IS NULL:2012/12/13(木) 00:53:10.76 ID:b/7p0Yp8
>332-334
回答ありがとうございます。
使っているシステムが、SOQLという擬似SQL言語のようで、
update 〜 set 〜という文をサポートしていませんでした。
1度PCにエクスポートして、mysqlで整形後uploadすることにします。
>>334 bbbbbbb というのは記述ミスでした。
条件式の中も選択するのも bbb なので、
limit 1 というのを最後に付加すれば、1:1になると思ってます。
失礼いたしました。
>>332 その方法でうまくいきました。
ありがとうございました。
該当レコードがあればupdate、なければinsertというのはSQLではどうやるんでしょうか。
-- もしデータがあれば
update foobar set val = :val where date = :date;
-- そうでなければ
insert into foobar (date, val) values (:date, :val);
やりたいことは、過去のデータを日単位で集計して、それをテーブルに入れておくことです。
環境: PostgreSQL 9.1
mysqlだったら
insert into on duplicate key update か replace into で出来るけど
Postgreの方は知らない
340 :
NAME IS NULL:2012/12/14(金) 11:25:45.92 ID:xa+Xo9C8
PKで select してレコードがあれば update なければ insert 以外に何かあんの?
あるかないかで言えばある
>>342 日本語読めない人じゃないならそんぐらい読んで欲しい。
ついでに目に入ったキーワードはあとで役立つこともあるのだから。
>>337 MERGEは?Postgreでサポートしているか知らないけど。
それか、過去のデータ消してないなら
foobarテーブルを全レコード削除してINSERTだけにしたら?
>>343 いや、ざっと読んだうえで、どこに書いてあるのかわからないんだが。
これって9.1のリリースノートだよね?SQLの新機能にそんなのがあるのかと思ったけど、別にかいてなかった。
どうでもいいけど Postgres な
俺的にはPosgre
Oracle8、SQL plusを使って、外部ファイルを読み込ませて
INSERTを行いたいのですが、上手くいきません。
ファイルには、↓のようなINSERT文が500くらいあります。
---------------------------------------------------------------------------------
begin
INSERT INTO HOGE (ID, TITLE, HONBUN) VALUES (1, '連絡用', '○○様
お世話になっております。
○○です。
ご連絡頂いた○○ですが・・・・
以上');
INSERT INTO HOGE (ID, TITLE, HONBUN) VALUES (2, '確認用', '○○様
お世話になっております。
○○です。
○○のご確認の為・・・・
以上');
・
・
・
end;/
---------------------------------------------------------------------------------
このファイルを実行すると
SQL>@hoge_insertsql.txt
567
568
569
570
・
・
・
という感じで数字が出てきてenterを押すと
数字がどんどん増えるだけで、何も登録されていません。
1行だけにして実行しても、数字の数が減っただけでINSERTされませんでした。
begin〜end;/は、改行のある文章を含む場合は必要、という事でつけています。
commonSQLからなら、問題なくINSERTできるので、SQL自体には問題がないのは確認済みです。
OracleもSQL plusも、さらに言うならTera Term自体使ったことがないので
原因がわかりません。
INSERTする方法をご教授して頂ければと思います。
/ はそれでひとつのコマンドなので単独で入力する必要があるはず
てか begin end; も / もいらなくね?
手元にOracle8がないから試せないけど
てかSQLの質問じゃないな
'か)の数があってないんだろ。
自民創価連立政権だけは絶対に阻止しまよう
対立候補に投票しましょう
>>349 ではOracle質問スレの方で聞いてみます。
>>348 改行するのでなく、
commitと入力して改行したらどうなる?
>>353 そういう問題じゃないよ。
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。
あ、まさか、/を;の直後に置いてるのか???
そんなアホはおらんよな。
あほすぐる
つか特定のツールの話はよそでやれ
>>354 INSERT文の最後を「;」じゃなく「/」にしろという事でしょうか?
もう、アホすぎて返事ができないわ。
通りすがりに15秒みてレスするけど、、、
・
・
end;
/
こうでねーの?
SQL*Plusとか知らんけど
>>361 「/」を最後に1行だけにする。
という事ですか。
363 :
NAME IS NULL:2012/12/16(日) 13:04:45.69 ID:HevFQp2W
>>362 >>354に
SQL*Plusは、最後が/だけの行じゃないとブロックの終わりと認識しないだけ。
って書いてるやん
>>363 なるほど!
質問に答えてくれた皆さんありがとうございました。
複数の異なるSQLをまとめて送信し、結果もまとめて受け取ることはできますか。
やりたいことはDBサーバとの通信回数を削減することです。
たとえば
select * from AAA where id = ?;
select * from BBB where value = ?;
select * from CCC order by created_at desc limit 5;
みたいな、互いに関連のないSQLをまとめて送受信することで、通信回数を3回ではなくて1回ですませたいです。
環境はPostgreSQLですが他のDBでできるのであれば教えてください。
そっちのが無駄な気が、、、
同じパターンが多いならView作っちゃえば?
あと通信で時間かかるのは接続だから
つないだまま3つ発行すればいいだけのような
適当なパフォチュー情報を見つけて、さらにその断片を曲解して変な事をやりだすやつがたまにいるな
まあ、できるかどうかはミドルウェアによるし
SQL関係ないからよそで聞いてくれ
>>365 JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
マニュアル読め。
ストアドプロシージャの初歩的な例でそういうのが載ってたりするけど違うのか
>>370 >JDBCでもODBCでも、大抵のものにそういう機能はあるよ。
なんという名前の機能でしょうか。教えてください。
キーワードがわかればぐぐります。
1本のSQLにまとめてしまったら?w
>>367 コネクションプーリングはしています。そのうえで通信回数を減らしたいという要求です。
>>373 たがいに関連のないSQLを1つにまとめることができるなら、教えてください。
a のコラムがitem,val で、bのコラムがid,col1,col2,col3 だとして
select null as id,null as col1,null as col2,null as col3,item,val from a
union
select id,col1,col2,col3,null as item,null as val from b;
>>375 おお、無理やり結果セットを揃えることで、unionを利用可能にしてるんですね。なるほど。
試してみます。ありがとうございます。
>>370 で、その機能はなんという名前なんでしょうか。
自分で調べられないなら必要ない機能だよ。
SQLの問題じゃなくてミドルウェアの問題だって言ってるだろ
スレチだからとっとと引っ込め
UNIONなんて誰でも思いつくのにあえて言わないのは何でだかわかるかw
そっとしておいてやれよ
>>377 >自分で調べられないなら必要ない機能だよ。
機能の名称を教えていただければ、あとは自分で調べます。
>>379 unionは要素の型が同じである集合に対する演算なので、まったく異なる種類のselect文に対して使う発想はなかったです。
これって「誰でも思いつく」ようなものだったんですね。知りませんでした。
カーソル動かして結果をフェッチするのに要する通信回数は考えないのか。
クエリを投げる通信回数を減らすのにどれほどの意義があるのかよく分からん。
通信するたびに電話かけてダイヤルアップするんだろ
話中だと待つのか?
>>381 >>370にマニュアル嫁って書いてあっただろ?
ちゃんと読んだか?
読んでないだろ?
マニュアルを全部読んだらバカでもわかる。
マニュアルも読まずにここで質問するな!
ヒント句指定しても思ったように索引が利用されないんだけど
考えられる原因て表を別名で指定してんのにヒントの中では元の表の名前で入れてしまってる他に
何かある?
ヒント句が働いてない
ヒント句の使用方法が間違ってる
HINTの文法間違いか、テーブルやインデックスの名前の書き間違い。
ほぼ100%このどちらか。
VIEWの場合は実表を指定するんだったかな。
やっぱそうだよね
もう1回見直してみるわ
実装に強く依存する質問をDBMS名も書かずにここで質問とかもう
しかも実際のSQLも書いてないし
ヒントが上手く動作しない原因なんて、どのDBでも大差ないよ。
データベース作成のスクリプトってどうやってデバッグすればいいのでしょうか?
途中でエラーが出て、それを直しても再実行するとそこまでに出来てたものが重複で
エラーが出ます。
全部ドロップするスクリプトを書こうとしたら、出来てないものは削除出来ないと
途中でとまります。
効率の良い手法はないでしょうか? MS-SQLを使ってます。
394 :
NAME IS NULL:2012/12/22(土) 16:59:30.68 ID:Wei1UoXa
データベース作成オプションに if exists とか if not exists とかってMS_SQLにはないん?
何の言語でスクリプト書いてるのか知らんが、ドロップのエラーで
止まらんようにはできるだろ。
>>387 oracle10g以降を使用していて、
オプティマイザがコストベースでアプローチしているからではない?
>>393 PL/SQLだと、動的にテーブルを削除するとしたらこんな感じかな。
これをT-SQLで書いたら良いんじゃね?
declare
SQL_WORK VARCHAR(128);
cursor cur is
select table_name from user_tables;
begin
for cur_rec in cur loop
SQL_WORK := 'drop table ' || cur_rec.table_name;
execute immediate SQL_WORK;
end loop;
end;
/
オプティマイザがコストベースでアプローチしちゃうのを防ぎたいがためのヒントなんじゃないの?
399 :
397:2012/12/24(月) 12:44:54.89 ID:???
>>398 oracle10g以降ではルールベースのサポートをしていないから、
ヒント句を書いても実行計画を見るとコストベースになっているんじゃないかな。
>>387に関しては、統計情報取ったら改善されると思う。
違っていたらすみません。
ORACLEの話はORACLEのスレでやれよ
元質問者はDBMS明記してないし
そうなんだサンクス
ヒント句って実行計画を無理やり捻じ曲げるようなものだと勘違いしてた
A列 B列
001 002
004 009
007 005
こういうテーブルのA列 B列から、
001
002
004
009
007
005
と交互に抜き出す方法はありませんか?
403 :
402:2012/12/26(水) 17:11:37.48 ID:???
UNIONでできました
解決しました
なんでunionでできたのかわからんな
unionでも何でもorder byをつけないと順序は保証されないが
ORDER BY でどうやって1, 2, 4, 9, 7, 5って並べるのよ?
1, 2, 4, 5, 7, 9じゃないんだぜ。
select val from
(
select to_char(ROWID)+'1' as num, A as val from table
union
select to_char(ROWID)+'2' as num, B as val from table
)
order by num;
でどうだ
>>409 Oracle前提で言うと、ROWIDじゃなくて、ROWNUMだろ。
ROWNUM*2+0とROWNUM*2+1をunion allしてsortだ。
>>408 order byつけなければ順序が保証されないうえ、
order byでは解決できない内容なのに、
unionでできたのが何でかわからん
って話でしょ?
実は「交互に」は大して重要な要件じゃなくて
単にA列とB列を列挙したかっただけのような気がしなくもない
>>412 俺もそう思う。
なのでorder byじゃなくてunionで正解だと思う。
>>408 空気脳は日本語も理解できないのかよ?w
>こういうテーブルのA列 B列から、
table名をXXとして、mysqlで
select right(concat('00',A*x+B*y),3) from XX,(select 1 as x,0 as y union select 0 as x,1 as y) as d;
select if(x=1,A,B) from XX,(select 1 as x union select 0 as x) as d;
>>415 数字しか通用しない上に順序も保障されないんだが?無駄に複雑にしてるだけだな
>>416 それも順序が保証されない
やってみて上手くいってるように見えるかもしれないが、それはたまたま
XXとDの直積のテーブル結合の方法をヒントとかで制御できるなら
望みの順番で出力されるかな?どっちにしろ保障外だが
列Aがユニークかつ元の表が列Aの順で出力されているって前提なら
汎用的なSQLで書くなら
select data from
(select A as key1,0 as key2,A as data from table
union all
select A as key1,1 as key2,B as data from table
) as t
order by key1,key2
で行けるんじゃね?
それ以外だともうちょい条件付けないと汎用的なSQLでは厳しいんじゃないかな
ROW_NUMBERは標準SQLらしいけど使えないDB結構ありそうだし
419 :
NAME IS NULL:2012/12/27(木) 21:35:38.19 ID:IOSEO7j3
INSERT INTO テーブル
SELECT
あ,
い,
う,
え,
お
FROM テーブル
WHERE EXISTS (SELECT * FROM テーブル WHERE 条件)
ここで「お」の値を、AND EXISTS (SELECT * FROM テーブル WHERE 条件)の条件が成立する場合は特定の値(仮に定数)に、
そうでない場合はNULLにするには、どうすればいいのでしょうか?
DBはSQL Serverです
421 :
NAME IS NULL:2012/12/28(金) 12:35:12.17 ID:ClRuT7DF
>>420 CASEでもなんでもいいです
とにかくおを条件文で変える方法が知りたいです
MS SQL SERVER2012です。
"121228"で検索して
ハイフン以下の数字で
一番大きいもの'121228-12'を求めたいです。
列1
121221-1
121228-1
121228-9
121228-10
121228-11
121228-12
求めたい結果:121228-12
以下の式だと"121228-9"になってしまいます。
WHERE 列1 LIKE ('122428%')
ORDER BY 列1 DESC
どうすればいいでしょうか。
よろしくお願いします。
>>421 だからCASE使えよ
>>422 明らかに設計が間違ってるが、マイナスを考慮しないなら
-を小数点に変換して数字として扱えば行けるんじゃね
create table tttt
(id varchar(10));
insert into tttt values
('121221-1'),
('121228-1'),
('121228-9'),
('121228-10');
select id , max(cast(mid(id,locate('-',id)+1,2) as SIGNED)) as hfn from tttt;
+----------+-----+
| id | hfn |
+----------+-----+
| 121221-1 | 10 |
+----------+-----+
1 row in set
locateで'-'以降の文字列を取り出してcastで数値に変換した上でmax関数で
取り出し
sqlserverに上記の関数があるかどうかしらんけど
>>422ですが
レス有難うございます。
CastやMidというものを知ることが出来たので
以下のようにやって並び順は求めるものが出来ました。
SELECT 列1,CAST(SUBSTRING(列1,8,2) AS INT) AS 列2
FROM データベース
WHERE 列1 LIKE('121228%')
ORDER BY 列2 DESC
これで並び順は
121228-10が先頭に来たのですが
列1 列2
121228-10 10
上記のように列2が邪魔です。
どうにかなりますでしょうか?
order byのところに式は使えないんだっけ?
けどいらんのだったらつかわなきゃ良いだけの話では?
つかorder byに別名指定できるのか?
2012から仕様変わったか?
>>426 これじゃだめか?
SELECT 列1 FROM データベース WHERE SUBSTRING(列1,8,2) = (SELECT MAX(CAST(SUBSTRING(列1,8,2) AS INT)) FROM データベース);
>>422です。
色々有難うございました。
>>429 ウチのデータベースの形が悪いせいだと思うのですが
上手くいかなかったので、邪魔な列はそのままで使おうと思います。
431 :
NAME IS NULL:2012/12/29(土) 19:30:46.57 ID:xudNrque
UPDATE list SET target=1 WHERE id=1
というので更新をかけたいのですが、id=1が複数あります。
どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか?
最後に「LIMIT 1」とつけたら
SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが
こういったことが可能であれば構文的にご指摘いただけないでしょうか。
他に行を区別できる項目が無ければ基本的に無理
DBMSによってはそう言う列や関数があるかもしれん
update list
set target=1
where ユニークキー = (select ユニークキー from list where id=1 limit1)
ユニークキーも設定してないゴミテーブルなら知らん
>>433 id=1 and ユニークキー=aaa
>>431 id=1が複数あるなら、
全レコードをいったん取得してから削除し、
必要なデータだけ修正して、
全レコードインサートする
なんてするのかな?
そもそもidが複数あるのがよくわからないが。
>>431 何をしたいのかわからないけど、↓で
>>431は満たすと思う。
update list SET target=1 WHERE rowid =(select max(rowid) from list where id = 1);
DBの種類も書いてないのになぜrowidが使えると思うのか。
limitが使えないってことは少なくともmysqlじゃなさそうだが。
汎用的に行くなら
UPDATE list T
SET target=1
WHERE id=1
AND NOT EXISTS (
SELECT * FROM list
WHERE 主キー<T.主キー
AND id=1
)
かな。
主キーが複合キーならそれなりに書き換えて。
こうだな。
update list
SET target=1
WHERE ユニークキー =(select max(ユニークキー) from list where id = 1);
ユニークキーが設定してないようだと、カーソルを使うしかないかなぁ。
begin;
declare c cursor for select * from list where id=1;
fetch c;
update list set target=1 where current of c;
commit;
limitが使えるDBMSの場合は、な。
エラーメッセージから見て
>>431 は、MySQL だろ。
>>440,443
UPDATEのテーブル名に別名付けれるのは汎用的じゃないと思うぞ
449 :
NAME IS NULL:2013/01/02(水) 06:17:14.32 ID:kX4zlPod
450 :
NAME IS NULL:2013/01/02(水) 13:38:43.87 ID:gqHbCqyn
現在、ゲームのフィールドとそれに対応する出現モンスターのデータベースを作っています。
折角なのでいろんなゲームに対応できるようにしたいと思ったのですが、最大登場数がいくつになるかがわかりません。
カラム数が決まっていない場合、どういう風にデータベースを作るのが良いでしょうか
ID | GameID | Map | Monster1 | Monster2
--+-------+-----------+---------+-----
1 | 123 | Forest |
2 | 456 | Grassland |
3 |・・・
現在、テーブルのイメージはこんなかんじです
Monsterをあらかじめ大量に作っておくしかないでしょうか
他にいい方法はありますか?
正規化を勉強するのがいいと思う。
SQL関係無いからこの辺で、、、
452 :
NAME IS NULL:2013/01/02(水) 13:54:21.28 ID:gqHbCqyn
ありがとうございます。スレ違いすいませんでした。
ゲームじゃないけど、
ここでいうモンスターみたいなのが1カラムにカンマ区切りで入ってるデータベースを知ってる
正規化を見て理解しました。
フィールドごとのテーブルを作れば解決だったんですね。ありがとうございました。
>>454 それだとそのテーブル名をどこから引いてくるかという問題が発生する。
456 :
NAME IS NULL:2013/01/03(木) 19:05:00.07 ID:2T2n9/75
mysql-slow.logにくっそ重いSQLが記録されております。
mysql Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2
SELECT *
FROM `imgcache`
WHERE ( `rank` >= 0 ) AND ( id IN (SELECT MAX(id) FROM `imgcache` GROUP BY size, md5, mime) ) ;
topでみるとcpuがほぼ100%に貼り付いており
4717 rows in set (1 min 14.98 sec)
です。
負荷を軽くする方法はないでしょうか?
group by や max を使わないで済むようにテーブル構造変えればいいじゃない。
>>456 実行計画みてみないと何とも言えないが
一般的にはrankか、size,md5,mimeにインデックス張る
INをやめて相関問い合わせで=にしてみたら早くなるかもしれん
それ以上はRDBMS実装に大きく依存するからmysqlのスレで聞け
459 :
NAME IS NULL:2013/01/03(木) 21:14:11.16 ID:2T2n9/75
ヒントをありがとうございます。
ググりながら回答をフォローしております。
mysql> DESCRIBE imgcache;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uri | varchar(255) | YES | MUL | NULL | |
| host | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| size | int(11) | NO | MUL | NULL | |
| md5 | char(32) | NO | | NULL | |
| width | smallint(6) | NO | | NULL | |
| height | smallint(6) | NO | | NULL | |
| mime | varchar(50) | NO | | NULL | |
| time | int(11) | NO | MUL | NULL | |
| rank | smallint(6) | NO | | 0 | |
| memo | text | YES | | NULL | |
+--------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)
maxを使わない→インデックスを作る?
mysql> CREATE INDEX idx_id on imgcache(id);
あまり変わらず。
group byの解決策→まだわかりません。
ただ、解決策の載ったブログがヒットすることはわかりました。
数日かけてそうしたブログを理解していこうと思います。
460 :
NAME IS NULL:2013/01/03(木) 21:15:27.93 ID:2T2n9/75
>>458 ありがとうございます。
学習が進んだら、mysqlスレでも聞いてみます。
idは主キーなんだから、たぶんシステムが勝手にインデックス張ってるだろ
rankと(size, md5, mime)にインデックス張れよ
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| data | int(11) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
のとき、id=1とid=2が共通して持ってるdataのrowを取得するSQLってmysqlで書けますか?
insert into table values(1,100);
insert into table values(1,200);
insert into table values(1,300);
insert into table values(2,200);
みたいなデータのときは
+------------+--------------+
| id | data |
+------------+--------------+
| 1 | 200 |
| 2 | 200 |
+------------+--------------+
といった感じです
条件がたりないからこれだけじゃ駄目だとは思うけど、
select id,data from table where data in (select data from table group by data having count(data) > 1) order by data;
こんなのとか
464 :
462:2013/01/04(金) 05:41:56.30 ID:???
>>463 例えで示したデータが悪かったです
insert into table values(1,100);
insert into table values(1,200);
insert into table values(1,300);
insert into table values(2,200);
insert into table values(2,400);
insert into table values(3,200);
insert into table values(3,300);
みたいなときもid=1とid=2の人で
+------------+--------------+
| id | data |
+------------+--------------+
| 1 | 200 |
| 2 | 200 |
+------------+--------------+
という結果が出てくる、という意味でした。あくまで指定した二人のデータに注目します
>>463さんのsqlだと上のinsertでやった場合id=3の人のも出てきてしまうので・・。
僕も考えていますが単純なselect文しか使ってこなかった分際なので苦戦しておりますw
統計情報
ってググっても統計情報を取得して〜とか統計情報を利用して〜
とかそんなようなことしか書いてないんだけど
具体的に説明すると何なん?
データの格納情報とかそういう意味?
>>454 正規化とかいうならば、
GameTable
---------------
GameID | Game
MapTable
------------------------
MapID | GameID | Map
MonsterTable
-----------------------------
MonsterID | MapID | Monster
ではないかな。
>>464 たとえばこんなんとか
select T1.id,
T1.data
from TableName T1
inner join
TableName T2
on T1.data = T2.data
where T1.id in (1, 2)
and T2.id in (1, 2)
and T1.id <> T2.id
;
>>465 データのサイズ(レコード数、レコード長など)と
カーディナリティ(データのばらけ具合)が基本
DBMSによってはさらに詳細な情報をとったりするし
とるかどうか選べたりもする
468 :
NAME IS NULL:2013/01/04(金) 09:21:04.26 ID:BAIPs7Pp
469 :
462:2013/01/04(金) 15:40:47.93 ID:???
>>467 ありがとうございます、解決しました
TableNameとT1,T2の意味がわかりませんでしたが参考にして少し編集し、fromにサブクエリで
id=1の表(T1)inner join id=2の表(T2) on T1.data=T2.dataでwhere句は何も書かずにできました
出てくるデータの形が望んでいた形式じゃありませんでしたがプログラム側で簡単です。
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。
これを一括で
Taro, Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。
すみません、mysqlの質問なのですが、
データベースにいろんな人の名前が入っているのですが、7割くらいの名前が
Yamada, Taro
というように、姓カンマ名の順番で登録されています。
これを一括で
Taro Yamada
というように名スペース姓の順番に変換できる神sqlはありませんでしょうか。
よろしくおねがします。
substr使えよ。
多分mysqlにもあるだろう。
t-sqlでselectで時間のかかる処理を
一定時間でエラーさせたいのですが
どうすればいいのでしょうか?
3割はhanako, yamadaで入っているのか?
Taro という苗字が無いなどと
どうして言えるんだ
カンマが入ってるものは全て逆順、ということなの?
MySQL5.1
・テーブルデータ
table1
name value
--------------------
aaa a
aaa b
aaa c
bbb b
bbb c
ccc a
ccc c
・欲しい結果
bbb
table1から、valueにaが無いnameを抽出したいです。
お願いします。
select name from table1
where name not in (select distinct name from table1 where value='a');
幾つかフィールドを持つ検索UI作ってるんだけど、各々のフィールドに入れた値によって他のポップアップに出てくる値を絞りたいんだけど、
そう言うのって普通どうしてますか?
何の話?
何とかSQL、とかの製品名の話なら専用スレでどうぞ。
っていうかアプリ側の話だろうに。
>>481 全部持ってきて随時ゴリゴリするか、データ構造を工夫するか、毎回持ってくるか状況によるけど
次からスレ違いしないでね
485 :
481:2013/01/10(木) 11:01:05.94 ID:??? BE:2112526875-2BP(0)
ありがとさんです。
sqlでwhereなしに全部持ってきて、後は配列操作で何とかするのが王道ですか。
検索フィールドの項目を選択する毎にwhereで条件追加とかするのかと思ってました。
話通じてないし
ワロタ
488 :
NAME IS NULL:2013/01/14(月) 15:21:55.19 ID:2FyNVYyH
パワハラ犯罪にたいする刑事罰(※本投稿のコピペ歓迎です)
人事原則
1 現行法では、社員が仕事を怠けたり、能力不足、就業規則違反、目標を達成できなくても解雇をしたり叱責することは違法です。どんな駄目社員、嘘つき社員、怠け者も定年まで解雇が違法なのが現行の正社員制度です。
2 パワハラは社風にあわない社員、成績の振るわない社員を自主退職に追い込む言わば人事的措置として用いられることが多い。
※違法な解雇の和解金相場は、労働審判で3ヶ月、通常裁判で1年以上の報酬、さらに社員が和解を拒めば復職が可能です。弁護士への着手金は12〜15万円+20%の和解金、和解拒否なら20〜50万円程度。
人事部・ホットライン・御用組合へ直訴
メリット: 一時的緩和や人事異動
デメリット: 役員へ情報筒抜け、危険分子の烙印(情報漏洩がホットライン直訴者に多いのは人事部の常識)、パワハラ放置で自主退職に追い込まれる
民事訴訟・調停(労働審判)
メリット: 損害賠償
デメリット: 裁判費用、解雇措置、民事不介入で刑事事案化を阻止、長期係争、パワハラ上司の継続雇用
刑事告訴
メリット: 1パワハラ上司の解雇・懲戒、または2多額の和解金、1と2どちらでも被害者の雇用は維持
デメリット: 人事異動(出世コースから外れる)
◎録音は一方の当事者が取る限り合法です。※加害者に録音の同意を求める必要はありません。
◎告訴受理後の和解金は加害者の資産・収入に応じて変えてください。犯罪者の昨年の年収の半額程度×最大懲役年数が妥当です。
◎パワハラの被害についての告訴は1侮辱罪2脅迫罪3強要罪4威力業務妨害罪5傷害罪の順序で行ってください。警察・検察の協力(犯罪者の自宅・職場の強制捜査、留置所勾留)により罪の立証が楽になります。
◎刑事告訴した社員を解雇したり処遇面で著しい差別を行うことはないでしょうが、出世や管理職以上の昇進の可能性はあきらめるべきでしょう。
◎刑事告訴は民事訴訟と違って裁判による被害者への2次被害にありません。検察庁が被害者に代わって訴えをおこすので、無料で、時間と手間も告訴状をかくことと音声録音を残すだけです。
◎和解契約(公正証書・即決和解)では告訴した事実は秘匿事項となります。犯罪者が秘密保持契約を違反した場合の損害賠償金は、最低5000万円〜にしましょう。
SQL SERVER2012です。
列1をaとbで検索して
新しく列2,列3を作成。
列2にaの値を
列3にbの値を表示することが
可能ならばやり方を教えてもらえませんでしょうか。
列1
a
b
a
b
c
求めたい結果
列2 列3
a b
a b
宜しくお願いします。
>>490 別の行のデータを同じ行に表示したいなら
どの行とどの行をどういう条件で同じ行にするのか
を決める必要がある
>>491 どういう条件で同じ行にするのか決めるとは
こんな感じでしょうか。
元のデータに列0を追加
列0 列1
1 a
2 b
2 a
1 b
2 c
求めたい結果
列0 列2 列3
1 a b
2 a b
>>492 じゃあさらにこういうデータだったらどういう結果がほしいのか
列0 列1
1 a
2 b
2 a
1 b
2 c
1 a
3 a
ついでに、以下ならどういう結果がほしいんだ?
列0 列1
1 a
2 a
1 b
2 c
何がしたいか全くわからん
aとかbとかってのは、実際には何らかの値が入ってるのか?
だったらaとかbで検索って、検索する値はどっからもってくるんだ?
この説明だと select a,b で良いんじゃねえのかと思うぞ
>>491-495 色々すみません。
おっしゃる通り質問の仕方が変でした。
元のデータ
登録年月
2011/04
2011/04
2011/05
2011/05
2012/04
2012/05
2012/05
自分のできるやり方
SELECT
登録年月,COUNT(1) AS 件数
FROM DB
WHERE 登録年月 IN ('2011/04','2011/05','2012/04','2012/05')
GROUP BY 登録年月
↑から求められる結果
登録年度件数
2011/04 2
2011/05 2
2012/04 1
2012/05 2
実際に求めたい結果は
月度 2011年度 2012年度
04月 2 1
05月 2 2
何度も済みませんがよろしくお願いします。
>>497 ありがとうございます。
>>5 見てませんでしたすみません。
SQL文
SELECT 登録年月,
SUM(CASE WHEN 登録年月 > '2012/03' AND 登録年月 < '2012/05' THEN 1 END) AS '12年度',
SUM(CASE WHEN 登録年月 > '2011/03' AND 登録年月 < '2011/05' THEN 1 END) AS '11年度'
FROM DB
GROUP BY 登録年月
ORDER BY 登録年月
得られた結果
年度12年度11年度
2011/04NULL2
2011/05NULL1
2012/041NULL
2012/052NULL
これをSQLで、下のようにまとめることは可能でしょうか。
月度 2011年度 2012年度
04月 2 1
05月 2 2
年で別れてしまっている行を
月だけでまとめたいのですが。
500 :
NAME IS NULL:2013/01/16(水) 22:08:12.22 ID:7bZDmpX4
>>498 取り出すための単純なデータに分解する事が大事
SELECT
SUBSTRING(INS_YM,1,4) as INS_Y,
SUBSTRING(INS_YM,6,2) as INS_M
FROM
INS_YM_TABLE
これをもとに月別の年の集計をすればいいわけだから
SELECT
INS_M,
SUM(CASE WHEN INS_Y = '2011' THEN 1 ELSE 0 END) as SUM_2011,
SUM(CASE WHEN INS_Y = '2012' THEN 1 ELSE 0 END) as SUM_2012
FROM
(
SELECT
SUBSTRING(INS_YM,1,4) as INS_Y,
SUBSTRING(INS_YM,6,2) as INS_M
FROM
INS_YM_TABLE
) as SUM_TABLE
GROUP BY
INS_M
ORDER BY
INS_M
でいいのでは
501 :
NAME IS NULL:2013/01/16(水) 22:08:48.39 ID:7bZDmpX4
年月が別の型ならそれをふまえてね
■DBMS
SQL Server 2012
■テーブル構造
TABLE A
項目1 項目2 項目3 項目4 商品コード 金額
TABLE B
商品コード 分類
(TABLE AとBは商品コードでJOIN)
■欲しい結果
TABLE Bにある分類毎の、TABLE Aの金額とTABLE Aの件数
ただし、件数は項目1、項目2、項目3の重複を除いたもの
(金額は単純合計でいいが、件数は項目1〜3が同じレコードは1件としてカウントしたい)
金額だけであれば分類でGROUP BYすればいいだけですが、
同時に上記の条件で件数を出そうとするとどうしたらいいか分かりません。
よろしくお願いします
>>502 まずテーブルAのgroupbyで金額のsumと件数1を返すクエリを作って、それとテーブルBを結合すればいいのでは
>>500 すごい勉強になりました。
有難うございました。
>>502 多分こんな感じで
WITH
AB AS (SELECT A.*,B.分類 FROM A JOIN B ON A.商品コード=B.商品コード),
BS AS (SELECT DISTINCT 分類,項目1,項目2,項目3 FROM AB)
SELECT DISTINCT
分類,
(SELECT SUM(金額) FROM AB WHERE 分類=B.分類) AS 金額合計,
(SELECT COUNT(*) FROM BS WHERE 分類=B.分類) AS 件数
FROM B
507 :
NAME IS NULL:2013/01/17(木) 19:55:25.20 ID:Q5aJSjp6
>>505 質問の答えじゃなくヒント程度なんだから
そこから答えが導けないならスルーされてもしょうがないんでは
レスが欲しいなら欲しいなりの回答したほうがいいかと
508 :
NAME IS NULL:2013/01/17(木) 19:59:38.38 ID:EwS78HY0
パワハラ犯罪にたいする刑事罰(※本投稿のコピペ歓迎です)
人事原則
1 現行法では、社員が仕事を怠けたり、能力不足、就業規則違反、目標を達成できなくても解雇をしたり叱責することは違法です。どんな駄目社員、嘘つき社員、怠け者も定年まで解雇が違法なのが現行の正社員制度です。
2 パワハラは社風にあわない社員、成績の振るわない社員を自主退職に追い込む言わば人事的措置として用いられることが多い。
※違法な解雇の和解金相場は、労働審判で3ヶ月、通常裁判で1年以上の報酬、さらに社員が和解を拒めば復職が可能です。弁護士への着手金は12〜15万円、和解拒否なら20〜50万円程度。
人事部・ホットライン・御用組合へ直訴
メリット: 一時的緩和や人事異動
デメリット: 役員へ情報筒抜け、危険分子の烙印(情報漏洩がホットライン直訴者に多いのは人事部の常識)、パワハラ放置で自主退職に追い込まれる
民事訴訟・調停・労働審判
メリット: 損害賠償
デメリット: 裁判費用、解雇措置、民事不介入で刑事事案化を阻止、長期係争、パワハラ上司の継続雇用
刑事告訴
メリット: 1パワハラ上司の解雇・懲戒、または2多額の和解金、1と2どちらでも被害者の雇用は維持
デメリット: 人事異動(出世コースから外れる)
◎録音は一方の当事者が取る限り合法です。※加害者に録音の同意を求める必要はありません。
◎告訴受理後の和解金は加害者の資産・収入に応じて変えてください。犯罪者の昨年の年収の半額程度×最大懲役年数が妥当です。
◎パワハラの被害についての告訴は1侮辱罪2脅迫罪3強要罪4威力業務妨害罪5傷害罪の順序で行ってください。警察・検察の協力(犯罪者の自宅・職場の強制捜査、留置所勾留)により罪の立証が楽になります。
◎刑事告訴した社員を解雇したり処遇面で著しい差別を行うことはないでしょうが、出世や管理職以上の昇進の可能性はあきらめるべきでしょう。
◎刑事告訴は民事訴訟と違って裁判による被害者への2次被害にありません。検察庁が被害者に代わって訴えをおこすので、無料で、時間と手間も告訴状をかくことと音声録音を残すだけです。
◎和解契約(公正証書・即決和解)では告訴した事実は秘匿事項となります。犯罪者が秘密保持契約を違反した場合の損害賠償金は、最低5000万円〜にしましょう。
509 :
NAME IS NULL:2013/01/17(木) 21:09:44.32 ID:Q5aJSjp6
>>502 こんな結果か?
SELECT
テーブルB.分類,
SUM(テーブルA2.金額合計1) as 金額合計2,
SUM(テーブルA2.件数1) as 件数2
FROM
テーブルB
INNER JOIN
(
SELECT
項目1,
項目2,
項目3,
商品コード,
SUM(金額) as 金額合計1,
1 as 件数1
FROM
テーブルA
GROUP BY
項目1,
項目2,
項目3,
商品コード
) as テーブルA2
ONテーブルA2.商品コード = テーブルB.商品コード
GROUP BY
テーブルB.分類
ORDER BY
テーブルB.分類
510 :
NAME IS NULL:2013/01/17(木) 22:37:18.46 ID:IiOhCqTn
T-Sql使ってます
複数の会社へ順番に接続して
DOSバッチからクエリ動かして結果を収集してるのですが
通信や処理が重くて、時間かかる所があります
一分ぐらいで取得不可なら次の会社へとするようにする方法は無いでしょうか?
1分で取得不可なら飛ばしていいようなどんな情報を収集しているのか聞かないと
答える気にもならない
スレ違い。
>>511 会社の売り上げとかです
大きなデータではないです
一分は例えばの話です
>>510 接続タイムアウトクエリタイムアウト通信タイムアウトあたりの設定を見直せばいいんじゃないかな。
SQLと関係あるのか?w
516 :
502:2013/01/18(金) 07:01:14.79 ID:???
>>503,506,509
ありがとうございます。
急な出張に出ることになってしまい
実際にクエリをまわせるのが週末になってしまいそうですが
確認でき次第、再度ご報告しますね
519 :
NAME IS NULL:2013/01/22(火) 12:15:36.71 ID:AhVjLGTW
DB MySQL5.1
classテーブル
id gakunen class
1 1 1
2 2 2
3 2 1
4 1 2
seitoテーブル
id class_id namae tokuten
1 1 tanaka 90
2 2 maeda 95
3 3 aoki 70
4 4 suzuki 65
5 4 ikeda 70
6 3 furuta 65
7 2 katou 85
8 1 kimura 95
9 3 satou 60
gakunen class namae tokuten
1 1 kimura 95
1 2 ikeda 70
2 1 aoki 70
2 2 maeda 95
1 1 tanaka 90
1 2 suzuki 65
2 1 furuta 65
2 2 katou 85
2 1 satou 60
クラステーブルと生徒テーブルがあって
1年1組の得点1位、1年2組の得点1位、2年1組の得点1位、2年2組の得点1位、
1年1組の得点2位、1年2組の得点2位、2年1組の得点2位、2年2組の得点2位、
1年1組の得点3位・・・
というふうに学年クラス順に順位の高い生徒を並べ替えたいです
よろしくお願いします
漠然とした一般的な話なんですが、インデックスに関して教えて下さい
例として販売データテーブルがあったとします。
そして、PKが商品コード、販売日、担当者コードとして、この時、商品コード単体で
検索をする時に商品コードだけにインデックスを設定すれば、その効果が
ある…と考えて良いんですか?
>>519 MySQLだと一旦クラス内での順位をつけてから自己結合かなぁ。
あと、別に縦を横にしたいわけじゃないよね?
>>520 よく分からない。インデックスを作成しなければインデックスの効果は得られないよ。
商品コードを含んでいるPKがインデックスの代替になるかということであれば、RDBMS次第
520です。
>>521さん、ありがと。
もう少し勉強しますm(__)m
>>519 ずいぶん不思議なテーブル設計してるな。
正規化したつもりになって出来てない感じか?
・ なぜ namae と tokuten が2か所出てくるんだ?
・ 生徒テーブルに得点入れるのは違わないか?
・ 他に教科テーブル、得点テーブルが必要になるんじゃないか?
→ 名無しのテーブルは得点テーブルなのか?
・ tokuten は学年に関係なく同じ尺度で測れるものなのか?
→ でないとしたら、classテーブルで学年をごちゃまぜにする必然性はない。
というか学校の宿題かなにかか?
写し間違いじゃないとしたらこんなちんけな問題作る講師に文句を言ってやれ。
写し間違いだったら正確に書き直してみな。気のりしたら相手してやる。
実用品として考えてるとしたら、顔を洗って出直せレベルだな。
その場合でもそう書いてくれれば、気のりしたら相手してやる。
とりあえず、テーブル名が書いてない最後のテーブルだけあれば抽出できる。
SELECT
(SELECT count(*)+1 FROM 名前不明のテーブル AS t11l WHERE t11l.tokuten>t11.tokuten ) AS jyuni,
gakunen, class, namae, tokuten FROM 名前不明のテーブル AS t11
WHERE gakunen=1 AND class=1 ORDER BY tokuten;
※ t11 は 1-1のテーブルの意味で仮につけた名前。 t11lはローカル(内部だけ)で使うヤツの意味
単にクラス毎を縦に並べるだけなら、UNIONで全クラス分並べればいい。
順位でJOINすればおまいさんの書いた表(?)の様に出せるが、クラスの人数が不揃いだとまともに出ないだろう。
最大クラス人数導いて、その分順位番号並べるクエリ用意して、それに LEFT JOIN させりゃインジャネ?
>>523 ツッコミまち?
3つめは彼なりに結合抽出した結果だと思うんだけどな。
> ・ なぜ namae と tokuten が2か所出てくるんだ?
→元テーブルと抽出結果なので。
> ・ 生徒テーブルに得点入れるのは違わないか?
→現仕様では十分正規化されたものかもしれない。
> ・ 他に教科テーブル、得点テーブルが必要になるんじゃないか?
→上に同じ。
> → 名無しのテーブルは得点テーブルなのか?
→結合結果に見える。
> ・ tokuten は学年に関係なく同じ尺度で測れるものなのか?
→求めたい結果は学年、クラスごとに1位から順番に表示。尺度が学年に関係するかどうかは結論に影響しない。
> → でないとしたら、classテーブルで学年をごちゃまぜにする必然性はない。
→サロゲートキーが欲しかった(または練習した)だけかもしれない。
> 気のりしたら相手してやる。
→気のりしたら他にもつっこんでやる。
525 :
524:2013/01/22(火) 18:30:15.67 ID:???
ああ恥ずかしい。
結合抽出した結果じゃなくて、単に求める結果だな。ごめんごめん。
求める結果の割に得点順にもクラス順にもなってないのはなぜ?
527 :
519:2013/01/22(火) 20:09:13.55 ID:???
書き方が悪く伝わらなかったみたいですみません。
524さんの言うとおり一番下のテーブルみたいなのはテーブルじゃなくほしい結果です。
クラステーブルがごちゃ混ぜになってるのは
今似たようなのに困ってて
学校として簡素化?して仮に作ってみたからです。
実際困ってるのはclassテーブルが5000行くらいあってseitoテーブルが10万行くらいあります。
現状自分も523さんみたいに生徒の順位をふっていってるんですが重くなりすぎてまともに動かなくなってきたので
質問しました。
よろしければお願いします。
やりたいことは分かるがなんでこれが必要なのかがわからん
それと例えば1-1が3行あって1-2が4行あったら1-1の学年4位の行はどうなるんだ?NULLで補完されないと駄目なのか?
SQLの中だけでやろうとすると大変だけど、
外部のプログラムに渡してソートさせたらどうだろう?
>>527 1回で扱うデータ量が多いから遅くなる。
生徒テーブルをクラスIDで切り分けたVIEWを作って、それを元にSQL書いてみ。
それ以上の高速化をする場合はDBエンジンのチューニングとか・・・。
>>527 select
gakunen, class, namae, tokuten,
(select count(*) + 1 from seito as seito_sub where seito_main.class_id = seito_sub.class_id and seito_sub.tokuten > seito_main.tokuten) as rank
from seito as seito_main join class on (seito_main.class_id = class.id)
order by rank, gakunen, class;
同点の生徒がいたときの回避はしてない。
遅いなら、抽出時に毎回算出するのではなくて、
定期的にバッチで順位をつけるようにはできない?
>>528 縦を横にする必要はないみたいだよ。
お前らselect文よく思いつくね
俺は有名どころからコピペしてきて改変作業しかしないから
1から作ることが出来ない
普通の手続き型言語とは思考方法がちょっと違うからね
select句にサブクエリ書いてるような人は手続き型言語の思考から
抜け出せてないんだろうなあと思う
考える前に検索して終わらす病だな
それを続けてるといつかDCや客先の隔離施設で自分の無能を痛感することになる
>>527 同じクラスに同点の生徒がいたらその場合の規則は?
それによってみんなのSQLなんて全部だめだろ
そもそもこんなデータ構造をむりやり1回のSQLで
問い合わせても満足な速度はむりだと思うぞ
その辺は気にしないのか?
SQLite 3.7.7.1 を PDO で操作しています。
以下ようなテーブルがあった場合にそれぞれのarticle_idのcomment_idをカウントするのはどのようなSQLを書いたら良いのでしょうか。
article_idを指定して一件だけ取り出す場合は、SELECT文にCOUNT(comments.comment_id) as comment_countのようにしてWHERE句でarticle_idを指定すれば取得できたのですが、全件の取得する場合が思うような結果が得られず困っております。。
■ このような結果が欲しいです
article_id comment_count
---------------------------
1 1
2 0
3 2
4 0
5 2
■ articles
article_id content
---------------------------
1 hoge
2 hoge
3 hoge
4 hoge
5 hoge
■ comments
comment_id article_id
---------------------------
1 5
2 3
3 3
4 1
5 5
>>537 select article_id, count(*) as comment_count
from articles left join comments on (articles.article_id = comments.article_id)
group by articles.article_id;
>>538 ありがとうございます!いけました!
GROUP BYを使うのですね・・基礎的なことがごっそり抜けていることが分かりました。
もっと勉強せねば。
本当にありがとうございました!
540 :
527:2013/01/23(水) 09:25:09.52 ID:CISRUOZX
色々回答ありがとうございます。
設計が間違ってたんですかね。
バッチで順位付けやビューですが、生徒テーブルには男女や親の年収やら補導歴やらいろんなのがついてて
WHERE 男で親の年収500万以上で補導歴なしみたいなことにもなるので無理なんです。
設計からやり直してみます。
>>540 得点にインデックスをつける
クラス毎のビューを用意する(5000行あるなら、スクリプトか何かでやるしかないだろうなぁ)
並べ替えはSQLでやるけど、順位の番号は読みだしてから手続き言語でやる
でやってみれば構造を大幅に変えることなく動作がマシになると思われ。
そもそも学校に例えてるのがおまいさんの思い込みであって実際のモデルとかけ離れてる気がしないでもない。
実際の学校だとしたら、5000クラスもないし、生徒テーブルに得点入れたりしないだろうし。
作るメリットがまるでないビューを5000個作れとか拷問だろ。
>>540 なんか改善できそうな気はするけどね。
>>531のクエリは運用に耐えられる速度じゃなかったってことかな。
>>527によると、
>>523と同じような方法(多分
>>531みたいな方法)で遅すぎて使えないと言ってるんだろ?
MySQLはVIEWをキャッシュしてくれるはずだから、
CREATE OR REPLACE VIEW view_seito11 AS
SELECT class_local.gakunen, class_local.class, seito_local.name, seito_local.tokuten
FROM seito AS seito_local INNER JOIN
(SELECT * FROM class WHERE gakunen=1 AND class=1) AS class_local
ON (seito_local.class_id = class_local.class_id);
SELECT gakunen, class,
(SELECT COUNT(*)+1 FROM view_seito11 AS vseito_local WHERE vseito_global.tokuten < vseito_local.tokuten) AS juni
name, tokuten
FROM view_seito11 AS vseito_global
ORDER BY juni;
これでやると、
・ソートやナンバリングの対象になるレコード数が1クラス分に限定される
(単純に10万÷5000とは行かないだろうけど、10万件全部を相手にするよりは...)
・順位用サブクエリとメインのクエリのFROMで同じ処理を2回やる必要がなくなる
(キャッシュされるから両方で同じ結果が使われる)
で高速化されるはず。
ビュー切らずにFROMにサブクエリで書くことも出来るけど、キャッシュされるかどうか不明。
・集計・ソートは対象をブロックに分けた方が動作が速い。
・複数回使う絞り込み条件はDBエンジンにキャッシュさせると動作が速い。
ビューは必要な時に外部スクリプトから作ればいいんだし、何の問題もないと思うが。
(view名の部分と gakunen= と class= を外部スクリプトで書き換えて実行。)
1クラスずつやるのなら、クラスごとのインデックスが効けば大差ないと思うが
質問者はまずちゃんとインデックス張ってるのかから確認せんといかんレベルだろ
545 :
NAME IS NULL:2013/01/23(水) 20:14:20.76 ID:XLyIL2Lt
>>541 得点にインデックスなんて無駄
そんなインデックスつけても要件を満たしていない
>>543 SELECT class_local.gakunen, class_local.class, seito_local.name, seito_local.tokuten
FROM seito AS seito_local INNER JOIN
(SELECT * FROM class WHERE gakunen=1 AND class=1) AS class_local
ON (seito_local.class_id = class_local.class_id);
って
select gakunen, class, name, tokuten
from seito join class using (class_id)
where gakunen=1 and class=1;
よりもいいの?
サブクエリの結果が絞られてJOINのコストが、とか言い出したら末期だけど、
他の理由があるのなら知りたい。
>>546 ほかのDBエンジンに移植した時に動くようにじゃね?
SQLSERVERとかJETじゃ動かないんだったと思うけど。<using
>>527 ちなみにだけど、速度要件はどれくらい?
postgresqlで申し訳ないんだけど、初期core i7環境で試したら30秒くらいだった。
>>547 mysqlでusingは使えるようだよ。
というか、問題視したのはそこじゃなかったんだけど余計なことしちゃったな。
最終的に10万行全部を出力するんだよね?
551 :
527:2013/01/24(木) 05:27:12.91 ID:???
学校に例えたのが悪かったみたいですね
それとVIEWを勘違いしてました
元テーブルが更新されるとビューも更新されるんですね
とりあえずクラスと生徒を結合したVIEWでやってみます
速度要件ですが特にないです
昔は速かったのがだんだん遅くなってきたのでどうにかしたいと思ってました
あと表示件数ですがマックス50件でページングしてます。
色々ありがとうございました
552 :
527:2013/01/24(木) 05:39:01.92 ID:???
あと同一順位は無視して現状は
SET @N=0,@S=0;
SELECT
gakunen,class,namae,tokuten,number
FROM
(SELECT
@N:=IF(@S=seito.class_id,@N+1,1) AS number
,@S:=seito.class_id
,seito.tokuten
,class.gakunen
,class.class
,seito.namae
FROM
(SELECT seito2.namae,seito2.class_id,seito2.tokuten FROM seito seito2 ORDER BY tokuten DESC) AS seito,class
WHERE
seito.class_id = class.id
) AS tmp
ORDER BY
number,gakunen,class
こんな風に書いてます。
今時のマシンで10万件程度で30秒もかかるかと思って、ちょっとSQLServerで実験してみたが
>>531のSQLとか、Core2Duoのマシンでも2秒で終わるぞ
まあ実際のレコードサイズとか学年とかクラスのばらけ具合で多少の差は出るかもしれんが
それより10万件のテストデータつくる時間が超暇だったぜ
>>552 こういうのみると、MySQLはRDBMS名乗るなと思いたくなるな
>>553 連番生成してくれる機能がないRDBMSの場合は連番テーブルを作っとくと何かと便利かもね
(
>>8が関連するかも)
556 :
NAME IS NULL:2013/01/24(木) 21:38:09.56 ID:07BNynAu
途中でレスしてるのを見てのると実際は「条件が実際は複雑」「結合してるものがもっとある」
「取り出してる情報が多い」ってのがあれば遅くなるってのも普通だろ
あそこまでいっていればSQLだけでなく、他の部分も含めての改良をしない限りは
改善できないと思うね
まあ10万件を2秒で終わるのはすげーと思ったわ
描画なり、出力なりでもそんな訳ないんじゃねと
一画面分だけ処理して表示してるのを終わったと思ってるの鴨。
10万件ったって、1レコード10バイトなら1メガバイトだからな
>>548がどんな風にやったか知らんが、与えられた条件(
>>519のレイアウトで
>>531のSQL)で30秒はかかりすぎだと思っただけだ
質問主が現状かかっている時間を書かないのはなんでなんだろね。
速度要件は特にない、遅いから改善したいだけじゃ状況もつかめない
自分はあのシステムは価格比較みたいな情報を
とりたいSQLなんだと思うわ
商品別の安い順で店名と価格とかね
まあどっちにしろSQLの質問であれば
上で回答してるSQLが正解だろうけど
それ以上の改善を求めるなら情報を
もっと出すしかないし、だせないなら
これで終わりな話題でしょ
10万件=100K件なんで、1件が何バイトかにもよるけど、たいした量ではないと思うんだが。
562 :
NAME IS NULL:2013/01/25(金) 10:59:10.72 ID:jbelRchB
t_all
id/groupType/userId
t_groupA
id/c1/c2/c3
t_groupB
id/c1/c2/c3
以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか
かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています
この状況で、t_all.idしかわかっていない時に最短で
t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを
取得するにはどういうクエリ文を書いたら良いでしょうか?
select t_all.groupType, t_all.userId from t_all where t_all.id = $id;
として、その返り値のgroupTypeとuserIdを元にif文で分けてもう一度グループのテーブルにselectをするしかないですか?
よろしくお願いします。環境はmysql5.5です
三つのテーブルを外部結合していっぺんに取ってきて
null の方は捨てる
t_groupA.id と t_groupB.id が重複しない(一意)を前提だとすると・・・
select t_dist.groupType, t_dist.userId , t_groupAB.c1, t_groupAB.c2, t_groupAB.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id ) as t_dist
inner join
(select id, c1, c2, c3 from t_groupA
union
select id, c1, c2, c3 from t_groupB) as t_groupAB
on t_dist.userId = t_groupAB.id;
t_groupA.id と t_groupB.id が重複する場合・・・
select t_dist.groupType, t_dist.userId , t_group.c1, t_group.c2, t_group.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id AND t_all.groupType ='groupA') as t_dist
inner join t_groupA as t_group on t_dist.userId = t_group.id
union
select t_dist.groupType, t_dist.userId , t_group.c1, t_group.c2, t_group.c3 from
(select t_all.groupType, t_all.userId from t_all where t_all.id = $id AND t_all.groupType ='groupB') as t_dist
inner join t_groupB as t_group on t_dist.userId = t_group.id;
テストはしてないから細かいデバグはお任せする。
MySQL限定な書き方ならもっとヘンタイな最短があるかもしらん。
>>564 一般にunionはコストの高い操作(使うならunion allの方がいい)
それにjoinしてもインデックスは効かないだろうからさらにコストが高い
その方法でやるなら、joinしたものをunion allした方が多分早いから
重複してようがしてまいが下のSQLだけでいいんじゃね
>>562 >>564は慎重な書き方かな。t_groupAとBのレイアウトが同じであるならこんな感じでいいとおもう。
t_distを作るのは、フィルタ条件がサブクエリに閉じた形で見えるのがメリットかな。
select t_all.groupType, t_all.userId, t_groupAB.*
from t_all join
(select * from t_groupA union all select * from t_groupB) as t_groupAB on t_all.userId = t_groupAB.id
where t_all.id = $id
あとこういう方法もあるかなと。
select t_all.groupType, t_all.userId, t_groupA.* from t_all join t_groupA on t_all.userId = t_groupA.id where t_all.id = $id
union all
select t_all.groupType, t_all.userId, t_groupB.* from t_all join t_groupB on t_all.userId = t_groupB.id where t_all.id = $id
これに
>>564の後半の懸念を盛り込むとこう
select t_all.groupType, t_all.userId, t_groupA.* from t_all join t_groupA on t_all.userId = t_groupA.id where t_all.groupType = 'groupA' and t_all.id = $id
union all
select t_all.groupType, t_all.userId, t_groupB.* from t_all join t_groupB on t_all.userId = t_groupB.id where t_all.groupType = 'groupB' and t_all.id = $id
>>563のやり方はgroupから取得するカラムが少ない場合に向いていると思う。
クエリはこんな感じ
select t_all.groupType, t_all.userId
, coalesce(t_groupA.c1, t_groupB.c1)
, coalesce(t_groupA.c1, t_groupB.c2)
from t_all join t_groupA on (t_all.userId = t_groupA.id) join t_groupB on (t_all.userId = t_groupB.id)
where t_all.id = $id
ああ、あとfromにサブクエリ書くと、オプティマイザが貧弱なら遅くなるかもしれん
ということで俺がやるならこうかな。試してないけど
select
t_all.*,
t_groupA.*
from
t_all join t_groupA on t_all.userId=t_groupA.id
where t_all.id=$id and t_all.groupType ='groupA'
union all
select
t_all.*,
t_groupB.*
from
t_all join t_groupB on t_all.userId=t_groupB.id
where t_all.id=$id and t_all.groupType ='groupB'
t_allの(id,groupType)に(ユニーク)インデックス張って
t_groupXのidに(ユニーク)インデックス張る
t_all.idの該当件数が少ないならこれが最良だとおもうが
568 :
566:2013/01/25(金) 17:50:22.40 ID:???
>>567 そのインデックスに効果はなさそうに思う。
>>568 リロード大事だな
まああれだから、いちゃもんレベルの指摘しとこう
whereで絞る順序はカーディナリ高い奴からってのが基本
まあいまどき順番通りにしかインデックス使えないようなオプティマイザじゃないだろうし
どうせidは主キーだろうから実際はあんまり関係ないんだけど
俺ならこのレイアウトなら(id,groupType)でt_allの主キーにするけど
idのみ主キーなら、groupTypeの検索はwhereじゃなくてonのとこに書く方が好み
571 :
NAME IS NULL:2013/01/25(金) 21:41:47.43 ID:5gQwGGS8
SELECT
T.ID,
T.GROUPTYPE,
T.USERID,
TA.*,
TB.*
FROM
T_ALL as T
LEFT OUTER JOIN T_GROUPA as TA
ONTA.ID = T.USERID AND T.GROUPTYPE = 'A'
LEFT OUTER JOIN T_GROUPB as TB
ONTB.ID = T.USERID AND T.GROUPTYPE = 'B'
WHERE
T.ID = ?
こうじゃねーの?
572 :
571:2013/01/25(金) 22:08:59.00 ID:5gQwGGS8
これでGROUPTYPEみて参照するカラムを分けりゃいいだろ
何か難しくしたいの?
573 :
562:2013/01/25(金) 22:50:25.17 ID:???
素晴らしい方法の数々ありがとうございました
自分の頭の固さや基礎知識の乏しさを痛感しました
勉強してみます、ありがとうございました
>>572 >>566の最後がそんな感じ。
テーブル構成的にgrouptypeを見る必要はないだろうし、そうなってくると、
そもそもcoalesceがいらないよねってことで
>>567みたいになる。
別にクエリの複雑さがほとんど変わらない状態で、
>>571のいうようにロジックでループしてもいいんだけどさ。
>>573 がんばれー
575 :
NAME IS NULL:2013/01/26(土) 00:17:11.63 ID:DthSOaAQ
>>574 UNION ALLやサブクエリなんて使う必要ないほど簡単なSQLで可能なのに
なんでそんなことするの?
つか
>>566の最後はコピペミスだろうけどjoinじゃ同じ結果にならんだろ
それとgrouptypeなんてデータの分布を考えたらインデックス貼るなんてありえないんじゃね
>>575 groupType単体にインデックス張る効果は多分ほとんどないだろうけど、誰もそうしろとは言ってないだろ
(id,groupType)でインデックスはるとidとgroupType で検索するときに
実データ読まないでインデックスだけで行の有無を判断できるメリットがある
(joinも実データ参照しないでjoinできる)
まあ最終的に戻される行が少ないからあんまり差はでないだろうけど
idがユニークだとは明示されてないし、大量に同じidがあったりしたらまあそれなりの差がでるかも
まあ最短でって希望なんで一般的にもっとも早くなるように色々考えてるけど
実際にはどうでもいいレベルの話
MySQLでどこまで思った通りに動くかもしらんしな
俺の経験ではこんなSQLでUNION使いたがる奴は大抵馬鹿
今回はもとになるテーブルの条件が単一ならば
UNIONを使う必要はまったくないし
サブクエリでUNIONとかありえないレベル
でもこういうSQLを考える奴が多いんだよな世の中w
>>578 聞くまでも無く2倍以上の差があるだろ。
UNION使うということは、2回SELECTした上で、その2つの結果をSORTしてるんだぞ。
581 :
NAME IS NULL:2013/01/26(土) 11:09:18.03 ID:vF4LejwG
テーブルAのカラム1が○○またはカラム2が××のデータを取り出すような場合、
どちらかのカラムはインデックスが効かない分遅くなる可能性がある
そういった場合にUNION ALLするのは効果があるだろうが
今回のようなケースではそんな事しても意味がない
UNION信者は悪いやり方を広めないほうがいい
なんだ。エンタープライズ病のオラクル厨か。
583 :
NAME IS NULL:2013/01/26(土) 12:58:30.10 ID:vF4LejwG
俺が今開発で使ってるのはORACLEじゃないが
数十件程度のSQLですぐ結果があるからこれでいいだろみたいなクズは
ORACLEとか使って大量データをこなすSQLは作れないだろうな
全然駄目なSQL作る奴ほど「インデックスが必要です(キリッ)」
「正規化がおかしいんじゃないでしょうか」「データが大量過ぎる;;」とか言い出すわ
そもそもORACLE厨なんてこんなスレにこないだろw
MYSQLみたいなDB使うシステムしかやれない低級PGばかりだと思うが
釣りだよね
割りとマジなんじゃね?
俺なら SQL で自慢とか恥ずかしくてありえないが。
588 :
NAME IS NULL:2013/01/26(土) 21:45:52.61 ID:V1xUhZOt
>>586 @テーブルは3つ
At_all.groupTypeの値はgroupAまたはgroupBのいずれか
Bt_all.userId は t_groupA.id または t_groupB.id のいずれか
Ct_groupAの全カラムまたはt_groupBの全カラムを取得
Dt_all.idしかわかっていない時(WHEREに指定される条件はt_all.id)
→Aよりt_all.groupTypeの値でt_groupA.id または t_groupB.id のいずれかとJOIN
(JOINする際にt_all.groupTypeを付与する事で間違ったテーブルと結合させない※無理にやらなくても可)
→Cより欲しい情報はt_groupAの全カラムまたはt_groupB
これから求められるSQLは
>>571-572で問題ないんじゃないか
質問者の要件以外に自分勝手に決めた要件があるかい?
明示されていない要件っていってるのに、明示されてる要件だけ上げてどうするんだ
たとえば、取得するのはAまたはBとある
AもBも出して良いのか、AかBのいずれかしか出してはいけないのかは明示されていない
ホストアプリ側でAが該当したのかBが該当したのか関知したくない場合は、両方出して
ホストアプリで判断する仕様にする事が妥当だと言えるか?
そう考えると勝手に両方だして自分で判断しろってのは要件を勝手に決めてるだろ
質問スレで何言っちゃってるんだろ、この人…
591 :
562:2013/01/27(日) 00:36:50.92 ID:???
すみません、あいまいな質問したばかりに
3つのテーブルのidはそれぞれauto_incrementを設定した主キーです
今さらですみません
>>588 >>571-572のクエリだと、ロジックで分岐しなければならないんだけどそこは無視していいの?
>>589が書いてるのもたぶん同じ。
>>566の最後のを直すとこうなるとおもうけど、これならロジックで分岐はしなくていいよね。
select t_all.groupType, t_all.userId
, coalesce(t_groupA.c1, t_groupB.c1)
, coalesce(t_groupB.c1, t_groupB.c2)
from t_all left join t_groupA on (t_all.userId = t_groupA.id) left join t_groupB on (t_all.userId = t_groupB.id)
where t_all.id = $id
で、groupA Bのカラムがたとえば100カラムあったら面倒だし、coalesceのコストがカラム数分増えるよね。
>>567のやりかただと、いらないよね。
まぁ、このレスもt_groupA t_groupBが同じレイアウトであるという前提があるんだけど。
unionを否定している向きもこの前提については疑問を持っていないから、それでいいのかなとおもいつつ。
>>562 わざわざどうも、いろいろ試してみるといいよ
まあ実際のとこ詳しい事は
>>562にしかわからん
>>562が
>>563方式(
>>571のSQL)でいいならそれでいいんじゃないか
unionするよりは確かに早いだろう
(それでも2倍も差はでないだろうけど)
594 :
NAME IS NULL:2013/02/02(土) 17:51:27.98 ID:xdgMUmqf
※本投稿の拡散お願い致します。
◯外国労働者を海外から日本の企業での作業(物理的に日本にいる必要はない)に従事させる場合、海外の受注者は派遣業者として登録し派遣法に準拠しなければならない。違反すれば職安法違反となる。
◯事前面接時の会話、テレビ会議、国際電話を通じた日本からの指揮命令・技術指導はICレコーダー・スマホで録音してください。
◯中国・インド・ベトナム・韓国でのアウトソースを標榜しても派遣とみなす作業があれば労働基準法、職業安定法の責任は雇用主=発注者にあります。
◯雇用主とは外注している元請けと下請けを含みます
◯中国人、ベトナム人、インド人、韓国人の方で偽装請負、偽装出向、多重派遣の被害を受けた方は日本の検察に刑事告訴をしてください。
◯国境が違っても顧客=発注者が日本にいれば、日本の法律を適用できますので是非ご活用ください。
◯刑事告訴は無料です。元請けの各役員報酬は数千万円はゆうに超えているでしょうから、
総額で4000万円〜程度の和解金となるでしょう。
和解金の相場は日本の相場に準拠しますので、皆様の国の平均生涯年収を超えることは間違いないでしょう。
民事じゃあるまいし、和解金などあるわけない
ニホンゴデカカレテモワッカリマセーン
You fool HA-HA-HA!
mysql 5.5
テーブル master
tcode
tname
lastdate
〜
daily_data
select tcode,max(tdate) as maxdate
from daily_date
group by tcode;
このdaily_dateから得られるmaxdateを使って
masterのtcodeの対応するlastdateに入れたいのですが、
どのようにupdateを書けば良いのでしょうか?
update master
set lastdate = (
select max(tdate)
from daily_date
where tcode = master.tcode)
じゃね?
mysql知らないけど
上げちった・・・すまん
601 :
598:2013/02/05(火) 16:38:47.29 ID:???
>>599 感謝です!!
一旦
select tcode,max(tdate) as maxdate
from daily_date
group by tcode;
で出したのをループでやっていくかぁと思ってたとこでした^^;
SQL SERVER 2012です。
データベース
番号列1列2
No153
No243
各番号の列1と列2の差を求め
番号差異
No12
No21
得られた差異の平均を求めたい
式:(2+1)/2=1.5
求めたい結果
結果
1.5
この1.5の値を求めたいです。
よろしくお願いします。
select sum(列1)/sum(列2) from TBL;
ごめん よく読んでナカタ
select (sum(列1)-sum(列2))/count(*) from TBL;
>>604 sumの場所間違ってるだろ。
あと、俺は普段Oracle使ってるからSQLServerは詳しくないが、
SQLServerは平均の関数無いのか?
SELECT AVG(ABS(COL1-COL2)) FROM TBL;
ABSも入れといてやったぜ。
素直に
select avg(列1 - 列2) from データベース
で良い気が
「差異」の平均だから、理系の奴はABSを付けるだろうし、
そうじゃない奴はABS無しで済ますんだろうな。
>>605 俺は
>>604ではないが
差異が列1と列2の差としか書いてないからなぁ
絶対値とる必要があるなら
>>604はちゃんと動かないけど
そうじゃないなら行けるのは行けるんじゃね
sum(a-b)=sum(a)-sum(b)だと思う
問題はNULL絡んだらどうなるかってのがあるけどな
>>607 理系のやつは絶対値とれって明示されてないのでやりませんよ
言外の意味を解釈しないのが理系です
>各番号の列1と列2の差を求め
と書いてあるから、差異は必ずプラスだろ。
各番号の列1から列2を引いた値と書いてあったなら単純にマイナスで良いと思うが。
なんで正の値が保証されるの?
>>611 保障されないから絶対値取れって話だろ
まあ、それはどうしたいか
>>602が言えばすむ
それよりNULLがあるのかどうかの方が大事
>>603-612 ありがとうございます。
列1と列2の値はMAXとMINで取ろうと思ってました。
NULLはないので教えていただいた方法で行けそうです。
ありがとうございました。
温かいスレだ
615 :
NAME IS NULL:2013/02/15(金) 01:42:06.05 ID:iKm/GczF
group byの動作が良くわかりません
id| type | num
--+------+--------
1 | a | 100
2 | a | 150
3 | b | 200
4 | b | 90
5 | b | 150
SELECT type, max(num) FROM tbl GROUP BY type HAVING num > 100;
このようなSQLを発行した時、
1. type=aのレコードの集合とtype=bのレコード集合に分割
2. type=aの集合のからhaving句を満たすレコードを抽出
3. type=bの集合のからhaving句を満たすレコードを抽出
4. 2.のレコード集合からselect句を満たす列を選択
という流れで処理が行われていると推測したのですが、これで合っているのでしょうか?
また、from句に指定したテーブルまたはインラインビューによって取得したレコードの集合と
group byで分割されたレコードの集合(上の1.のそれぞれ)は同じものと理解して問題ないのでしょうか?
動くの?
>>615 ヒント:
SQLの評価順は
FROM→WHERE→GROUP BY→HAVING→SELECT→UNION→ORDER BY
もう少しヒント:
GROUP BYの段階で集計(SUMとかMAXとか)が行われる
>>615 まずそのSQLは普通はエラーになるはず
HAVINGに集約関係ない式は指定できない
一般論としては
もし実際の内部の処理がどうやって行われたか知りたいなら
実行計画を見ないとダメ
同じSQLでも同じように実行されるとは限らない
論理的な話なら
>>617 あとgroup byで分割されたレコードの集合なんてない(内部的にワークとして作ってるかもしれんが)
分割にしても集約にしても操作されたものと操作前のものが同一だとする理由が解らん
>>615 宣言的記述であるSELECT文に関して処理の流れや順序を問うことにあまり意味は無い。
仕様で定められているのは・・・という手順で処理した結果と「同じ結果を返す」という
ことだけであって、同じ結果を返すのであれば仕様と異なる手順で処理するのも許される。
実際は実行計画を出力させて処理の順番を確認することもあるけれども、それは基本的には
パフォーマンスチューニングのためであって、結果の正しさや処理手順を問うためではない。
ちなみに仕様に書かれている手順に興味があるのであればSQL92の仕様書のSELECT文の
Semanticsの項を読んで下さい、と書こうとしたのだけれども、あれの邦訳ってどこに
転がっているのだろう。丸善Date本やアジソンウェスレイの標準SQLガイドのSELECT文の
項にはちゃんと仕様で定められた評価順序が書いてあるのだけれども。
621 :
NAME IS NULL:2013/02/16(土) 13:21:32.12 ID:/IbyUisN
データベーススペシャリストの勉強本でいいのない?
622 :
615:2013/02/17(日) 02:42:10.75 ID:???
>>622 >ここの記事などを読んでgroup byがレコードの集合を作るのであれば
そのページの解説も、
>havingはレコード集合に対して使う抽出操作みたいなものではないのかと
この理解も極めて正しいよ。むしろ
>>619 >あとgroup byで分割されたレコードの集合なんてない
てのがおかしい。
>>622 もちっと書いておくと、GROUP BYはFROM - WHEREの評価結果のテーブルをGROUP BYで
指定された列について同じ値を持つ行のグループに分割したグールプ表(grouped table)を作る。
なので
>>615の1の理解は正しい。
次にHAVING句は、各グループに対してHAVING句に書かれた条件を評価して、それがTrueと
なる「グループを」抽出する。グループ単位で結果に残したり落としたりするので、レコード
単位の処理ではないという意味で2.3はちょっと違う。
よってHAVINGに書ける条件式に関しては「それぞれのグループごとに一つの値を持つ」もの
に限られるという制約がついている。そのため各グループで値を集約して一つの値を出力する
集約関数がHAVING句ではよく使われるわけだけれども
SELECT type, MAX(num) FROM tbl GROUP BY type HAVING MIN(num) > 100
「グールプで一つの値」を持てば良いのでGROUP BYに指定された列も使うことが出来る。
SELECT type, MAX(num) FROM tbl GROUP BY type HAVING type = `a`
最後にSELECT列を評価してグループ毎に集約等を行いグループ表から普通の表を生成する。
で、SELECT分は上記のような手続きで評価した結果と同じ結果を出す事になっている。
また
>>615のクエリは本来エラーになるはず。きっちりSQLを学びたいならPostgreSQLがマシ。
またMySQLか、こんなでたらめSQL通すのは
>>622 >ちなみに、whereとhavingの違いは
そのブログの解説はイマイチ。グループ化の前の各行に対する制約か、グループ化後の
各グループに対する制約か、という評価されるタイミングの違いがまず大切。なので、
SELECT type, MAX(num) FROM tbl WHERE num > 100 GROUP BY type HAVING COUNT(id) > 1
というSELECT分の場合、WHEREが無い場合はtypeとしてa、b両方が結果に含まれる
けれども、WHEREをつけるとaが結果から無くなる。HAVINGが評価されるより以前に
WHEREの評価でid=1の行が取り除かれるため、HAVINGに到達した時点でtype=aの
グループは1行だけになってしまうのでこういう結果になる。
「テーブルの項目に対する条件と集計関数の結果に対する条件」だけだとこの例のような
事例を理解するにはちょっとイマイチだと思う。
>>621 「情報処理教科書 データベーススペシャリスト」
スレチだけど、これ1冊読んでおけば十分。
628 :
NAME IS NULL:2013/02/20(水) 00:23:24.32 ID:8bcgMjBw
t_guest、t_address、t_friend という3つのテーブルがあって、
t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています
SELECT g.namae, c.prefecture, f.namae
FROM t_guest AS g
LEFT JOIN t_address AS a
ON g.id = a.guestId
LEFT JOIN t_friend AS f
ON g.id = f.guestId
WHERE g.age = 20;
こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするには
どうしたら良いんでしょうか
それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのか
わかりません
629 :
628:2013/02/20(水) 00:24:56.07 ID:???
すみません、書き間違いがありました
t_guest、t_address、t_friend という3つのテーブルがあって、
t_guestを基本にして、left joinをt_addressとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています
SELECT g.namae, a.prefecture, f.namae
FROM t_guest AS g
LEFT JOIN t_address AS a
ON g.id = a.guestId
LEFT JOIN t_friend AS f
ON g.id = f.guestId
WHERE g.age = 20;
でした
>>628 >t_addressに住所を登録していないguestのユーザー
がt_addressに登録されていないならt_addressを内部結合にすれば良いし、
guestIdが登録されていて住所項目がnullなのであれば、
抽出条件にt_address.住所項目 is not null加えればいいのでは?
>>628 >「登録していない状況」をどう表現したら良いのかわかりません
それを説明しないと他人にはどうしていいかわかりませんが
t_addressに住所を登録していない の意味が
t_addressに該当レコードが無い なら、outer joinやめてinner joinにするだけ
そうじゃないなら、その条件をwhereに書くだけ
たとえばwhere a.prefecture is null とか
(外部結合で該当なければどうせNULLだから場合によってはこれだけでもいいけど)
632 :
628:2013/02/20(水) 01:39:25.92 ID:???
なんとなくで大丈夫か?
色々やってりゃそのうちわかるさ。
何回か痛い目に会うかもしれないけど。
635 :
NAME IS NULL:2013/02/25(月) 23:11:43.99 ID:8BczK/hd
質問です、お願いします
id|col1|col2 という構成のテーブルがあります
これに対して、以下のような条件と動作を実現したいと思います
1)更新できるのはcol2が0の場合のみ
2)更新できた場合、'updated'を返す
3)もし、col2が0以外の場合、'update_fail' という値を返す
どんなクエリ文を書いたら良いんでしょうか
(利用してるDBはmysql5です)
636 :
635:2013/02/25(月) 23:15:58.95 ID:8BczK/hd
あいまいだったので補足します
上記の条件での更新処理を実現するクエリ文を教えて欲しい、ということです
通常の更新条件としてはidをユニークキーとして想定しています
>>636 id範囲指定による更新や、col1を指定しての更新はないと。
638 :
NAME IS NULL:2013/02/26(火) 00:35:10.85 ID:ljDtJ7sG
>>637 そうです、通常の更新では
where Id =123 という形で更新できるんですが、
そこにcol2が0か1かによって、更新の可否や帰り値まで決定できるような
クエリが作れないかと思いました
一発では無理で、複数のクエリに分けるしかないんでしょうか
自分では思いつきません
case式は?
更新できるかどうかの確認だけで実際に更新処理するわけではないよね?
select for updateかなぁ
>>638 idを指定して更新するという文言がどこかに必要でしたね。
それを1文でやる必要性がわからん
mysql5のupdateって、更新した行数戻したりしないのか?
id指定するなら0か1なんだから、戻り見たらわかるだろ
update HOGEHOGE set HEMOHEMO=MOKEMOKE
where id=PIYOPIYO and col2=0;
とでもして、戻り値で更新された行数を取得するとか
affectedrowsは要件を満たさないと思ってそっとしといたのに
647 :
NAME IS NULL:2013/02/28(木) 21:10:39.57 ID:3Nk6dQry
mysqlはよくわからんけど
select for updateでロックして
あればupdateして
updatedを返す
なければupdate_fail'かえすSQLブロックかけばいいんじゃね
それぐらいできるだろ
update文では文字列返さないからselect文使うしかないかと
それじゃだめなの?
>>628 a.id is not null をwhere句に追加かな
>>621 sqlならプログラマのためのSQLがおすすめ
あとは翔泳社読んどけばいいよ
651 :
NAME IS NULL:2013/03/05(火) 11:31:52.05 ID:uG1h7J7w
2010年度の月毎の件数をまとめたデータですが
累計を求めたいです。
月 2010年度
01 1
02 2
03 1
04 3
05 2
06 2
07 2
08 1
09 2
10 2
11 2
12 1
求めたい結果
月 2010年度累計
04 3
05 5
06 7
07 9
08 10
09 12
10 14
11 16
12 17
01 18
02 20
03 21
これだけのデータから
スタートを4月にして累計を求める方法は
ありますでしょうか?
よろしくお願いします。
思いっきり簡略化してこうなったのかな、、まあいいかw
ORDER BY 月 < 4, 月
をつけるとか。BOOL値でソートしてから月でソート
>>651 テーブル名:TBL
int month 月
int val 2010年度の値
とする
select t1.MONTH,
(select sum(t2.VAL) from
(select case when (MONTH<4) then concat('20110',MONTH) else
case when (MONTH<10) then concat('20100',MONTH) else concat('2010',MONTH) end end as YEARMONTH, MONTH, VAL from TBL) t2
where t2.YEARMONTH<=t1.YEARMONTH)
from
(select case when (MONTH<4) then concat('20110',MONTH) else
case when (MONTH<10) then concat('20100',MONTH) ELSE concat('2010',MONTH) END END as YEARMONTH, MONTH, VAL from TBL) t1
order by t1.YEARMONTH;
>>651 2010年度の月っていうことは
01月は2011年01月という事?
データに年が入ってないの?
>>652-653 ありがとうござます。
ご回答頂いた内容が難しいので
しばらく考えてみます。
ありがとうございました。
>>653補足
テーブル名:TBL
int NO 番号
int VAL 値
というテーブルに
NO VAL
1 10
2 30
3 20
というデータがあった場合に、NO の昇順で累計を求めるSQLは
select t1.NO, (select sum(t2.VAL) from TBL t2 where t2.NO<=t1.NO) from TBL t1 order by t1.NO;
となる
※MySQLスレと間違えて
>>653はMySQLで書いてしもた
関数がなければ適宜読み替えてくれ
>>654 はい、その通りです。
最終的にそういう形になりました。
>>652-654,656
ありがとうございました。
おかげで、理想の形にすることが出来ました。
A_table
ID | title | keyword
-------------------
1 | いうえ | あいうえお
2 | きくけ | かきくけこ
3 | しすせ | さしすせそ
select * from A_table where "あいうえお" like "%titel%"
結果を
ID 1 の "いうえ" を結果としてだしたいのですが、
WEBで入力した文字列の中に titleの中身を like検索してヒットする物をだしたい感じです。
MYSQLですが、、なかなかいい方法がわからなくて・・・
>>659 別にkeyword 消し忘れてました keywordは忘れてください。
こういうこと?
select * from A_table where 'あいうえお' like '%' || title || '%'
|| は文字列連結演算子
MySQLではconcat関数なのかな?
そしてMySQLでこういう方法が使えるかどうかは知らない
1つのupdate文に set と条件 の組を複数指定できませんか。
update table_foo
set x = new1 where x = old1,
set y = new2 where y = old2,
set z = new3 where y = old3
みたいなことがしたい。
SET x = (CASE WHEN x = old1 THEN new1 ELSE x END),
y = (CASE・・・
とかつなげればできるけど、、、全行アップデートになる。
素直に3行書けよ。
仮に1行にまとめられたとしても、実行計画は同じになるだろ。
まあこの場合、new2とold3が同値だった場合3度に分けるとややこしいことに
なるかもだけど、そもそも元がタイプミスな気がしないでもないw
>>659 すみません。WEBで入力した文字列というのは
どこにあるのですか?
それくらい脳内補完が出来ないと
エスパー回答者にはなれない
SQLインジェクションのほうに話を進めるのかと思ったw
669 :
NAME IS NULL:2013/03/07(木) 08:52:33.92 ID:x/bLWl8/
oracleなんですが、次の表に
日付 数
1/1 5
1/2 2
1/3 -8
1/4 6
1/5 8
残と繰越を計算して↓のようにしたいのですが
どのようなSQLにすればいいでしょうか?><
日付 残 数 繰越
1/1 0 5 5 ←初日の残はゼロ、繰越=残+数
1/2 5 2 7 ←残=前日の繰越
1/3 7 -8 -1
1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに
1/5 6 8 14
SQLだけでやろうとしてるのはそう言う理由があるの?
せめてテーブル名くらい指定してください。
mySQL 5.5.27
年 季節 記号
2008 Spring CS
2008 Fall MTH
2008 Fall MTH
2009 Spring CS
2014 Winter CS
2014 Summer MTH
2014 Spring CS
2014 Fall CS
このテーブルの季節部分をSpring, Summer,Fall,Winterの順に並べかえたいのですが、どのようにクエリーを書けばよいでしょうか?よろしくお願いいたします。
673 :
669:2013/03/07(木) 11:17:37.56 ID:x/bLWl8/
>670
SQLだけじゃぁ無理でしょうか?(ノω・、)
ストアドプログラム?とかでも大丈夫です
>671
"TBL"ってテーブル名にします
よろしくお願いします!
>>672 数字にして名称と数値のテーブル別に作った方がいい気もするが
MySQLなら、
ORDER BY field(季節,'Spring', 'Summer', 'Fall', 'Winter')
でいけるかな?
>>673 > ←前日の繰越がマイナスなら残はゼロに
これさえなきゃ単純にSQLでかけると思うんだけどね。
>>663 なるほど。case式は頑張って書くとしても、全行アップデートはいやですね。
>>664 3行で書くと3回通信しなきゃいけないので、それを1回にしたいです。
>>665 すみません、タイプミスです ;(
全行アップデートはまあパフォーマンスとかは気にならんかもだけど
トリガとかあると面倒かな。
>>676 3回通信?ストアドがーとか考える前に基礎知識を充実させたほうがいい
>>678 もとの質問では書いてませんが、更新件数を知りたいので、一文ごとに実行するしかないかなと思っています。
3つの文をまとめてDBに投げて、それらの更新件数もきちんと取得できるなら、そうしたいです。できるのであれば、ですが。
>>676=679
>>678や
>>679も書いてるけど、素直に3回SQL発行しなされ。
で、ちゃんとしたベンチマークして、1回と3回でどれだけ違うか測定してみて、
耐えられない程遅いなら考えればいい。
(1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。
>>681 >>676じゃないけど
> (1回と3回での測定が難しいと思うなら、2回と4回で測定してもいい)。
これどういうこと?
683 :
672:2013/03/08(金) 16:58:17.66 ID:???
>>674 MySQLだとOrder側でそのように書けるのですね、
他のDBでもOrderにCase式で並べ替えれそうですね、回答ありがとうございました。
・DBMS名とバージョン
Oracle 10g
・テーブルデーた
create table aaa (
id number(5,0) primary key, -- 主キー
nendo char(4), -- 年度
tsuki char(2) -- 月
);
insert into aaa values (1, '2012', '01');
insert into aaa values (2, '2012', '02');
insert into aaa values (3, '2012', '03');
insert into aaa values (4, '2012', '04');
insert into aaa values (5, '2012', '05');
・欲しい結果
id, nendo, tsuki
--------------------
4, '2012', '04'
5, '2012', '05,
1, '2012', '01'
2, '2012', '02'
3, '2012', '03'
・説明
年度/月の昇順に並べたいです。
2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。
685 :
NAME IS NULL:2013/03/18(月) 15:30:25.79 ID:dL6PwHp0
追記です、Oracle独自の関数を使わないやり方でお願いします。
oracle知らないけど、
case when tsuki > '03' then nendo else to_char(to_number(nendo) + 1) end
みたいなのでいけるんじゃ。
このくらいなら、手抜きでこんなんでもいいかも
ORDER BY nendo, TO_NUMBER(tsuki, '99') < 4, tsuki
to_charとto_numberってOracle独自な(というかSQL標準関数ではない)気もしないではない。
あれ、CAST避けてTO_NUMBERにしたんだけど逆だったか?
普段はPostgreSQLなんで、::INTなんだよな、、、
690 :
684:2013/03/18(月) 16:37:10.95 ID:???
ありがとうございます。下記で想定通り取れました。
select id, nendo, tsuki
from aaa
order by
case
when tsuki in ('01', '02', '03') then to_number(nendo) + 1
else to_number(nendo)
end asc, tsuki asc;
to_numberは他のDBにもあるのでOKとしてもらうようお願いしてみます。
691 :
NAME IS NULL:2013/03/19(火) 01:12:02.75 ID:8ksoLJZ9
mysql 4.0で一つのテーブルに大量のインサートかますプログラム書いてるんだが、
誰か速くしてくれ〜〜〜〜
レコード数が一千万ほどあって、もう激重い。
・Optimize table
こいつが一番効果あったが、オフラインな時間が長すぎる
・Analyze table
こいつは割りと早かった
・Alter tableやdisable keys → enable keys
こいつらも結構重い。。
他に最適化する方法、ないかな・・・orz
693 :
NAME IS NULL:2013/03/19(火) 15:02:06.96 ID:J+pHkNJH
突然の質問にて失礼いたします。
wordpressでSQLを利用しているのですが、
・記事のフィールド名「wp_posts」で利用したカスタムフィールド名「wp_postmeta」に、
特定のmeta_key(price)の値meta_value(100,200,300)を含む記事「wp_posts」とフィールド名「wp_postmeta」を全削除
する方法が分からずに悩んでいます。
以下の記述で試したところ、値meta_valueのみが消えただけで、
該当の記事wp_postsとフィールド名wp_postmetaを削除することはできませんでした。
SELECT * FROM `wp_postmeta`,`wp_posts` WHERE `meta_key`='price' && `meta_value` IN ('100','200',300')
どなたか上記の手法をご存知の方がおりましたら、ご教示くださいませm(_ _)m
読めば読むほどわからなくなる内容だな。
レコード消すならDELETE FROMじゃないのか?
695 :
NAME IS NULL:2013/03/19(火) 15:58:33.86 ID:J+pHkNJH
>>694 申し訳ないです、間違いました。
DELETE FROM `wp_postmeta` WHERE `meta_key`='price' && `meta_value` IN ('100','200',300')
で試しました。
この条件にかかる`wp_posts`の消し方も不明でした。
知識不足でお伝えするのが難しいです・・・
こういうこと?
DELETE FROM wp_posts
WHERE id IN (
SELECT post_id
FROM wp_postmeta
WHERE meta_key = 'price' AND meta_value IN ('100','200',300)
);
DELETE wp_postmeta WHERE meta_key = 'price' AND meta_value IN ('100','200',300);
697 :
NAME IS NULL:2013/03/19(火) 16:09:32.35 ID:J+pHkNJH
>>696 ありがとうございます!!
おかげさまでやりたい事が実行できそうです。
自分の知識では到底たどり着けなそうな内容でした^^;
心よりお礼いたします。
MySQLにて
select * from books left join (
select * from reserves where book_cd
not in (select book_cd from reserves where user_cd = 19)
)on books.book_cd=reserves.book_cd;
というふうに outer join に selectで絞り込みをかけた表を指定したいんですけど
ERROR 1248 (42000): Every derived table must have its own alias
と怒られます。
outer joinにselectの結果を指定することはできないのでしょうか?
>>698 ちゃんとみてないけど
on の前にテーブル別名指定してonの条件は別名でやってみ
>>698 サブクエリ必要か?
SELECT bk.* FROM books bk
LEFT OUTER JOIN reserves res ON (
bk.book_cd = res.book_cd
AND res.user_cd <> '19'
);
これで取れそうな気がするが
701 :
700:2013/03/21(木) 13:08:21.34 ID:???
すまん、最初のbk.*は*の間違いだ
テーブルの定義にもよるけどユーザIDに関連するフィルタ近辺で意味が変わる可能性があるよ。
一番外のサブクエリははずせると思うけども
お前らかっこいい
禿がいいのか。
SQL SERVER 2010ですが
TOP 2を求めて残りをその他として合計表示したいです。
よろしくお願いします。
元のデータ
列1
A
A
A
B
B
C
D
求めたい結果
A 3
B 2
その他 2
>705
SELECT NAME, SUM(CNT1) CNT FROM(
SELECT NAME=CASE ID
WHEN 1 THEN NAME
WHEN 2 THEN NAME
ELSE 'OTHER'
END,
CNT1 FROM (
SELECT ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) ID,NAME,COUNT(*) CNT1
FROM TBL1
GROUP BY NAME
) A
) B
GROUP BY NAME
710 :
NAME IS NULL:2013/03/24(日) 14:16:59.11 ID:LtAoLu+W
mysqlを使用しています
descを使うとカラムの名前などがわかるのですが
sql分の結果でカラムの名前だけを知りたい場合はどのようにすればいいか教えて頂けないでしょうか?
カラム名を知らないDBにアクセスする状況がまったく思い当たらないんだが
show columns from TBL;
とか
select column_name from information_schema.columns where table_schema="SCHEMA" and table_name='TBL';
でどうだろうか
712 :
NAME IS NULL:2013/03/24(日) 15:09:57.15 ID:LtAoLu+W
ありがとうございます
zaikoというテーブルがあって
desc zaikoを実行すると
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| B508 | varchar(50) | YES | |NULL | |
| C895 | varchar(50) | YES | |NULL | |
| d786 | varchar(50) | YES | |NULL | |
と出てくるのですが
Fieldの部分だけを表示したいと思っております
Type | Null | Key | Default | Extra |の項目は非表示にしたい
ADOで
For i = 1 To wkRs.Fields.Count
Write #num, wkRs.Fields(i - 1).Name
Next
とやって列名取出してんのはやってるけど、Fieldの部分だけ出すのってSQLだけで出来るの?
まだよくわからん
Fieldの部分だけを見たいのはプログラム?人間?
どっちにしても
>>711の後者のSQLで表示はできるが
>>713 ほとんどのDBMSでシステムが持ってるカタログを参照することで可能
いちおうinformation_schemaってのが標準SQLで決められてたはずだが
実装されてるかどうかはそのDBMS次第
確実な方法は各DBMSのスレで聞いてください
ということで
>>712はmysqlのスレへ行ってください
テーブルを5つJOINしてselectで、グループ名、ホスト名、データ名、データ取得時刻、データ値を表示しようとしています。
しかし、データ型が整数の場合と、浮動小数の場合で、データ取得時刻とデータ値が格納されているテーブル(trendsとtrends_uint)が異なっている。
つまり二つのテーブル(trendsとtrends_uint)から片方で検索してNULLならもう片方のデータ値、時刻を取得したいのですが、どうしたらよいでしょうか。
現在、下のようなSQLだと全てのデータ値、時刻がNULLになってしまいます。
SET NAMES UTF8;
SELECT groups.name,hosts.host,items.name,from_unixtime(trends.clock|trends_uint.
clock),(trends.value_min|trends_uint.value_min)\
FROM hosts \
RIGHT JOIN items ON items.hostid = hosts.hostid \
LEFT JOIN trends ON items.itemid = trends.itemid \
LEFT JOIN trends_uint ON items.itemid = trends_uint.itemid \
RIGHT JOIN hosts_groups ON hosts_groups.hostid = hosts.hostid \
RIGHT JOIN groups ON hosts_groups.groupid = groups.groupid \
WHERE hosts_groups.groupid = 14 \
;
COALESCE 使う
>>717 簡潔にして素早いレスありがと。これでいけたっぽい。
SET NAMES UTF8;
SELECT groups.name,hosts.host,items.name,from_unixtime(COALESCE(trends.clock,trends_uint.clock)),COALESCE(trends.value_min,trends_uint.value_min)\
FROM hosts \
RIGHT JOIN items ON items.hostid = hosts.hostid \
LEFT JOIN trends ON items.itemid = trends.itemid \
LEFT JOIN trends_uint ON items.itemid = trends_uint.itemid \
RIGHT JOIN hosts_groups ON hosts_groups.hostid = hosts.hostid \
RIGHT JOIN groups ON hosts_groups.groupid = groups.groupid \
WHERE hosts_groups.groupid = 14 \
読み方はコウアレス
しかし、コアレスセと心の中で発音しながらタイプする
やっぱりみんな、読み方と綴りに苦労してるんだなw
コアリーズだとばかり思ってたw
コアレス
シングルコア→マルチコア→メニーコア→ついにコアレスへ
725 :
NAME IS NULL:2013/03/28(木) 19:15:34.91 ID:qyRM7UsI
アクセントはレにあるのか
やべー今まで間違えてたぜ
日本人相手ならカタカナ棒読みで大丈夫だ。
mysql 5.5.9
master
code
last_tradingdate
data_tbl
code
data1
tradingdate
で、data_tblにはcode毎に取引日が入っています
それでmasterのlast_tradingdateにcode毎の入力最新日をセット
したいのですが、どう書けばいいんでしょうか。
730 :
NAME IS NULL:2013/03/30(土) 10:44:46.72 ID:aVENNsvE
お知らせ
市原警察署の生活安全課の帰化人創価警官の指導の元、
入学式から2週間ほど、在日の創価学会員を主体とした自称防犯パトロールが、
2週間ほど行われることになりました
生活安全課の指導であることと、パトロールであることは、
絶対に公言してはいけないとの指導も、帰化人創価警官より出ています
期間中は2人組の在日の創価学会員が、頻繁に創価批判者の自宅周辺を、
うろつき回ると思われます
日本人の方は、充分に注意してください
coalesce 使うと遅くなる?
>>729 UPDATEはDBMSで結構差があるからなぁ
mysqlよく知らないが
update master set last_tradingdate =
(select max(tradingdate) from data_tbl where code=master.code)
とかで出来ないか?
masterに別名付けないとダメかもしれんが
>>732 729です。感謝です!セット出来ましたm(__)m
735 :
NAME IS NULL:2013/04/07(日) 13:20:22.35 ID:XikuI4eK
日記のテーブル(tD)
id,title,main_text
日記の写真のテーブル(tF)
id,diaryId,file_path,is_deleted,is_finished
以上のようなテーブルがあり、tD.id = tD.diaryIdの関係です
この状況で、日記のタイトル・文章とその日記に属する写真情報のセットを取得したいとき
left joinで on tD.id = tD.diaryId としてクエリしたら良いと思いますが
以下の条件がついた時にどうしたら良いかわかりません
条件1:tFのデータは、一つの日記に対して複数のデータを持ち、そのうちis_finishedが1かつis_deletedが0のモノだけを取得
条件2:条件1を満たせる写真情報がなければ、写真情報は必要ない。日記のテキスト情報だけを取得する。
条件3:写真情報をもたないテキスト情報も存在する。
条件1はwhereに tF.is_finished = 1 AND tF.is_deleted =0 として書けば満たせますが、
こう書いてしまうと条件2と3を満たせなくなります(写真情報のない日記を抜き出せなくなる)
どうしたら良いんでしょうか、すみませんがよろしくお願いします
736 :
735:2013/04/07(日) 13:33:53.21 ID:???
すみません、解決しました
joinの条件としてonで指定できるんですね
お邪魔しました
onの条件じゃなくて、inner join かouter joinかって話だと思うが
left joinとか何も分からず使ってるのか
>>736 亀だけど、
select * from tD left join tF on (tD.id = tF.diaryId)
where
tF.id is null -- tFと結合できなかったもの
or
is_finished = 1 and is_deleted = 0 -- tFと結合できた場合の条件
>>738 それだとis_finished=0の写真しかもたない日記が選択されないぞ
条件2の日記のテキスト情報だけを取得する、に反してる
あと俺なら結合できた場合の条件の方は括弧で囲んどく
andとorの優先順位に絶対の自信があるなら無くても良いのかもしれんが
おおほんとだ。ありがとう。
tFを事前にフィルタしてそれと結合がいっか。
select * from tD
left join (select * from tF where is_finished = 1 and is_deleted = 0) tF_filtered
on (tD.id = tF_filtered.diaryId)
>>736のonでやるってのはどうにも解決に結びつかないと思いつつ
と、作ったものの、select句に入れるのとどっちがいいんだろね。
select *
, (select file_path from tF where tD.id = diaryId and is_finished = 1 and is_deleted = 0) as file_path
from tD
以前セレクト句でサブクエリ使うのはワカッテナイ人だみたいな事言われてちょっと悩んでる。
ほしい列がひとつであることとか、抽出されるのが高々1件である前提はつくんだけど、
existsとかが許されて、こっちは許されないってのは納得いかないようにも。
>>741 たぶん、ワカッテナイ人が無暗に使うからでしょ。
結局は、それも一つの道具じゃんね。
>>742 System R 時代からの基本中の基本じゃない。
>>741 それは条件1:一つの日記に対して複数のデータを持ち
に反する
>セレクト句でサブクエリ使うのはワカッテナイ人だみたいな
お前がわかってないだけで、ちゃんと使ってる人はわかってる
そんじゃ
>>740でいいのか
って書いたらその書き方じゃだめだっていわれるのかなぁ…
onの条件で解決したって書いてんだから
select * from tD left join tF on tD.id = tF.diaryId and is_finished = 1 and is_deleted = 0
だろうがJK
747 :
NAME IS NULL:2013/04/11(木) 18:26:57.82 ID:5zVK9FJ/
MySQL 5.5.29
┏━┳━━┳━━┓
┃no┃.date┃名前┃
┣━╋━━╋━━┫
┃.1 ┃12-3┃榊 ┃
┣━╋━━╋━━┫
┃.2 ┃12-3┃山下┃
┣━╋━━╋━━┫
┃.3 ┃12-3┃斎藤┃
┣━╋━━╋━━┫
┃.4 ┃12-4┃山下┃
┣━╋━━╋━━┫
┃.5 ┃12-4┃斎藤┃
┗━┻━━┻━━┛
result:
no:1
名前:榊
このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。
当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。
宜しくお願いします。
やりたいことがよくわかんないけど
実際に削除せずに削除フラグ(削除日)の列を追加すればいいんじゃないの?
749 :
NAME IS NULL:2013/04/11(木) 19:04:40.74 ID:5zVK9FJ/
>>748 毎日別の場所から全データデータをinsertしており、削除しているわけではありません。
前日で絞り込んだものと当日で絞り込んだものを外部結合して、当日のレコードがないものがそれだとおもうよ
にしても処理の遅さってのが気になるなぁ。
PHPのコードが下手なんじゃないだろうか。もしくはレコードが10万件ぐらいあるか
751 :
NAME IS NULL:2013/04/11(木) 22:01:35.96 ID:Rj/wVQTL
遅くなりました。
PHPのコードが非効率的なのもあると思います。ただ、レコード数が2万件/day近くあり、出来ればデータベース内で処理したいなと思ったのです。
SELECT t1.no,t1.name FROM test as t1 LEFT OUTER JOIN test AS t2 on t2.date='2012-12-03'
WHERE NOT EXISTS(SELECT * FROM test WHERE name = t2.name AND date='2012-12-04') AND t1.no=t2.no
これでなんとか取得出来ました。ありがとうございます。
2万行でこのSQL走らせるとか…何もわかってねーな。
なんだろうこのクエリ
とても読みにくい
>>750の説明の通りに書いたつもりの結果なのかな
2万件/dayが二つあって、PHPで4億回ループするコード書いてそうな気がする
754 :
NAME IS NULL:2013/04/12(金) 05:59:19.07 ID:1iWE1m3w
会議室予約のようなシステムを作っています。
前提として、
Username,Email,Passwordなどのカラムを持つUserテーブルがあり、
さらに、それぞれのユーザーが
Aさん
10日月曜日 13:00-14:00
13日木曜日 15:00-16:00
14日金曜日 20:00-21:00
。
。
などのように時間の枠をいくつか指定して予約できるようにしたいです。
この場合、こうやった時間のデータをどのように保持するのが理想でしょうか
使用しているデータベースはmysqlです。
>>754 最低でも
>>1は読んでね。
情報がないので
表示する際にまとめて呼び出すべき内容だとか
仕様上の制限だとか色々なものとっぱらって中身だけとなるけど
Usernameがprimary keyだと仮定した場合
予約テーブル
Username
予約開始時刻 datetime
予約終了時刻 datetime
で、とりあえずでけるでそ。
曜日は、ホスト言語側で計算させるほうが大概はいい気がする。
756 :
NAME IS NULL:2013/04/12(金) 16:00:24.21 ID:1iWE1m3w
>>755さん
失礼いたしました。
データをテンプレにそって書き直しました。
・DBMS名とバージョン
Mysql 5.5.27
・テーブルデータ
ユーザーテーブル
ID | Username| email
--+----------+-----
1 | taro |
[email protected] 2 | jiro |
[email protected] 3 | saburo |
[email protected] 4 | shiro |
[email protected] ・欲しい結果、説明
以上のようなテーブルの各ユーザーに
10日月曜日 13:00-14:00
13日木曜日 15:00-16:00
14日金曜日 20:00-21:00
と行ったような複数の予約データを
持たせたい(会議室予約のようなイメージです。)
--------------------
755さんの示していただいた解決策は、
予約テーブルを新たに作り(primaly keyはIDでした)
予約テーブル
ID |StartDatetime |EndDatetime
--+---------------------+-------------------
1 | 2013/10/03 13:00:00 |2013/10/03 14:00:00
1 | 2013/10/03 15:00:00 |2013/10/03 16:00:00
1 | 2013/10/03 20:00:00 |2013/10/03 21:00:00
2 | 2013/10/05 11:00:00 |2013/10/05 15:00:00
3 | 2013/10/06 13:00:00 |2013/10/06 14:00:00
3 | 2013/10/07 13:00:00 |2013/10/07 14:00:00
2 | 2013/10/08 13:00:00 |2013/10/08 14:00:00
このような意味合いになるでしょうか。
だとしたらすっきりいたしました。
ありがとうございます。これで実装をしてみます。
>>756 うーむ、それで要件にマッチしてるというならそれでいいけど…。
まず、その予約テーブルのPKはIDじゃないよね?
それと、「会議室予約」をイメージするなら、こんな感じなのを想像するんだけど。
CREATE TABLE users (
user_id text, -- PK
user_name text
);
-- 会議が行われる場所
CREATE TABLE meeting_rooms (
room_id text, -- PK
rroom_name text
);
-- ある会議室で行われる会議
-- 別途、いろいろな制限をデータベースの制約かプログラムで実現する必要がある
CREATE TABLE meetings (
meeting_id text, -- PK
room_id text, -- FK: meeting_rooms.room_id
from_date datetime,
to_date datetime
);
-- 会議に参加する人達
CREATE TABLE participants (
meeting_id text,
user_id text,
);
DB設計のところから話を始めたほうがよくね?
759 :
NAME IS NULL:2013/04/12(金) 20:24:18.00 ID:WP7p6Bmy
>>752 >>753 実際に抜き出すデータは100件そこらなので、PHPの時には
2重foreachで回して、同一データが存在した場合両方を削除して最初からやり直しーといったコードを組んでおりました。
>>750さんの説明通りに書いてみたつもりなのですが、
もっと効率良く抽出出来るSQLがあるのでしたら、是非お教え願えませんでしょうか。
>>759 効率よくという以前に、結合とはどういう処理なのか、考えたほうがよいかと。
761 :
NAME IS NULL:2013/04/12(金) 22:17:06.04 ID:WP7p6Bmy
>>760 はい、実は結合を使ったのは今回が始めてでして・・・学びなおしてきます。
>>761 1. 指定日付の集合 T1 を得る
2. 指定日付の前日の集合 T2 を得る
3. T1 のうち T2 に名前のないレコードを出力する
>>761 まあ手続き型の言語ばっかりやってるとなかなか良いSQLは思い浮かばない
たとえば
>>762を馬鹿正直(日付要件勘違いしてるのは訂正)に書くと
select T1.no,T1.name from
(select * from test where [date]='2012-12-03') T1
where name not in ( select name from
(select * from test where [date]='2012-12-04') T2)
まあ、これではいまいちなんで、これを外部結合でやってもうちょいスマートに
select T1.no,T1.name from
(select * from test where [date]='2012-12-03') T1
left join
(select * from test where [date]='2012-12-04') T2
on T1.name=T2.name
where T2.name is NULL
日付指定が2か所ででてるが、条件が指定日と前日で良いなら
select T1.no,T1.name from
test T1
left join
test T2
on T1.name=T2.name and T2.date=T1.date+1
where T2.name is NULL and T1.date='2012-12-03'
まあ、俺ならこう書く
失礼します。
【質問テンプレ】
・DBMS名とバージョン
SQLiteバージョン3
・テーブルデータ
ドメインID,ドメイン名
------------
1,test1.co.jp
2,test2.co.jp
・欲しい結果
"server1.test1.co.jp"という入力に対し
"test1.co.jp"のドメインIDである1
・説明
自分のサイトへのアクセスを行うドメインを管理しています。
"server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。
それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。
以上、宜しくお願いします。
SELECT * FROM テーブル WHERE 'server1.test1.co.jp' like '%'||ドメイン名
で行けるんじゃないかな
ドメインの部分一致であればドットをちゃんと考慮しないとダメだよ。
SELECT * FROM テーブル WHERE '.server1.test1.co.jp' like '%.'||ドメイン名
パーセントの後のドットとserver1の前のドットに要注目。
単に後方一致だとserver1.latest1.co.jpがtest1.co.jpとマッチしてしまう。これは不味い。
なのでまず%の後にドットをつけて'%.test1.co.jp'というパターンを使う。
次にこれだとserver1.test1.co.jpはマッチしてもtest1.co.jpという完全一致文字列がマッチ
しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。
え、そんな難しいことは言ってないべ?
test1.co.jp も許可してやれよ。
PostgreSQL なんだから POSIX正規表現 使えよ
>>769 許可してるじゃん。
トリックの解釈が難しいのかな?
>>771 %.test1.co.jpじゃtest1.co.jpは引っ掛からないだろ。
>>772 トリックわかってないんじゃん、、、やっぱり
>>766って難しいこと書いてたのかな。
俺はすぐわかったけどなあ
>>773 おれなら
>>766のSQLはこう書く
SELECT * FROM テーブル WHERE '.'||'server1.test1.co.jp' like '%.'||ドメイン名
まあドメインの検索条件は要件次第だしよそでやってくれ
766と大差無いやん。
この例の場合はあまり関係無いけど、ドメイン名に関してはレコード数が多くなった場合は
test1.co.jpではなくjp.co.test1のようなリバースオーダーで管理した方が扱いやすいことも多い。
>>773 ごめん。
>>766のSQLをさらっとだけ見てたんだよ。
でも766の書き方じゃ変だろ。
'.server1.test1.co.jp' の左端に . があることなんて気が付かん方が多いだろうし、
. を付けるコードが入ってないじゃないか。
. を付けたいんだったら
SELECT * FROM テーブル WHERE '.'||'server1.test1.co.jp' like '%.'||ドメイン名
として検索したいデータである'server1.test1.co.jp'に'.'を付けてやらなきゃだめだろ。
index効かないからドメインの抽出はホスト言語側でやれよ。
index必要なほどたくさんのdomainをホストしているようには思えないな。
>>761 結合が初めてでMySQLならば、まずInnoDBを指定してテーブル組んで
最初に出してたユーザテーブルと
予約ID int unsigned primary key auto_increment,
ユーザID int unsigned,
予約開始時刻 datetime
予約終了時刻 datetime
で組んだうえでこの予約テーブルとユーザテーブルのそれぞれのユーザIDを外部キーで繋いでみそれ。
ああ、ちなみに外部キーかけるときは、予約テーブル.ユーザIDにもINDEXが必要。
あんまり意味がある話じゃないんだけれども、結合を利用した多次元的な組み方をより早く理解できるんじゃないかと。
効率がいいものが欲しい場合、それらを利用してどんな出力を多用するかとかの話がないと無理ポ
>>776 なもんでこれを書いてたんだと思うよ。
> 次にこれだとserver1.test1.co.jpはマッチしてもtest1.co.jpという完全一致文字列がマッチ
> しなくなってしまう。なのでトリックとして検索文字列の方にも頭にドットをつける。
実装時にはSQLでやるかロジックでやるか任せてみたんでないの
質問です。
join は、where や order by より必ず先に実行されるのでしょうか。
たとえば
select *
from employees e
join departments d on e.department_id = d.id
where e.id in (1000, 10001, 10002)
order by e.name
というSQLがあったとして、この場合だと先に where や order by で対象行を
絞りこんでから join を実行したほうが、実行効率がよいと思われます。
しかし join のほうが先に実行されると、すべての行に対して join が実行
されてから、対象行が絞りこまれす。つまり、必要のない行にも join が
実行されてします。これは効率が悪いように思います。
というわけで、SQLのjoinは必要に応じてwhereやorder byよりあとに実行される
ことがありますか。それとも必ず先に実行されますか。
RDBMSごとに違う場合は、RDBMSごとに教えていただけるとさいわいです。
>>781 とりあえず自分の使ってるRDBMSでどういう風に処理されたか確認してごらん。
どういう順番で処理されたかを知る方法はあるから。
FROM句に(SELECT 〜)置いてそれとjoinするとか
>>785 その記事で全てがカバーされてはいないが、
・実行計画とは何か
・実行計画にはどのようなものがあるのか
・実行計画はどのようにして決定されるのか
・自分が使っているRDBMSで実行計画を知るにはどうすれば良いのか
を、自分で調べろっつってんだよ、タコ
あと、コストベースとかルールベースとかがその記事になければ、そこまで調べろアホ
まぁまぁ。上の人が言いたいのは、
>>781 > というわけで、SQLのjoinは必要に応じてwhereやorder byよりあとに実行される
> ことがありますか。それとも必ず先に実行されますか。
> RDBMSごとに違う場合は、RDBMSごとに教えていただけるとさいわいです。
ケースバイケースとしか言えないから、自分で実行計画を読めるだけの知識を蓄えて、
自分で試しましょうってことだと思うよ。
SQL文に ( ) 付ければ、( ) の中から順に処理してくれるよ。
(落とし穴があることは気がつかないだろうけど)。
>>781 多分、君が効率良いだろうと思うこと(あるいはそれ以上)は、大抵のRDBMSはやってくれるよ。
まあ普通はまずemployeeをidでfilteringして、departmentsをhash joinすると思うけど。
ただ、行数とかidの散らばり具合とか(100万行のうち1000,10001,10002が95万行有るとか)によっては
filteringしない場合もあると思う。
>>786 そんなに行数費やしてるのに答えが書いてないということは、知らないってことですね。
「知ってるけど教えてやらない」という態度を取る人は、実は知らないことが
バレてしまうのを恥ずかしがってるだけだからあまり追求してやるなと、
死んだじいちゃんが言ってました。
>>787 コストベースもルールベースも、その記事に書いてますよ。読んでないんですか?
RDBMSごとに違うというよりもスキーマやクエリごとに違うというのが実際だからなぁ。
実行計画見てみなさいとしか答えようがないのでは。
>>791 で、手元にあるRDBMSが出力する実行計画の内容は理解できたの?
>>791 なりすますのは楽しい?
> 先に where や order by で対象行を絞りこんで
元はこのレベルなんだから釣るならもっと上手にお願い
>>781 >join は、where や order by より必ず先に実行されるのでしょうか
答え:いいえ。実際の実行方法はRDBMSが判断して決定します
以上、この話題終了で
春だよな。
おまけに月曜日だよな。
給料もらってSQL書いてるなら、2chで質問せずに自分で調べて考えりゃいいのに。
給料は、2chで回答してもらうため
お勉強熱心なのは良いと思うけど、
それを知ったところで彼にどんなメリットがあるんだろうか。
単純にSELECT文は宣言的であることを理解していないから出てきた質問だと思うよ。
でも組むときは手続き的に考えないとパフォーマンスを考慮できないというSQLの問題
http://mountainbigroad.jp/fc5/mysql_java.html これの最後の[root@linux ~]# java DbTestでうまくいかないのです
[root@localhost /]# java DbTest
java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
〜〜〜
こちらのコマンドでは
[root@localhost /]# java -classpath $CLASSPATH:/usr/share/java/mysql-connector-java-5.1.24-bin.jar DbTest
SQL failed.
java.sql.SQLException: Access denied for user 'centos'@'localhost' (using password: YES)
〜〜〜
という感じです
スレ違いでしたら誘導お願いします
スレチ。一応エスパーしておくとmysqlへのログインの失敗。
user: centos host: localhostというユーザがmysql上に存在するかちゃんと確認。
しかしrootでサンプルをコンパイルして実行したり/usr/shareにJar突っ込んで/etc/profileに
クラスパス追加したりと、色々な意味ですごい解説ページだね。
他のページも見たけど情報古いし(そもそもFC5だし)当時基準で考えても行儀の悪い手順が多い。
他所をあたるのが吉。
>>788 >ケースバイケースとしか言えない
じゃあjoinされる順番は固定ではなく、必要に応じてwhereやorder byよりあとに実行されることがあるというわけですね。
それがわかれば充分です。ありがとうございます。
>>789 > SQL文に ( ) 付ければ、( ) の中から順に処理してくれるよ。
> (落とし穴があることは気がつかないだろうけど)。
こう書くってことでしょうか。
select * from
(select *
from employees
where id in (1000, 1001, 1002)
order by name) as e
join departments d on e.department_id = d.id
たしかにこのほうが、
>>781より1割くらい高速なようです(PostgreSQLの場合)。
つまり、PostgreSQLの場合はjoinのほうを先にやってしまうということなんでしょう。効率悪いなあ。
>>790 > 多分、君が効率良いだろうと思うこと(あるいはそれ以上)は、大抵のRDBMSはやってくれるよ。
そうだといいんですが、上のようにjoinをあとにするよう手作業でSQLを書き換えた方が速い場合もあるので、なんとも。
サブクエリのorder byは(特殊な条件のぞいて)意味が無いんだが
それはともかくとして、ポスグレのオプティマイザそんなに貧弱なのか?
だからさ、まず実行計画の見方を勉強しようよ。
そしてRDBMSによっては、スロークエリーの検出機能があるから、その閾値を100msとかに設定して、
時間がかかるクエリの実行計画を見て、改善点があるかさがすとかしようよ。
807と781は論理的に等価なSELECT文じゃないからね。
781はnameでソートされた結果が保証されるけど807に関してはそうではない。
(仮に807がソートされた結果を返してもそれは「たまたま」)
order by無しで比較するとどうなる?
>>807 > PostgreSQLの場合はjoinのほうを先にやってしまうということなんでしょう
まだ推測ですすめるクセが残ってるね
1割ってのもあいまいな話だし、脱初心者をしたと思っている初心者の状態なのかなぁ
だから落とし穴があると書いといたのに。。。
新人君は駄目だな。
Postgresのドキュメントみるかぎりカッコつけてネストしたクエリもまず一端展開する
みたいだけど。一般論としてはカッコ付けて実行計画を強制出来るかはSQLの仕様上は
無し、実際の動作は実装依存であまり考慮の対象になる方法ではないと思うなぁ。
実行計画の見方がわからなかったので
推測に頼ることにした。
に一票
(分散トランザクションとかリモート問い合わせはスレチ…??)
基本的にSQL関係ないのはスレチ
というか、RDBMSの実装に強く依存するのはそれぞれのスレで聞けよ
日本人の払った貴重な血税から
ゴキブリ在日朝鮮人に生活保護が支払われている
ゴキブリ在日朝鮮人の一家族で年間600万円である
ゴキブリ在日朝鮮人の2人に1人は生活保護だ
これより安い給料で働いている日本人が
少ない給料から支払った税金が
ゴキブリ在日朝鮮人の生活保護になっている
ゴキブリ在日朝鮮人は生活保護をもらって
毎日パチンコをして遊んで暮らしてる
ゴキブリ在日朝鮮人の犯罪者も非常に多い
ヤクザの2人に1人はゴキブリ在日朝鮮人だ
日本社会の寄生虫 ゴキブリ在日朝鮮人
日本から出て行け! ゴキブリ在日朝鮮人
環境:アクセス2007
得点テーブル
日 科目 得点
1/1 英語 80
1/1 国語 50
1/1 数学 90
1/2 英語 70
1/2 国語 70
1/3 国語 60
1/3 数学 80
1/4 英語 60
1/4 国語 60
1/4 数学 60
このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが
どのようにすればよいでしょうか。
日 英語 国語 数学
1/1 80 50 90
1/2 70 70
1/3 60 80
1/4 60 60 60
↑欲しい結果の表示がおかしいですが
こんな結果が欲しいです
日 英語 国語 数学
1/1 80 50 90
1/2 70 70 ""
1/3 "" 60 80
1/4 60 60 60
>>821 素早い回答ありがとうございます。
環境が会社にしかないので明日試してみます。
だめそうなら別の手を考えてみます。
たとえば
1/3 "" "" ""
のような結果はそのままじゃ作れないよ、と。
こういう結果もほしい場合は
>>8 も組み合わせてね
標準SQLにはないけどアクセスにはクロス集計クエリーていう技があるから
それ使えばいいだけじゃ
最終的にエクセルで処理するんならエクセル側でピボットテーブル使うという手もある
826 :
NAME IS NULL:2013/05/09(木) 18:22:40.24 ID:3HjWO8Ji
助けてください><
新人から以下のような質問きたけど理由がわかりません。。。
「先生。SQLのavg関数はなぜwhere句で使用することができないのですか?」
827 :
826:2013/05/09(木) 18:25:16.79 ID:3HjWO8Ji
質問者です。
あれ?理由って以下でおk?
WHERE句の条件は同一行に対して適用されるからです。
正しい理由としては「SQLの文法がそう決めているから」。
厳密には入れ子クエリーの中のWHERE句では使える場合もあったりと、WHERE句の
中での集約関数の扱いの文法ルールは結構複雑。
informalな理解としては、集約関数はグループテーブル(grouped table)の中の
行グループに適用されるから、という説明が出来ると思う。
グループテーブルというのは元のテーブルを複数の行グループに分割したもので
GROUP BY句を評価した結果として得られる(GROUP BY句がない場合は全ての行を
含むただ一つの行グループからなる暗黙のグループテーブルとして扱う)。
で、SELECT文の評価順序はFROM -> WHERE -> GROUP BY -> HAVING -> SELECT
なので、グループ化される前のWHERE句では集約関数は使えないけれども
グループ化後のHAVINGやSELECTでは使えるという理屈です。
829 :
826:2013/05/09(木) 20:44:45.42 ID:???
>>828 ふむ。。。
他の子はプログラムのメソッド理解してるけどその子はって何?ってレベルの子なので
教えてくれた内容を理解するのは難しいかも(´・ω・`)
教えてくれてありがとうございました
ふむ。
ではエッセンスとしてSELECT文はFROM -> WHERE -> GROUP BY -> HAVING -> SELECT
の順番で評価する、ということだけ教えてはどうでしょうか。
SELECT文が返す結果がどう作られるのか理解するためにも大事な点なので。
そして集約関数はグループを作った後で使えるのでHAVINGとSELECTだけだと。
(厳密にはこの順番で評価した結果と「等価な結果」を返すとか暗黙のグループ
とか色々ツッコミどころはありますがその辺はとりあえず無視で)
831 :
NAME IS NULL:2013/05/09(木) 23:25:42.14 ID:iWf63QvN
mysql5.5使用しております
テーブル結合をした後に最小値を求める勉強しています
テーブルA
uuid,name
1,"田中"
2,"鈴木"
テーブルB
uuid,date
1,"2013-04-04"
2,"2012-03-03"
があるとして
SELECT a.uuid,a.name,MIN( b.date ) FROM a, b WHERE a.uuid = b.uuid
を実行してみると
1,"田中","2012-03-03"というものがかえってきてきてしまいます
832 :
NAME IS NULL:2013/05/09(木) 23:26:32.98 ID:iWf63QvN
申し訳ありません途中で送信してしまいました
1,"田中","2013-04-01"を返してもらう為のsql文を教えて頂けないでしょうか
よろしくお願い致します
04/04 からどうやって 04/01 を導くんだよ? 月初、でいいんか?
834 :
NAME IS NULL:2013/05/09(木) 23:46:43.73 ID:hRjieOLa
MIN( b.date )
これで13年4月を出すのはムリ
835 :
NAME IS NULL:2013/05/09(木) 23:57:17.88 ID:iWf63QvN
申し訳ないです
2、”鈴木”,"2012-03-03" が欲しいと思っています
イメージとして テーブルAとBを結合して
uuid,name,dateになったところで min(date)で一番日付の若い人を見つけようと思っているのですが
うまく行かず
テーブルAの1,"田中"
テーブルBの2,"2012-03-03"
が結果として表示されてしまいます
同じ日付があったら無理だけど、まず、テーブルBから最小の日付をもつレコードのuuidを求めて、
そのuuidでテーブルAと結合。
837 :
NAME IS NULL:2013/05/10(金) 00:57:34.59 ID:H99FPAxg
ありがとうございます
SELECT a.uuid, a.name
FROM a,b
WHERE a.uuid in (select b.uuid,min(b.date) from b)
(select b.uuid,min(b.date) from b) の所をどうすればいいか
テーブルBから最小の日付をもつレコードのuuidを求める方法がわからないのですが
教えて頂けないでしょうか
838 :
NAME IS NULL:2013/05/10(金) 01:08:46.71 ID:6pGPZ1aE
こんな感じでどうでしょうか?
SELECT a.uuid,a.name,b.date
FROM a
INNER JOIN b ON a.uuid=b.uuid
ORDER BY date limit 1
839 :
NAME IS NULL:2013/05/10(金) 01:18:40.11 ID:H99FPAxg
>>838 ありがとうございます
できました!
SELECT a.uuid, a.name, MIN( b.date )
FROM a, b
WHERE a.uuid = ( SELECT b.uuid FROM b ORDER BY date LIMIT 1 )
で同じようなこともできました とても勉強になりました
>>835 >>838で良いと思うが、別方法
>テーブルAとBを結合してuuid,name,dateになったところで min(date)で一番日付の若い人
を素直にSQLで書けば良いだけ
試してないけど
select a.uuid,a.name,b.date from a join b on a.uuid=b.uuid
where b.date=(select min(date) from b)
で行けるはず
mysqlは普通はエラーにならないとダメなSQLが通ったりするからSQLの勉強には向かないと思うぞ
ISO標準に完全に沿って作られてるRDBMSなんてないでしょ
完全にISO標準である必要なんてないけど
どう考えても結果が不定で実行できないSQLをエラーなしで通すのはなぁ
>>839みたいな、とんでもSQLで出来た気になってしまうのは問題だろ
843 :
NAME IS NULL:2013/05/10(金) 01:35:27.33 ID:H99FPAxg
>>840 ありがとうございます
>>840でもで問題なくできました!
>>839 これだめですね
MIN( b.date )がついてたから正しく動いてるように思えただけでした
別にとんでもSQLだとは思わないけど
aテーブルの内容を副問い合わせで表示して
その副問い合わせとは全く無関係なところでb.dateを出しちゃってるから
あんまり良いSQL文だとは言えないかもな
すみません教えてください
【質問テンプレ】
・DB2 9.7
・テーブルデータ
load済。
・欲しい結果
loadしたテーブルを使うサマリ表がエラーとなった場合、
チェックペンディングを解除したい。
・説明
下記の処理を行いました
@テーブルAにデータをロード
Aチェックペンディングになっているのでimmediate checkdをかける
→こっちは成功で、ステータスが「移動なし」に変わる
BテーブルAを使うサマリー表がチェックペンディング状態になる
Cサマリー表にimmediate checkdをかけたら算術オーバーフローで解除できず。
テーブルAのデータを確認したら集計後オーバーフローする値が入っていました
そこで、テーブルAのデータをupdateなどで操作した上で改めて更新したいのですが、
テーブルAの状態を「正常」に戻すにはどうすればよいでしょうか?
サマリー表に対して色々オプションをつけてset integrityしてみましたが、何が何でもリフレッシュしようとしてエラーになります。
イメージとしては、サマリー表をリフレッシュせずにペンディング解除することで、連鎖的にテーブルAも解除されると思っています
テーブルAだけ単独で解除してデータを更新後サマリー表のチェック解除ということもできるのでしょうか?
>>846 ありがとうございます、そちらに書いてみます。
848 :
NAME IS NULL:2013/05/15(水) 20:46:46.85 ID:sLWZCJrM
UNIOの練習をしております
テーブルa
id,price
aaaa,500
テーブルb
id,price
bbbb,600
rrrr,300
テーブルc
id,price
cccc,700
dddd,1000
eeee,900
のデータが入ってるとして
各テーブルを合体させてその後priceの最小値のレコードを表示させたいと思っております
select id,price from a where price = (select max(price) from a)
union select id,price from b where price = (select max(price) from b)
union select id,price from c where price = (select max(price) from c)
だと各テーブルのpriceの最大値が1個ずつ表示され
select id,min(price) from (
select id,price from a
union select id,price from b
union select id,price from c
)
だと#1248 - Every derived table must have its own alias
と表示されてしまいます
合体させてその後priceの最大を持ってくるsql文を教えていただけないでしょうか
よろしくお願いいたします
誤:min(price)
正:max(price)
でした
エラーメッセージの通りだろ。別名使え。
UNION以前に二つ目のクエリはGROUP BY無しでidとmax()がSELECTリストに並んでいる
のでエラーになるね。
SELECTリストからidを外すか、一つ目のクエリと同様に最大値だけ求めてから絞り込みを
する必要がある。
>>850のとおり。
あと、union all の方がいいとおもうよ。
>>851 mysqlだとgroup byなしでできてしまうかもしれない。気持ち悪い。
854 :
845:2013/05/17(金) 09:01:16.91 ID:???
>>845 uncheckedすることで解除できました
算術オーバーフローはロードしたテーブルAのデータを修正してからrefreshをかけることで解決
あと、チェックペンディングになっていたのはサマリー表ではなく間にあるステージング表でした
お騒がせしました
855 :
NAME IS NULL:2013/05/17(金) 19:07:27.79 ID:Fw65R92N
HTAアプリで、JavaScriptを使ってMySQLにアクセスしてみました
JSには当然ですがSQLエスケープ用の関数が用意されていないので、自前でしないといけないですが
単に文字列置換でシングルクオートをエスケープするだけでいいのでしょうか?
856 :
NAME IS NULL:2013/05/17(金) 19:26:56.49 ID:boKr6IGa
htaアプリっていうの知らないんだけどjavascriptでアクセスって時点でセキュリティも何もないんじゃないの?
スレ違い。
自分しか使わないローカルなアプリなので、セキュリティのためというよりは、誤動作防止のためですね
どっちにしろSQLの質問じゃねえ
860 :
NAME IS NULL:2013/05/19(日) 08:59:29.04 ID:zWNrczk3
mysqlです
【authors】
--------------------
id name
--------------------
1 hoge
〜 …
10 fuga
【books】
--------------------------------------
id author_id title
--------------------------------------
1 1 foo
… … …
10000 10 bar
ここからbookを検索したいのですが
select books.* from books join authors on authors.id = author_id where authors.name like '%word%' or books.title like '%word%';
だと重そうなので
select * from books where title like '%word%' or author_id in (select id from authors where name like '%word%');
な感じなのですがこういうときの定番なやり方ありますか?
862 :
NAME IS NULL:2013/05/20(月) 00:23:39.38 ID:QJOCjzcl
ワイルドカードに該当する部分をクエリで参照したい場合、どういう方法がありますか?
update table set col0 = 'ワイルドカード部分' where col1 like '%hoge_hoge%'
のようなことをやりたいのです
ワイルドカードが三箇所になってしまいました
hogeとhogeの間の一文字、ということです
正規表現とかマッチした部分抜き出す機能があるdbmsならできるけど。
じゃなきゃ普通はアプリ側じゃないかな
>>862 update table set col0 = col1 where col1 like 'hoge_hoge';
hogeの部分を空文字列に置換すればいいな。
hoge%と%hogeでANDで検索してsubstringとかでhoge消すのか
>>862 これでどうかな
update table set col0 = replace(col1, 'hoge', '') where col1 like 'hoge_hoge';
真ん中にhogeあったらそれも消えちゃうような
汎用的なのは、SQLだけじゃ無理だろうな。
>>869 _にhogeが入るって事?あったら驚きだね
カラム/テーブルに日本語使っている人いますか?
873 :
NAME IS NULL:2013/05/20(月) 22:30:00.97 ID:3Fvcp97C
使う理由がない
続きの質問が気になってしょうがないけど、それはきっと杞憂で、これが本来の質問なんだろうな。
いるよ。
特定の環境でしか作業しない人なら、
日本語のカラム名、テーブル名使う人いそうな気がする。
876 :
NAME IS NULL:2013/05/20(月) 22:44:45.81 ID:3Fvcp97C
いやいや、SQLの質問スレなんだから「いればその方に聞きたいのですが・・・」と続くはず
>>872が気付くのを待ったほうがいい
無理に英語使うより、税区分とかのほうがわかりやすいというのはある。
878 :
872:2013/05/20(月) 23:32:40.01 ID:???
うちの会社で作っているソフトって、全部カラム・テーブルが日本語なんですね
そして、他の会社も同じく日本語を使っていたわけです。
なので、これは一般的なのかな?と疑問に思って質問しました
在庫管理のシステムなのですが、みなさんは英語でやってますか
うちも在庫管理も含めて色んな業務アプリ作ってるけど、
日本語のテーブル名やカラム名なんてありえないよ。
ローマ字ですら少ない。
基本は英単語や短縮形。
Inventoryとか、Qtyとか、DueDateとか。
人生いろいろ、sqlもいろいろ
どこがSQLの質問なの?
今いる会社はそもそも日本の会社じゃないので当然全部英語だけれども、それ以外にも
専ら規約ベースのORMを使うのでテーブル名やカラム名をアプリのコード内で使われて
いるドメインクラス名やそのプロパティ名と可能な限り一致させているという事情もある。
クラス名やプロパティ名が英語なのでテーブルやカラムの名前も自動的に英語になる。
日本語での開発であっても例えばJavaだとHibernateなどJPA系のORMを使うのであれば
英語のテーブル名カラム名を使った方が断然楽だと思う。
さもなければ名前マッピングを全部書き下すか、開発者にクラス名等々に日本語を使えと
お願いすることになりそう(日本語のクラス名等でORMがきちんと動くかも謎)。
スレ違いネタはいらないから。
つか、専用のスレ立ってるじゃん。
そっち書けばいいじゃん。
じゃんじゃん。
t1
ID KEY HOGE
-----------------------
1 a 5
1 b 7
2 a 5
2 b 8
3 a 4
3 b 4
4 b 9
4 d 2
t2
ID KEY PIYO
-----------------------
1 a 7
1 b 1
1 c 1
1 d 5
2 a 2
2 c 8
3 a 7
4 c 6
t3
ID KEY NYAN
-----------------------
1 d 5
2 a 5
2 d 7
3 b 4
3 c 3
3 d 2
4 d 7
5 b 1
こういう3つのテーブルから
t1で KEY a b を
t2で KEY c を
t3で KEY d且つNYAN 5以上を持っているID1と2のみを取り出したいのですがどうすればいいでしょうか
なんだか崩れてしまいましたすみません
t1
ID KEY HOGE
-----------------------
1 a 5
1 b 7
2 a 5
2 b 8
3 a 4
3 b 4
4 b 9
4 d 2
t2
ID KEY PIYO
-----------------------
1 a 7
1 b 1
1 c 1
1 d 5
2 a 2
2 c 8
3 a 7
4 c 6
t3
ID KEY NYAN
-----------------------
1 d 5
2 a 5
2 d 7
3 b 4
3 c 3
3 d 2
4 d 7
5 b 1
まぁJOINって何? なんだろうけど。
運が良ければ誰かがSQL書いてくれるかもしれないしな。
890 :
NAME IS NULL:2013/05/21(火) 20:27:50.23 ID:4o/NXjFR
SQL書くのは楽なんだけどテスト用のデータベース作るのが面倒くさい
テーブルの結合条件がわからん
最終的に欲しいデータもよくわからん
検索条件っぽいのもわからん
t1で KEY a b を どうなの?
t2で KEY c を どうしたいの?
t3で KEY d且つNYAN 5以上を持っているID1と2のみを取り出したい
select * from t3 where KEY=d and NYAN>5 and ID in (1,2)
892 :
NAME IS NULL:2013/05/21(火) 21:29:34.50 ID:4o/NXjFR
IDがユニークじゃない…
893 :
872:2013/05/22(水) 00:01:12.70 ID:???
英語だとこんな感じになりますか?
商品コード → ProduceCode
納入先住所1/2/3 → CustormZip1/2/3
在庫数(総バラ) → Piece
在庫数(ケース数) →Unit
----------------------------------------------
テーブル名
出庫依頼 → info_order_list
oracle形式で明細テーブルのコード、区分をキーに、
コードマスタの名称を2種類を外部結合で取得したいです。
何か足りないようでエラーになります。宜しくお願いします。
select
親テーブル .親コード
子テーブル.コード
a.名称
b.名称
from
親テーブル
子テーブル
コードマスタ a
コードマスタ b
where 親テーブル.親コード =子テーブル.親コード
and 明細テーブル.コード =a.'ZZ'
and 明細テーブル.コード =a.コード (+)
and 明細テーブル.コード =b.'YY'
and 明細テーブル.コード =b.コード (+)
>>893 あまりにも違いすぎる。わざと間違えてるとしか考えられん。
商品はItem
納入先≠顧客=Customer≠Custorm
住所≠郵便番号=ZipCode
出庫依頼=ShippingOrder
PieceとUnitの使い方も変よ。
で、いつまでスレ違い続けるの?
899 :
NAME IS NULL:2013/05/22(水) 13:29:28.02 ID:SXOouUvj
お前がぶり返さなきゃ終わってたよ
900 :
NAME IS NULL:2013/05/22(水) 18:24:07.93 ID:SXOouUvj
t1:
id data1 data2 data3
11 good bad bad
12 bad good bad
13 good bad good
t2:
data score
good 100
bad 0
2つのテーブルがあり、t1にidに対する各データに対する評価
t2にはその評価に対する点数が入っています。
ここからテーブルを結合し、t1.idに対する、data1,data2,data3の点数を拾いたいと思っています。
その際、この場合は3回結合するしかないのでしょうか?
902 :
NAME IS NULL:2013/05/22(水) 18:34:03.54 ID:SXOouUvj
やっちゃったな・・・ID
基本的にはそうだろうけど、オプティマイザがうまいことやってくれそうな気がするな。
>>6で逆にAもBもCも持っていない、ID:02と03を取り出すにはどうしたらいいんですか?
間違えました
>>6と逆のパターンで
(問)
ID HOGE
01 B
01 E
02 A
02 F
03 C
03 G
04 D
04 F
ここからAもBもCも持っていない、ID:04を取り出すにはどうしたらいいんですか?
Havingで3にならないやつ。
Having 4以上なら当然無し
2ならA,B,Cの中からどれか2つを持っている値
1ならA,B,Cの中からどれか1つを持っている値になりますよね
Hving 0では当然駄目ですが
0でA,B,Cの中からどれか0個を持っている値を得られるならそれを得たいんです
よろしくお願いします
not in でいいだろ。
>>907 A,B,Cのどれかひとつでも持っているIDの一覧を取得し、
その一覧にないIDを選択
NOT INでは無理です
>>909 直接得るの難しいですか
ありがとうございます
>>910 こんな感じじゃないかな
SELECT distinct id
FROM TableName
WHERE id not in
(SELECT id
FROM TableName
WHERE hoge in ('A','B','C'));
SQL Serverでストアド書くときどのように書いてますか?
OracleだとPACKAGEがあるのでVBっぽく書けますが、SQL Serverはちょっとイメージがつかないです。
ゆとりw
春だからな。
馬鹿には無理
馬鹿には無理さんてここにもいたのか
スレ違い。
過疎ってるからなんでしょ。
SQL Serverスレでスルーされてただけだろ
このスレでストアドが対象外だと思うならスルーしとけば
スルーされるだけだから親切心で言ってるんだろ
ストアドは対象外。
925 :
NAME IS NULL:2013/05/27(月) 03:01:24.47 ID:qPx1TzON
MySQLでの並べ替えについてなのですが
score | address
200 おおさか
350 きょうと
180 ひょうご
100 おおさか
150 きょうと
↓↓
score | address
100 おおさか
200 おおさか
150 きょうと
350 きょうと
180 ひょうご
addressの中の最小値でソートして、最小値に続けて同じaddressの値をscore順に並べていくというソートを行いたいのですが、どのようなSQLが書けますか?
926 :
NAME IS NULL:2013/05/27(月) 03:02:21.54 ID:qPx1TzON
> addressの中の最小値
訂正
同じaddressの中のscoreの最小値
group by
こんな感じかな。
SELECT T.score, T.adress
FROM T, (
SELECT MIN(score) as minscore, adress
FROM T
GROUP BY T.address
) S
WHERE T.adress = S.adress
ORDER BY minscore, address, score
ORDER BYにaddressも入っている点がポイント。これが入っていないと
同じ最小値を持つadressが複数ある場合に期待したように動かない。
なんだかクレージーな印象
>>929 「最小値でソートして」という所が問題なんだろ。
order by address desc,score desc
でダメなん?
>>931 180 ひょうご ← 120だったら、きょうとの前にこないといけない
200 おおさか
350 きょうと
120 ひょうご ←並べ替えの評価に使う(2番)
100 おおさか ←並べ替えの評価に使う(1番)
150 きょうと ←並べ替えの評価に使う(3番)
↓
100 おおさか ←並べ替えの評価に使う(1番)
200 おおさか
120 ひょうご ←並べ替えの評価に使う(2番)
150 きょうと ←並べ替えの評価に使う(3番)
350 きょうと
>>935 この程度のことも分からずにプログラマやっていけてる?
体裁は良くないが、聞きたいことと内容は明確だろ。
937 :
NAME IS NULL:2013/05/28(火) 03:30:47.95 ID:pJTxBQZ+
アンカー間違ってるのか読む場所間違ってるのか区別付かんなw
こういうの、ウィンドウ関数できれいに書けたりするのかな?
あれが独自拡張なのか標準SQLにあるものなのかわかんないけど
>>936が安価ミスなのか、安価の先を見誤ったか、はたまた別かわからなくてもやっとする
プログラマならバグ直してください
>>939 窓関数はSQL2003から標準だけれどもどのRDBMSでも実装されているかは微妙。
無難にSQL92の範囲で書くなら
>>928みたいなサブクエリーを使う書き方になる。
でも確かに窓関数使うとスッキリ書ける。
SELECT score, address FROM T
ORDER BY MIN(score) OVER (PARTITION BY address), address, score
>>940 SQL2003からなのね。ありがとです。
すごいすっきりしてるし直感的だ、やっぱ使えるようにしとかないと。重ね重ねどもでした
再帰構造のテーブルをSQLで辿る事は可能でしょうか?
id parent value
1 null aaa
2 1 bbb
3 2 ccc
4 3 ddd
5 2 eee
このようなテーブルで4の親を辿って最初にid in (1,2)を満たすvalue(bbb)を探したいです。
DBはpostgresql9.3betaです。
944 :
NAME IS NULL:2013/05/30(木) 18:21:17.05 ID:zDo8DD4s
DB: oracle10g
テーブルにprimary key 制約(以下pk制約)を作成すると、
pk制約と同じ名前のunique indexが作られます。
このunique indexの名前をpk制約作成時に指定することは出来ますか?
作成後にalter indexで変更できることは確認済みです。
alter table TableA add constraint PK_CONST primary key (...);
select * from user_constraints where table_name = 'TableA';
select * from user_indexes where table_name = 'TableA';
pk制約、indexともに'PK_CONST'の名前になっている。
create table TableA (COLNAME number constraint PK_CONST primary key);
制約名とインデックス名を違う名前にしたいという話なら
unique indexを先に作れば
primary key using index インデックス名
でできるにはできるけど
>>945-947 ありがとうございました。
(1) create table
(2) create unique index
(3) alter table add constraint primary key using index
の順番で意図したことが実現出来ました。
一応、下記の方法でも可能でした。
DDLが分かれている方が都合が良かったので採用してません。
create table aaa (
a int,
constraint pk_const primary key (a)
using index (create unique index index_const on aaa(a))
);
950 :
NAME IS NULL:2013/06/07(金) 17:32:29.57 ID:yGnvQyXR
可能な限り、DB依存になるような構文を書きたくないんだけど
DB依存構文検出チェッカーみたいなのって、世の中にある?
952 :
NAME IS NULL:2013/06/09(日) 13:39:06.60 ID:DY/9Y4Gb
MySQLについての質問です。
highscoreというテーブルに、id, scoreという2つのカラムがあります。
idのインデックスはPRIMARYです。
POSTでidとscoreの値が送られてきたとき、
そのidが既に登録されている場合、送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、
送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたいのですが、
条件分岐の部分でどのようなSQLを書けばよいのか検討がつきません。
何かヒントをいただければ幸いです。よろしくお願いします。
SQLじゃなくてストアドでやる話。
そんなたいそうなもんじゃなかろう。
やり方は色々思いつくけど、SQL文を2つ発行するのが初心者向けかな。
SQL二つ発行するのは、本来なら分離レベルとかロック制御とか考慮しないといかん
最近のDBMSなら1文で出来るやつもあるから、MySQLで使えるかどうか調べてみたら
upsertとか、mergeとか言われてるやつな
>>952 idが 1 で、入れようとしている score が 9999 の場合
INSERT INTO highscore (id, score) VALUES (1,9999)
ON DUPLICATE KEY UPDATE score = IF(score<9999, 9999, score);
でできると思います。
存在しない id ならそのまま INSERT、存在する id ならば IF で
DBの score より大きければその値を、同じか小さければ元の値でUPDATE。
ちょっとスマートじゃないね。
958 :
952:2013/06/09(日) 17:45:07.54 ID:???
御回答いただいた皆様大変ありがとうございました。
>>957さんの方法で実装できました。
scoreが更新されていなくてもUPDATEするのが無駄に思えますが、
とりあえずこれで運用してみます。
ストアドプロシージャについても調べてみます。
ありがとうございました。
959 :
NAME IS NULL:2013/06/13(木) 04:44:36.45 ID:gtAIlzh6
質問させてください
アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです
アマゾンと少し違うのは、商品そのものの評価ポイントではなく、
商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです
まとめると、
・特定の出品者の出品した商品の評価ポイントの平均値をとる
・同時に、レビューの件数をとる
・判明してるキーはt_prof.keyのみです
テーブルは以下の通り。
レビューtable =t_review
===============================
reviewId -- int(11) :プライマリキー、auto_increment
workId -- int(11) :商品のID
userId -- int(11) :出品者のID
point -- tinyInt(1):評価ポイント(1〜5)
出品者プロフィールtable =t_prof
===============================
userId -- int(11) :プライマリキー、auto_increment
namae -- text :出品者の名前
key -- int(3):キー。ユニーク
どんなクエリを書いたらいいんでしょうか
すみません、よろしくお願いします
1回の出品に対する評価は何回?
複数のの出品者が「同じ商品」を複数個出品することがある?
「判明しているキー」に「プライマリーキー」が含まれていないが?
「サンプルデータ」と「欲しい結果」を出してくれ
これだけなら、出品者IDでgroup byしてavgとcountでよくないか?
where userId = (select userId from t_prof where key = 判明しているキー)
select p.namae,avg(r.point),count(r.point) from t_review r,t_prof p where r.userid=p.userid group by r.userid;
こんなんでどお?
動かしてないけど、p.namaeがgroup byにないってエラーがでそう。
mysqlだったらどれかひとつが勝手に選ばれるという話だったかも
>>959 t_prof.keyは何に対してユニークなんだ
評価はNULLはあり得るのかとかその場合は評価件数に加えるのかとか
いろいろ詰まってないところがあるが
select t_prof.userId,count(*),avg(point)
from t_review join t_prof on t_review.userId=t_prof .userId
where t_prof.key=判明してるキー
group by t_prof.userId
とかで良いんじゃね
始めたばかりでググりましたがよくわかりません
結果がなしなのを0で返したいのです
T-sql
select @test=data from db where 除外内容
宣言済のtestに0か数字を入れたいのです
sumなりで返せばいいだろ。
>>966 SQLの話から外れるけど、ホスト言語側で大概、結果のレコード数を返す
関数が用意されているから、それで見るのが比較的常套だと思うけど。
それをサブクエリーにして、レコード数を集めたりしているのであれば
count()を使えばいいんじゃないかね。
>>966 ISNULL関数使え
つか特定DBの話はそこで聞け
>>967 SUMは対象が全てNULLならNULL返す
>>968 あれレコード数見てるんじゃないぞ
970 :
959:2013/06/14(金) 23:24:15.62 ID:???
>>960-965 ありがとうございます
COUNTやAVGの使い方を復讐しつつそれぞれ参考にさせていただきます
復讐は何も生まないよ
Revengeコマンド、作る?
Living Well Is The Best Revenge
974 :
NAME IS NULL:2013/06/15(土) 16:04:10.91 ID:FktO2NAp
どなたかお願いいたします。
私初心者で「ゼロから始めるデータベースSQL」という本で勉強をしています。付属のソフトをインストールしてパスワードを入れて書いてある通りにやってるんですが最初のテーブルを作るところでエラーが出てしまい困ってます。
Create table shohin;
と入れると
";"またはその近辺でエラーと出ます。
これはなぜでしょうか。
よろしくお願いします。
975 :
NAME IS NULL:2013/06/15(土) 16:15:53.30 ID:FktO2NAp
すみません。
中身何も入れてないからか!?と思い、書いてある通りに入れたら、
プライマリキーはテーブル"shohin"に暗黙的なインデックス"shohin_pkey"を作成します
と出たのですが、これはテーブルを作成できたんでしょうか
976 :
NAME IS NULL:2013/06/15(土) 16:19:55.22 ID:FktO2NAp
ごめんなさい。
できてるみたいです
日本語でおKって話ですよね
初心者すぎました
すみません!
書いてる通りにやってないだろ。
初心者に素直さを期待してはいけない
本当の初心者は、めんどくさそうな手順は後からやろうと飛ばすものだ。
問題は飛ばしたことをすっかり忘れることだなw
981 :
NAME IS NULL:2013/06/16(日) 15:21:55.25 ID:uKsaBYgK
中身何も入れてないってどういうこっちゃ?
データベース作ってないのにテーブル作ろうとしたのかこいつ
> Create table shohin;
って書いてるだろうw
>>981 カラム定義
列は後回しにして、とりあえずテーブルを作ってみようって思ったのかも。
斬新な発想だな。
プロには想像もつかない。