0001NAME IS NULL2016/05/12(木) 05:29:07.61ID:HmbS4CfD SQL初心者用の質問スレッドです。
0121NAME IS NULL2016/10/17(月) 20:30:12.67ID:3tZ2amHg>>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.学年 ; 0122NAME IS NULL2016/10/18(火) 00:34:12.50ID:???>>121 accessでは一つのクエリではできないみたい サブクエリ作って3段重ねで繋げてみて 0123NAME IS NULL2016/10/18(火) 03:32:30.90ID:??? 重複行を見付けたら一行のみ残して他を削除したいのですが、 列名などを指定せずに、 DeleteDuplicateRow テーブル名 みたいなコマンドは無いのでしょうか? キーは有りません。 0124NAME IS NULL2016/10/18(火) 11:21:45.19ID:??? その残す1行の指定はどうやって決まる? 基本的にSELECTできるものは消せる 0125NAME IS NULL2016/10/18(火) 11:44:05.07ID:???>>124 重複しているので、どれを消しても良いと思うのですが。 0126NAME IS NULL2016/10/18(火) 11:49:15.77ID:??? 重複って言うのは、特定のフィールドだけじゃなく (プライマリーキー以外)全てのフィールドが同じ値になるレコード って意味で良いのかな? 0127NAME IS NULL2016/10/18(火) 11:52:11.08ID:???>>126 そうです。 プライマリキーも設定していません。 0128NAME IS NULL2016/10/18(火) 12:29:42.88ID:???>>127 a a a これを一行残して消すとか無理だろ 0129NAME IS NULL2016/10/18(火) 12:34:08.13ID:??? distinctで作り直す 0130NAME IS NULL2016/10/18(火) 12:36:25.12ID:???>>128 a 0131NAME IS NULL2016/10/18(火) 12:36:59.34ID:???>>128 sqlserver ならrownumber関数使えばできる 0132NAME IS NULL2016/10/18(火) 12:39:09.00ID:??? >131 とりあえずMySQLです。SQL SERVERでもやりたいです。 0133NAME IS NULL2016/10/18(火) 14:01:40.70ID:???>>132 やはり他の同じ値になるレコードと区別するために 一意のカラムをつけないと削除は無理だと思います あるいは、>>129さんのやり方でテーブル全体を作り直すのが簡単 0134NAME IS NULL2016/10/18(火) 15:17:32.19ID:??? 一意になるフィールドがあれば(例えばプライマリキーがあれば)、 プライマリキー以外のフィールドでグループ化し、 その上で、一番小さなプライマリキー値のリストを取得、 そのキーリスト以外の全レコードを削除、って感じでできます。 0135NAME IS NULL2016/10/18(火) 17:24:15.67ID:??? RDBMSで全く同じレコードは扱うの大変だし意味ないので今後のためにキー追加するか 重複したものは登録できないようにしたほうが良さげ 0136NAME IS NULL2016/10/19(水) 01:24:02.04ID:wlxzgloU 皆さん、いろいろアドバイスありがとうございました。 134さんの方式を試してみます。 重複する行を除去するような操作は普通はやらないのですか? 0137NAME IS NULL2016/10/19(水) 06:20:22.91ID:??? だからその重複させるような事態そのものを発生させないようにしてるんだってば 0138NAME IS NULL2016/10/19(水) 07:09:29.07ID:???>>136 そのためのプライマリキーです 0139NAME IS NULL2016/10/19(水) 07:23:29.08ID:??? 重複データ消すのに、rownumber 関数が使えればorder byが使えるので、金額が大きいのとか最新のを残すとかできて便利なんだよな http:/sotoattanito.hatenablog.com/entry/2015/10/20/230208 0140NAME IS NULL2016/10/19(水) 18:19:03.82ID:???>>121>>122
かなり長文になりましたが、うまくいきました。 ありがとうございました。 0141NAME IS NULL2016/10/20(木) 05:26:44.31ID:???>>140 質問だけなら長文にならないだろ 後付けの条件あるからだろ 0142NAME IS NULL2016/10/25(火) 01:39:06.04ID:??? 以前見たDBのER図でずっと気になってるのがあるんだが 複合主キーでテーブル繋げていくやり方って普通なんかな
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 ... ;ごめんもう無理
事前にtable1でキーワードに一致するものを見付けてそれを含むtable2の列を探せば良いと思うのですが、 SQL初心者なのでとっかかりが分かりません。 どういう命令でやるべきなのかヒントを教えて下さい。 0183NAME IS NULL2016/12/24(土) 04:29:21.61ID:??? ヒントをってことなんだけど、table2からA001のコードを持つ行を取得することはできるんだろうか 0184NAME IS NULL2016/12/24(土) 07:36:26.32ID:??? Like と In でできるだろうけど、遅そう。 0185NAME IS NULL2016/12/24(土) 09:08:19.15ID:???>>184 そのSQLを書いて頂けませんでしょうか? 0186NAME IS NULL2016/12/24(土) 09:22:17.32ID:??? ヒントじゃねーじゃん 0187NAME IS NULL2016/12/24(土) 10:30:13.30ID:??? わらた 0188NAME IS NULL2016/12/24(土) 11:03:45.73ID:??? 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です%'
多分↑で通るけど、もっといい模範解答求む 0189NAME IS NULL2016/12/24(土) 12:12:04.02ID:??? ヒント like in exists 0190NAME IS NULL2016/12/24(土) 13:00:19.00ID:???>>182 ヒント where 0191NAME IS NULL2016/12/24(土) 13:13:57.30ID:??? 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; 0192NAME IS NULL2016/12/24(土) 13:43:58.17ID:???>>191 さんの方法で出来ました。 >>188 さんの方法も試したのですが、うまく行きませんでした。 私のやり方が悪いのかもしれません。 皆さんありがとうございました。助かりました。 0193NAME IS NULL2016/12/24(土) 14:45:42.42ID:??? もう一つ教えて下さい。 >191さんの方式ですと出力が name, code になりますが name のみにして distinct したいのですが やり方が分かりません。 宜しくお願い致します。 0194NAME IS NULL2016/12/24(土) 15:01:12.39ID:???>>193 その通りやってますか? select文に指定している name しか表示しないはずですけど
先頭行に distinct 加えれば重複している name は消えます。 select distinct name from table2 t2, 0195NAME IS NULL2016/12/25(日) 01:34:13.09ID:G9kEUO4A csvからphpmyadminでインポートしてるんだけど途中で止まってしまう 7000行くらいのデータが3000ちょいで切れて、その後継ぎ足しても10行程でまた切れる あんまりsql関係ないけど原因わかる人いたら教えて ちなみにxampp 0196NAME IS NULL2016/12/25(日) 02:16:42.88ID:???>>194 勘違いでした。 select * ... としていました。 うまく行きました。 ちなみに>191のような selectの中に(select ... )があるのは何ていう方式なのでしょうか? ググルためのキーワードを教えて下さい。 0197NAME IS NULL2016/12/25(日) 02:22:28.53ID:??? えっ、データベースの板に来るくらいなら、いくらなんでもサブクエリという名前くらい知っとけよ 0198NAME IS NULL2016/12/25(日) 12:45:10.61ID:???>>197 ありがとうございました。 サブクエリ、初めて耳にしました。難しいです。 一時テーブル(#テーブル)と言うやつとは違うんですか? 0199NAME IS NULL2016/12/25(日) 13:04:03.09ID:??? 一応ここは初心者スレって名前ついているし ベテランから見たら知ってて当たり前と思う質問でも 優しく回答してやれよ 0200NAME IS NULL2016/12/25(日) 13:37:54.49ID:GwZs/74I>>195
php文字化けとかめんどくさいから .Netとかでそういうのやってる 0201NAME IS NULL2016/12/25(日) 23:40:17.47ID:G9kEUO4A 195だが エラー行から改めて入れて、エラー行から改めて入れて 何回かやったら全部入ったわ 原因はわからん なんやら文字コード的なエラーメッセージだった気がする 0202NAME IS NULL2016/12/26(月) 11:14:14.73ID:fjjmXLRbhttps://youtu.be/7EekMD3GGHQ
https://youtu.be/xHx5MbIGEoY0203NAME IS NULL2016/12/26(月) 17:20:52.17ID:5PC6tP3J DBに突っ込んだデータに対してちょっと込み入った操作をしたいとき、 例えば、「ORDER BY id ASC した状態で、前の行と比較して DATA の値が2以上離れてる行が3行以上続く」ケースを抜き出したいとき、 一般的に (個人的にでもいいです) どんなやり方が最も望ましいんでしょうか?
全行ガサッと取ってきてプログラム側でせこせこ判定していく以外思いつけなくて、これでいいのか不安です 0204NAME IS NULL2016/12/26(月) 18:47:08.33ID:???>>203 SQLや処理系ごとの拡張で頑張るとか ストアドで処理するとか
それだけではどの方法が最善かはわからん 0205NAME IS NULL2016/12/26(月) 18:52:31.92ID:???>>203 実現できる方法でやる。 結果が問題なければ そもそも何を不安に思う? それは何故よ? 0206NAME IS NULL2016/12/26(月) 19:34:01.38ID:???>>203 window関数 0207NAME IS NULL2016/12/26(月) 20:24:10.05ID:??? 日本終了
ーーーーーーーーーーーーーーーーー 22日からの大雪で航空機が相次いで欠航となった北海道の新千歳空港で、24日夜、100人あまりの中国人が抗議し激しく詰め寄る騒ぎがあった。 0208NAME IS NULL2016/12/26(月) 22:19:59.12ID:???>>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 ; 0209NAME IS NULL2016/12/26(月) 22:22:29.01ID:??? 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 ; 0210NAME IS NULL2017/01/02(月) 16:54:20.40ID:??? 教えて下さい。 カラムが 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 です。 0211NAME IS NULL2017/01/02(月) 17:15:10.65ID:??? >days:差分 2
このカラムの意味が分からない 0212NAME IS NULL2017/01/02(月) 20:22:33.09ID:??? 質問させていただきます。
でも>>211が言うようにdaysは演算で処理すべきだべ 0216NAME IS NULL2017/01/02(月) 21:45:28.71ID:???>>212 mysql と仮定して select dtime from t1 where date(dtime) not in (select date from t2); 0217NAME IS NULL2017/01/03(火) 09:50:33.91ID:???>>213,215 できました。ありがとうございました。
>>211 テーブル設計自体はすでにあったものでして… 0218NAME IS NULL2017/01/03(火) 10:39:07.59ID:???>>214 >>216 できました、ありがとうございました。 datetimeをdateに置き換える簡単な方法があったんですね。 0219NAME IS NULL2017/01/14(土) 10:16:41.35ID:??? phpmyadminでデータベースを作成しようと思ったのですがSQLタブのテキストエリアにコピペができません(右クリックしてもコピー、切り取り、貼り付けがでない) コピペをするのに設定などがあるのでしょうか? 0220NAME IS NULL2017/01/14(土) 10:36:37.05ID:NxfK13Qk MySQLの質問させてください データ更新するとき、phpmyadminのインポートで更新するには、sqlのファイルはどのように書けばいいのでしょうか?
新規作成するときは、INSERT文でこんな風にしました 上書きするときの書き方があれば教えてください INSERT INTO `sample_table` (`abc_id`, `efg_id`, `meta_key`, `meta_value`) VALUES (202, 4002, '_thumbnail_id', '4001'), (212, 4012, '_thumbnail_id', '4011'), (222, 4022, '_thumbnail_id', '4021'); 0221NAME IS NULL2017/01/14(土) 12:04:14.38ID:??? 外部結合クエリで ・A LEFT JOIN B ・B RIGHT JOIN A