SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>102
直積で結合して、textとwordを引数にとる文字列検索関数があれば、それをWHERE句の絞り込み条件にすればできるな。 >>112
兄弟の数は可変なの?
2固定なら普通にjoinすればいい >>112
こんな感じでいいと思う
SELECT
MM.学級
,MM.氏名
,MM.電話番号
,S1.学級 AS 兄弟学級1
,S1.名前 AS 兄弟氏名1
,S2.学級 AS 兄弟学級2
,S2.名前 AS 兄弟氏名2
,S3.学級 AS 兄弟学級3,
S3.名前 AS 兄弟氏名3
FROM T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
on S1.電話番号 = MM.電話番号
and S1.学級 <> MM.学級
LEFT JOIN T_児童マスタ AS S2
on S2.電話番号 = MM.電話番号
and S2.学級 <> MM.学級
and S2.学級 <> S1.学級
LEFT JOIN T_児童マスタ AS S3
on S3.電話番号 = MM.電話番号
and S3.学級 <> MM.学級
and S3.学級 <> S1.学級
and S3.学級 <> S2.学級
WHERE nz(S1.学級,999) <= nz(S2.学級,999)
and nz(S2.学級,999) <= nz(S3.学級,999) >>117
ありがとうございます。
これから試してみます。 >>117
少し拡張してみたところ「演算子がありません」とのエラーが
出てしまいます。かなり初歩的な質問になってしまいますが、
問題点をお教えください。宜しくお願いします。
SELECT MM.ID, MM.入学年度, MM.学年, MM.[クラス], MM.[クラス内番号],
MM.姓, MM.名, MM.[せい], MM.[めい],
MM.性別, MM.生年月日, MM.電話番号,
MM.市区町村, MM.町域,MM.番地, MM.号, MM.建物名, MM.郵便番号,
MM.地区・常会, MM.下校コース,
MM.父名, MM.父連絡先, MM.父連絡先電話番号,
MM.母名, MM.母連絡先, MM.母連絡先電話番号,
MM.緊急連絡先1, MM.緊急連絡先2, MM.緊急連絡先3,
S1.学年 AS 在学兄弟姉妹クラス1, S1.名 AS 在学兄弟姉妹名1,
S2.学年 AS 在学兄弟姉妹クラス2, S2.名 AS 在学兄弟姉妹名2,
S3.学年 AS 在学兄弟姉妹クラス3, S3.名 AS 在学兄弟姉妹名3,
MM.PTA役員, MM.備考, MM.除籍
FROM T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
ON S1.電話番号 = MM.電話番号 ←ここ
AND S1.学年 <> MM.学年 ←ここ
LEFT JOIN T_児童マスタ AS S2
ON S2.電話番号 = MM.電話番号
AND S2.学年 <> MM.学年
AND S2.学年 <> S1.学年
LEFT JOIN T_児童マスタ AS S3
ON S3.電話番号 = MM.電話番号
AND S3.学年 <> MM.学年
AND S3.学年 <> S1.学年
AND S3.学年 <> S2.学年
; >>112 >>117 >>120
こんな感じにしてみましたが、
今度は「JOIN式はサポートされていません。」
と出てしまいます。
SELECT MM.ID, MM.入学年度, MM.学年, MM.[クラス], MM.[クラス内番号],
MM.姓, MM.名, MM.[せい], MM.[めい],
MM.性別, MM.生年月日, MM.電話番号,
MM.市区町村, MM.町域,MM.番地, MM.号, MM.建物名, MM.郵便番号,
MM.地区・常会, MM.下校コース,
MM.父名, MM.父連絡先, MM.父連絡先電話番号,
MM.母名, MM.母連絡先, MM.母連絡先電話番号,
MM.緊急連絡先1, MM.緊急連絡先2, MM.緊急連絡先3,
S1.学年 AS 在学兄弟姉妹クラス1, S1.名 AS 在学兄弟姉妹名1,
S2.学年 AS 在学兄弟姉妹クラス2, S2.名 AS 在学兄弟姉妹名2,
S3.学年 AS 在学兄弟姉妹クラス3, S3.名 AS 在学兄弟姉妹名3,
MM.PTA役員, MM.備考, MM.除籍
FROM
(
(
T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
ON S1.電話番号 = MM.電話番号
AND S1.学年 <> MM.学年
)
LEFT JOIN T_児童マスタ AS S2
ON S2.電話番号 = MM.電話番号
AND S2.学年 <> MM.学年
AND S2.学年 <> S1.学年
)
LEFT JOIN T_児童マスタ AS S3
ON S3.電話番号 = MM.電話番号
AND S3.学年 <> MM.学年
AND S3.学年 <> S1.学年
AND S3.学年 <> S2.学年
; >>121
accessでは一つのクエリではできないみたい
サブクエリ作って3段重ねで繋げてみて 重複行を見付けたら一行のみ残して他を削除したいのですが、
列名などを指定せずに、
DeleteDuplicateRow テーブル名
みたいなコマンドは無いのでしょうか?
キーは有りません。 その残す1行の指定はどうやって決まる?
基本的にSELECTできるものは消せる >>124
重複しているので、どれを消しても良いと思うのですが。 重複って言うのは、特定のフィールドだけじゃなく
(プライマリーキー以外)全てのフィールドが同じ値になるレコード
って意味で良いのかな? >>126
そうです。
プライマリキーも設定していません。 >>127
a
a
a
これを一行残して消すとか無理だろ >>128
sqlserver ならrownumber関数使えばできる >131
とりあえずMySQLです。SQL SERVERでもやりたいです。 >>132
やはり他の同じ値になるレコードと区別するために
一意のカラムをつけないと削除は無理だと思います
あるいは、>>129さんのやり方でテーブル全体を作り直すのが簡単 一意になるフィールドがあれば(例えばプライマリキーがあれば)、
プライマリキー以外のフィールドでグループ化し、
その上で、一番小さなプライマリキー値のリストを取得、
そのキーリスト以外の全レコードを削除、って感じでできます。 RDBMSで全く同じレコードは扱うの大変だし意味ないので今後のためにキー追加するか
重複したものは登録できないようにしたほうが良さげ 皆さん、いろいろアドバイスありがとうございました。
134さんの方式を試してみます。
重複する行を除去するような操作は普通はやらないのですか? だからその重複させるような事態そのものを発生させないようにしてるんだってば 重複データ消すのに、rownumber 関数が使えればorder byが使えるので、金額が大きいのとか最新のを残すとかできて便利なんだよな
http:/sotoattanito.hatenablog.com/entry/2015/10/20/230208 >>121 >>122
かなり長文になりましたが、うまくいきました。
ありがとうございました。 >>140
質問だけなら長文にならないだろ
後付けの条件あるからだろ 以前見たDBのER図でずっと気になってるのがあるんだが
複合主キーでテーブル繋げていくやり方って普通なんかな
例えば
「個人」テーブルでは「氏名・電話番号・性別・年齢」を主キー →
繋がる「生徒」テーブルで「生徒番号」が追加 →
「塾」テーブルでは「塾番号」が追加 →
「教室」テーブルでは「教室番号」が追加
DB連携の案件(基幹系のDBに、WebとDBが一緒になった鯖からでリンクドサーバで合体)で、その教室テーブルの先に
「塾生がどこの塾で試験申し込んだか」を突っ込むテーブルこさえてどうこうするって奴だったんだが
みたいなのとでもいうか、SQLで書くと
select *
from school inner join
(select *
from person inner join student on
person.name = student.name and person.tel = student.tel and
person.gender = student.gender and person.age = student.age) as selected_student on
selected_student.name = school.name and selected_student.tel = school.tel ... ;ごめんもう無理
みたいな奴
細部があってるかどうかは覚えてないが、だいたいそういうSQLでないと仕様がない
ER図だったから泣きながらやった
書籍を見るととりあえずID振って縛りたいのにユニーク制約らしいんだが
実際だと複合主キー使っていくんだろうか?
正直DBの設計よくわかってない下請けのアホなんで、NE〇の方が正しいのかなあ、などと疑問が 正確にはプログラマーですらない事務員 orz なんか釈然としないんだが、そういうものなのかなあ、と >>142
>「個人」テーブルでは「氏名・電話番号・性別・年齢」を主キー
そもそもこれが普通じゃない
> 正直DBの設計よくわかってない
本買って読め 個人で主キーに年齢含むのは普通ないとは思うが
複合キーそのものは別に珍しい物でもない
まあ、ミドル層の都合で全部にID振ろうとか言う流れも無いわけではないけどな 年齢は毎年変わるだろう
キーにしたいなら、生年月日の方 >>146
17からインクリメントしない声優なら知っている 人によって異なる解釈を受けるような定義名は避けた方がいい qiitaって無能のくせにタイトルで煽って
一読すれば書き手が思い込みの激しい初心者だってわかるんだけど
多数からコメントで間違い指摘されるとクソリプがwwwwwwwと煽ったり
せやから違う場合もあるって最後に書いてるやろ日本語読めんのかバカチョンwww
みたいな臭い奴が結構混じってるけどアレなんのためにやってんの?
誤解を招くタイトルでgoogle上位になるとqiitaから金もらえるの? お邪魔いたします。
ManegementStudioでストアドプロシージャをかけるようになりたいのですが、
家庭教師をしてくださる方いらっしゃいませんでしょうか?
お礼はご相談にて。
捨てアドをさらしますので、ボランティア精神にあふれる方お待ちしております。
rirarira_01@yahoo.co.jp >>154
お礼をするというのにボランティアとはどういうことなのか? >>154
Transact-SQLの本ならあるだろ。
昔からそんなに変わってない。
Management Studioがどうこうというはどういう意味? >>155
すみません、言葉足らずでした。
お礼はするんですが、なかなかお忙しい皆様が多いかと思いますので、
不勉強な私に時間を割いてくださるボランティア精神にあふれる方を
募集しておりました。
>>156
ありがとうございます。
早速購入してみます。
一次面接を合格した企業様がManegementStudioを使用しており
(SQLserber2014)ManegementStudioを使用して、
ストアドプロシージャをかけるようになりたいので、
ManegementStudioの操作性、ストアドプロシージャの知識、
両方が必要となる感じでございます。
現在ManegementStudio勉強環境にインストールして少しずつ勉強中ですが、
二次面接まで時間がないもので、どなたかに家庭教師していただけないかと思い、
失礼ながら書き込ませていただきました。
二次面接は来週早々なので、本が届くのが先か面接が先かという風になってし舞うかと思いまし手…。
どなたかお引き受けいただけませんでしょうか? 綴りの間違いは恥ずかしいから直して
企業様wもそういうのチェックするよ >>157
論理構成に難があるようだけど
二次は慎重にね。 >>161
こんな簡単な間違いもくみ取れないバカは黙ってろw その環境での開発経験が必須スキルって面接なら不合格になるべき状況だし、
そうじゃないなら環境作ることができて、足し算するだけのストアドつくれりゃあとはどうとでもなると思うよ。 >>160様
ありがとうございます。
ありのままのスキルをお話ししてきました。
>>163様
ありがとうございます。
ストアドはできれば尚可の条件なので必須ではないのですが、
出来てくれると嬉しいな、ということでしたので勉強しておりますが、
環境作るところまでしか進んでおりません。
本日結果が出るのでお世話になったお礼に結果はご報告させていただきます。 サブクエリを使う場合、サブクエリも範囲を絞ることで結果扱うデータ量が減って計算時間が短くなりますが、コードの可読性が悪くなります。
なにか良いアイデアはありませんか? サブクエリエオ使ったぐらいで「コードの可読性が悪くなります。」なんてウスラバカはそしたらここに書き込む低能 いっそプロシージャーにして見えなくしてしまったら? よろしければ教えていただければと思います
変数名に使われるstrsplって何の略でしょうか?
どうにも気になってしまって string split かねぇ
ggrと strsql を案内されるな ちょっと教えて欲しいんですけど。
select * で出てくるものについて、 レコードは並び順は不定ってのは知ってるんですが、カラムの順ってのはどうなってるんですか?
create tableで定義した順?
mysqlで自分で作ったテーブルで見るとなんか定義した順みたいだけど。。。 まあこれは定義した順
でもまあそういうのが気になる状況では * あまり使わないかなあ >>176
ありがとです。自分で書いているのは * の時でも全部カラム名を書くようにはしているんですが。 select * で列リストが定義順でない実装は見たことがないけど
それってちゃんとSQL仕様として決まってるのか >>178
知らんけど決まってないと * 表記自体使えなくね?
insert もカラム指定なくても使えるし。
information_schema 見れば分かるのかな。 列リスト指定しないinsertは*とは書かないからなぁ
information_schemaで列の定義順がみれたしても、*の出力が定義順だという保証にはならないだろ
集合論として行の順番に意味がないなら、列の順番にも意味はないような気がするけど
列の順番はデータじゃなくて定義の一部だって言われたら意味があるような気もするが >>180
select * の順番は何かしら定義されていると思うよ。そうでないと何で select * と書くことが認められているのか分からない。
insert で列リストを省略した時も values に最初に書いた値がどの列に入るか分からなかったら、何で省略できるのさって話になる。
あと列リストは組とかタプルとかいうやつで集合じゃないでしょ。こっちは順序あるし同じ値が勝手に1つにまとめられたらチョー困る。 table1
code comment
----- -------------
A001 コメント1です
A002 コメント2です
A005 コメント5です
table2
name code1 code2 code3
----- ------ ------ ------
名前8 A003 A002 A007
名前3 A004 A003 A001
名前2 A008 A001 A005
があり、例えば特定のキーワード
keyword = '1です'
に comment が部分一致するような code を含む table2 の行を取り出したいのです。
この例では、
名前3
名前2
の行です。
事前にtable1でキーワードに一致するものを見付けてそれを含むtable2の列を探せば良いと思うのですが、
SQL初心者なのでとっかかりが分かりません。
どういう命令でやるべきなのかヒントを教えて下さい。 ヒントをってことなんだけど、table2からA001のコードを持つ行を取得することはできるんだろうか >>184
そのSQLを書いて頂けませんでしょうか? select t21.name
from table1 as t1
inner join table2 as t21 on t1.code = t21.code1
where t1.comment like '%1です%'
union
select t22.name
from table1 as t1
inner join table2 as t22 on t1.code = t22.code2
where t1.comment like '%1です%'
union
select
t23.name
from table1 as t1
inner join table2 as t23 on t1.code = t23.code3
where t1.comment like '%1です%'
多分↑で通るけど、もっといい模範解答求む select name from table2 t2,
(select code from table1 where comment like '%1です%') t1
where
t2.code1 = t1.code or t2.code2 = t1.code or t2.code3 = t1.code; >>191
さんの方法で出来ました。
>>188
さんの方法も試したのですが、うまく行きませんでした。
私のやり方が悪いのかもしれません。
皆さんありがとうございました。助かりました。 もう一つ教えて下さい。
>191さんの方式ですと出力が
name, code になりますが name のみにして distinct したいのですが
やり方が分かりません。
宜しくお願い致します。 >>193
その通りやってますか?
select文に指定している name しか表示しないはずですけど
先頭行に distinct 加えれば重複している name は消えます。
select distinct name from table2 t2, csvからphpmyadminでインポートしてるんだけど途中で止まってしまう
7000行くらいのデータが3000ちょいで切れて、その後継ぎ足しても10行程でまた切れる
あんまりsql関係ないけど原因わかる人いたら教えて
ちなみにxampp >>194
勘違いでした。
select * ...
としていました。
うまく行きました。
ちなみに>191のような
selectの中に(select ... )があるのは何ていう方式なのでしょうか?
ググルためのキーワードを教えて下さい。 えっ、データベースの板に来るくらいなら、いくらなんでもサブクエリという名前くらい知っとけよ >>197
ありがとうございました。
サブクエリ、初めて耳にしました。難しいです。
一時テーブル(#テーブル)と言うやつとは違うんですか? 一応ここは初心者スレって名前ついているし
ベテランから見たら知ってて当たり前と思う質問でも
優しく回答してやれよ >>195
php文字化けとかめんどくさいから
.Netとかでそういうのやってる 195だが
エラー行から改めて入れて、エラー行から改めて入れて
何回かやったら全部入ったわ
原因はわからん
なんやら文字コード的なエラーメッセージだった気がする DBに突っ込んだデータに対してちょっと込み入った操作をしたいとき、
例えば、「ORDER BY id ASC した状態で、前の行と比較して DATA の値が2以上離れてる行が3行以上続く」ケースを抜き出したいとき、
一般的に (個人的にでもいいです) どんなやり方が最も望ましいんでしょうか?
全行ガサッと取ってきてプログラム側でせこせこ判定していく以外思いつけなくて、これでいいのか不安です >>203
SQLや処理系ごとの拡張で頑張るとか
ストアドで処理するとか
それだけではどの方法が最善かはわからん >>203
実現できる方法でやる。
結果が問題なければ
そもそも何を不安に思う?
それは何故よ? 日本終了
ーーーーーーーーーーーーーーーーー
22日からの大雪で航空機が相次いで欠航となった北海道の新千歳空港で、24日夜、100人あまりの中国人が抗議し激しく詰め寄る騒ぎがあった。 >>203
window関数のlagを使った例
select
id
,data
from
(
select
id
,data
,data - lag(data, 1) over(order by id) as delta1
,lag(data, 1) over(order by id) - lag(data, 2) over(order by id) as delta2
from
tab1
)
where
abs(delta1) >= 2
and abs(delta2) >= 2
; select
id
,data
from
(
select
id
,data
,data - lag(data, 1) over(order by id) as delta1
,lag(data, 1) over(order by id) - lag(data, 2) over(order by id) as delta2
from
tab1
)
where
abs(delta1) >= 2
and abs(delta2) >= 2
; 教えて下さい。
カラムが
code,:index
name:名前
date_from:始めの日付 2017/1/1
date_to:終わりの日付 2017/1/3
days:差分 2
というレコードが1つあった場合に
2017/1/1 index 名前
2017/1/2 index 名前
2017/1/3 index 名前
という風に出力するSQL文を教えて下さい。
ちなみに postgresql です。 >days:差分 2
このカラムの意味が分からない 質問させていただきます。
2017-01-01 01:00:00
2017-01-02 01:00:00
2017-01-03 01:00:00
2017-01-04 01:00:00
といったdatetime型(Y-m-d H:i:s)のレコードdtimeを持つt1テーブルと
2017-01-02
2017-01-03
といったdate型(Y-m-d)のレコードdateを持つt2テーブルがあります。
t1テーブルのdtimeからt2テーブルのdateと日付(Y-m-d)部分が一致しないレコードを取り出すにはどのような記述をすれば良いでしょうか
この例の場合はdateにある2,3日のレコードを省いて1,4日のレコードのみを取り出したいです。 ■ このスレッドは過去ログ倉庫に格納されています