トップページDB@2ch掲示板
1002コメント294KB
SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2016/05/12(木) 05:29:07.61ID:HmbS4CfD
SQL初心者用の質問スレッドです。
0615NAME IS NULL
垢版 |
2017/05/16(火) 18:36:37.93ID:+kwvKlmq
>>613
行列、列行なのかわからない聞き方だが、それが列、カラムだと想定すると、トリガーでも作らないとできないだろうな。

同じレコードのカラムから導出したデータを別カラムで持つのも馬鹿っぽい。

しかも数値型を連結するなら、いったん文字型に変換しないといけない。

なんでそんなことをしたいのか。ID3なんてビューを作ってみせればいいんじゃないの?
0616NAME IS NULL
垢版 |
2017/05/16(火) 18:56:41.08ID:zTCyNjTh
>>614
>>615
すいません、DBわかってなくて失礼しました。

ID1 ID2 ID3 name
100 101 100101 hoge
101 201 101201 fuga

ID1とID2を繋げて、ID3を生成したかったです。
プライマリキーとは別に、識別用としてのユニークなIDが必要なので。
単純に繋げるには、文字列でやらないとダメみたいですね。
ありがとうございます。
0617NAME IS NULL
垢版 |
2017/05/16(火) 18:57:13.28ID:???
ID2が2桁の時どうするの?
ID1と2と3は同じレコードのカラムなの?
手入力ってINSERT文書くの?
0618NAME IS NULL
垢版 |
2017/05/16(火) 18:59:58.53ID:???
lpad()で0埋めしてcontat で連結して castで数値にする手もあるけど
実行時に必要ならビューでいいよね
0619NAME IS NULL
垢版 |
2017/05/16(火) 19:14:46.64ID:zTCyNjTh
>>617
ID1, 2は3桁のものしか用意しないので基本的には問題ないかと。
すべて同じレコードのカラムですね。
先に手入力と書きましたが、実際はほぼクライアントツールの
インポート経由で登録になります。

>>618
ビューってのがあるんですね、調べてみます。

ありがとうございます。
0620NAME IS NULL
垢版 |
2017/05/16(火) 23:30:43.64ID:K44u4O+q
>>619
3桁で計算もしないなら、データ型が数値型なのは変だよ。
0621NAME IS NULL
垢版 |
2017/05/17(水) 06:52:26.40ID:???
>>620
お前の根拠もない意見なんて聞いてねえから
0622NAME IS NULL
垢版 |
2017/05/17(水) 11:53:42.80ID:GIMFSdsg
>>621
初心者は数字は数値と思い込むのはよくあることだろ。
0623NAME IS NULL
垢版 |
2017/05/17(水) 12:21:15.28ID:???
なんの禅問答やそれ
0624NAME IS NULL
垢版 |
2017/05/17(水) 12:26:07.45ID:???
何でこんなに質問外の話を夢中になって始めるか、理解出来ない
0625NAME IS NULL
垢版 |
2017/05/17(水) 12:33:06.84ID:???
>>624
初心者は質問内は質問外と思い込むのはよくあることだろ。
0626NAME IS NULL
垢版 |
2017/05/17(水) 21:02:17.08ID:???
>>619
どちらも数値で桁数が3桁固定なら、ID1 * 1000 + ID2でどうだろうか
0627NAME IS NULL
垢版 |
2017/05/18(木) 10:55:50.15ID:???
number(string(id1) || string(id2))
0628NAME IS NULL
垢版 |
2017/05/20(土) 07:59:43.67ID:Y78/Agfu
insert時かselect時に導出すればいいようなものをなんで別カラムで持ちたがるのか、理由をまったく言わないからなw
0629NAME IS NULL
垢版 |
2017/05/21(日) 00:12:32.34ID:???
新ギャグ考えたので聞いてください。

ななこSQL
0630NAME IS NULL
垢版 |
2017/05/21(日) 12:07:06.78ID:oc3Ojy/D
>>629
おっさん乙
0631NAME IS NULL
垢版 |
2017/05/21(日) 19:24:12.15ID:9z61e5/E
何がギャグなのか、誰か解説頼む
0632NAME IS NULL
垢版 |
2017/05/21(日) 19:31:42.54ID:oc3Ojy/D
>>631
ななこSOS
0633NAME IS NULL
垢版 |
2017/05/21(日) 23:20:12.41ID:???
マジレスしてくれた人、ありがとう

うううむ
0634NAME IS NULL
垢版 |
2017/05/22(月) 22:48:44.88ID:???
SELECT column1,column2,column3
FROM table123
WHERE column1 like '%hoge%' OR column2 like '%hoge%' OR column3 like '%hoge%'

こういうクエリがあるんですが
column1〜3で2つのキーワードのAND検索をしたい場合どう書けばいいのでしょうか?

SELECT column1,column2,column3
FROM table123
WHERE (column1 like '%hoge%' AND column1 like '%drz%')
OR (column2 like '%hoge%' AND column2 like '%drz%')
OR (column3 like '%hoge%' AND column3 like '%drz%')
以下のように書いたのですが検索できませんでした
またもっとシンプルに書く方法があれば教えてください
0635NAME IS NULL
垢版 |
2017/05/23(火) 11:32:21.57ID:???
そもそも
>(column1 like '%hoge%' AND column1 like '%drz%')
同じc1カラムにhogeとdrzの両方があるもの、というのはあってるの?
0636NAME IS NULL
垢版 |
2017/05/23(火) 12:27:04.39ID:???
失礼しました、よく考えたら違いました
column1〜3でhoge、drzとあればいいんです
column1にhogeとあってcolumn2もしくは3にdrzとあるものを抽出したいのです

WHERE ((column1 like '%hoge%' OR column1 like '%drz%') AND (column2 like '%hoge%' OR column2 like '%drz%'))
OR ((column1 like '%hoge%' OR column1 like '%drz%') AND (column3 like '%hoge%' OR column3 like '%drz%'))
((column1 like '%hoge%' OR column1 like '%drz%') OR (column2 like '%hoge%' OR column2 like '%drz%'))
すごく長いですがこんな感じなのでしょうか?
もっと綺麗にかけないのでしょうか?
0637NAME IS NULL
垢版 |
2017/05/23(火) 12:29:44.29ID:???
RDBMS何?
正規表現使えるやつならかなり短くできるけど、、
標準でもなんとかなるかな、長くてまだよく見てないw
0638NAME IS NULL
垢版 |
2017/05/23(火) 12:34:54.13ID:???
まだやりたいこと読み切ってるわけじゃないが
ANDの部分をサブクエリにすれば同じ検索を2回書かなくて済みそうだね
0639NAME IS NULL
垢版 |
2017/05/23(火) 13:50:09.05ID:???
>>636
それだとhogeしかない場合でもマッチしてしまうんじゃないか?
0640NAME IS NULL
垢版 |
2017/05/23(火) 18:50:28.38ID:???
 where column1 || column2 || column3 like '%hoge%'
 and column1 || column2 || column3 like '%drz%'
でいいと思う(|| はDBごとに適切な文字列連結演算子に読み替えて)

部分一致じゃあどのみち普通のインデックスは使えないし
速度を出したいならちゃんとした全文検索機能のあるDBを使うべき
0641NAME IS NULL
垢版 |
2017/05/23(火) 20:05:04.58ID:???
>>634
WHERE column1 + ',' + column2 + ',' + column3 like '%hoge%' and column1 + ',' + column2 + ',' + column3 like '%drz%'
0642NAME IS NULL
垢版 |
2017/05/23(火) 20:07:29.14ID:???
>>640
それ column1 = 'ho', columu2 = 'ged', column3 = 'rz' でヒットしちゃうぞ
0643NAME IS NULL
垢版 |
2017/05/23(火) 20:11:47.84ID:???
>>642
連結する時に適当なセパレータ文字を挟めばいいやん。
0644NAME IS NULL
垢版 |
2017/05/23(火) 22:05:46.88ID:???
>>636
そういうもの。
対象のカラムやキーワードの数が変わっても困らないような動的クエリの仕組みに頭を使った方がいい。
0645NAME IS NULL
垢版 |
2017/05/23(火) 22:19:24.15ID:zLCGMc7G
>>644
そもそもデータモデルがおかしいだろw
0646NAME IS NULL
垢版 |
2017/05/23(火) 23:28:42.12ID:???
もしcolumn1/2/3が相互に交換可能なのだとしたら第一正規形ではないことになるが、
>>636だけからはデータモデルがおかしいと断言はできんだろう。
0647NAME IS NULL
垢版 |
2017/05/24(水) 05:27:57.36ID:LjZe7sN5
no existか積集合演算子でできるが、このSELECT文がメインだったらデータモデルがおかしい。
0648NAME IS NULL
垢版 |
2017/05/24(水) 06:45:47.07ID:???
データモデル厨は要らんよ
まあケチ付けたいだけなんだろうけど
0649NAME IS NULL
垢版 |
2017/05/24(水) 19:01:22.36ID:???
フィールドを>>640みたいに|| で文字列連結するのって、内部で何が起こってるんですか?
ORより速いんですかね?
ORより積極的に使った方がいいですか?
0651NAME IS NULL
垢版 |
2017/05/24(水) 22:34:09.99ID:???
内部で何が起こってるのかを気にする必要がないのがSQLの良いところやで
実行速度が気になるんだったら自分で目的に最適化したDBを作ったほうが速い
0652NAME IS NULL
垢版 |
2017/05/24(水) 23:07:44.65ID:???
まあそれは建前であって実際のところは内部動作もある程度知っていないと
使い物にならないことも多いからねえ
自動チューニング的な機能があったとしても
その機能自体がどのように動くのか知らないとやっぱり上手く使えなかったり
0653NAME IS NULL
垢版 |
2017/05/24(水) 23:09:38.05ID:???
>>641
返信遅くなってしまいすいません
文字列を連結させてればいいんですね、やってみます
0654NAME IS NULL
垢版 |
2017/05/25(木) 15:59:00.46ID:v+Ze25qa
>>649
内部ではいったんそういう表が作られて、それを検索している。
0655NAME IS NULL
垢版 |
2017/05/25(木) 16:53:17.38ID:???
>>649
それぞれのカラムにインデックスがある場合。

まず、文字列を連結するとインデックスは使われません。
ORを使うと、全件検索(テーブルスキャン)よりもインデックスを使う方が速いと判断されれば
インデックスが使われます。

なので、ORが使えるならORを使うのがよいです。

さらに言うと、完全一致検索(hoge = 'aaa')と前方一致検索(hoge like 'aaa%')はインデックスが
使われますが、それ以外の場合(hoge = 'aaa%', hoge = '%aaa%')では、普通はインデックスは
使われません。(データベースの種類によっては、特殊なインデックスを作れるものもある)
0656NAME IS NULL
垢版 |
2017/05/25(木) 17:01:24.94ID:v+Ze25qa
変なのがわいた
0658NAME IS NULL
垢版 |
2017/05/25(木) 17:06:50.40ID:v+Ze25qa
>>657
ではどのように処理しているのかご教示を。
0659NAME IS NULL
垢版 |
2017/05/25(木) 17:24:42.89ID:???
プランナーが全てそうやってるわけじゃねーだろ
0660NAME IS NULL
垢版 |
2017/05/25(木) 17:28:46.76ID:???
>>658
ループしつつ文字列比較でフィルタリングでしょ
一時テーブルなんか作るメリットゼロ
0661NAME IS NULL
垢版 |
2017/05/25(木) 17:30:15.75ID:???
誰が言ってる事が正しいのですか?
0662NAME IS NULL
垢版 |
2017/05/25(木) 17:37:48.37ID:???
>>661
一部を除いてみんな正しい

まとめると、
・レコード数が少ないなら文字列結合してLIKE検索しろ >>641
・ORと文字列結合を比較するなら、ORの方がインデックスが使われるという面で優れている
・ただしLIKE検索の場合は、前方一致のみインデックスが使われる(普通は)
・普通じゃない方法は、データベース毎に異なる(フルテキスト検索用インデックスを作ったりとか)
0663NAME IS NULL
垢版 |
2017/05/25(木) 19:53:09.48ID:???
DBはMariaDBです
issueテーブルとissueConnectionテーブルがあります
こんな風にして、階層化された複数のイシューが連なる設計です(・・・あまり設計よくないかもです)

■issue
ID
(以下略)

■issueChildren
ID
issueID
childIssueID


あるイシューの子イシューを取得したい場合、たとえば100番の子イシューであれば

SELECT * FROM issue INNER JOIN issueChildren ON issue.ID = issueChildren.ID
WHERE issueChildren.issueID = 100;

でいいと思うのですが、孫まで含めてクエリーで取得したい場合はどうすればいいのでしょうか?
要件では子と孫まででOKで、ひ孫からは不要らしいです。
0664NAME IS NULL
垢版 |
2017/05/25(木) 20:32:38.12ID:???
孫まででいいならissueChildrenをもう一回JOINするだけ
末代まで辿りたいなら再帰問合せ
0665NAME IS NULL
垢版 |
2017/05/25(木) 20:39:25.01ID:???
もしかしてループってるかもしれないからチェックいるね
0666NAME IS NULL
垢版 |
2017/05/25(木) 23:03:02.92ID:???
>>664
具体的にどう書けばいいですか?

>>665
それはデータ的にはないようです
0667NAME IS NULL
垢版 |
2017/05/25(木) 23:49:12.89ID:???
>>666
実際にないなら良いんですけど
テーブル定義はそれを排除している訳ではないので
0668NAME IS NULL
垢版 |
2017/05/27(土) 18:40:58.87ID:???
SQL ServerにはなんでTRIMが無いの?
0669NAME IS NULL
垢版 |
2017/05/27(土) 19:48:28.08ID:EQg2arXb
>>668
さあね、RTRIM、LTRIMがあるからとりあえずいいだろうということなんだろ。
0670NAME IS NULL
垢版 |
2017/05/30(火) 23:02:19.60ID:???
LTRIMって、やっぱエルトリム?
それともリトリム?
俺はどっちでもいいと思うんで、
どっちでもいいと思うんだけど。
0671NAME IS NULL
垢版 |
2017/05/30(火) 23:20:48.04ID:???
テメェの好きなように呼べば良いだろ阿呆
0672NAME IS NULL
垢版 |
2017/05/30(火) 23:21:49.27ID:???
リトリムだとRTRIMもリトリムになるし...
巻き舌とかで区別する?w
0673NAME IS NULL
垢版 |
2017/05/30(火) 23:28:29.98ID:???
右トリム、左トリムで
0674NAME IS NULL
垢版 |
2017/05/31(水) 19:18:26.54ID:HpzcWkU1
レフトリ、ライトリってうちだけかよ
0675NAME IS NULL
垢版 |
2017/05/31(水) 20:17:10.89ID:+YoAe/ot
俺はアールトリム、エルトリムと呼んでいる。
0676NAME IS NULL
垢版 |
2017/05/31(水) 21:48:51.15ID:???
僕はシリコンバレーだけど、
エルティーアールアイエムって呼んでる
0677NAME IS NULL
垢版 |
2017/05/31(水) 22:57:35.60ID:???
うちのかあちゃん、
TRFを無理矢理トリフって読んだぞ。
0678NAME IS NULL
垢版 |
2017/05/31(水) 23:18:05.78ID:???
SQLserver入れた
まずなにやろう
0679NAME IS NULL
垢版 |
2017/06/01(木) 07:34:14.86ID:h3o9bmsv
>>678
アンインストール
0680NAME IS NULL
垢版 |
2017/06/01(木) 08:17:33.40ID:???
>>679
全く同じことを思った
結婚しようか
0681NAME IS NULL
垢版 |
2017/06/01(木) 14:22:43.80ID:???
最強に性格悪い夫婦
0682NAME IS NULL
垢版 |
2017/06/01(木) 23:03:30.83ID:???
♪いぃぃいぃぃいぃいぃぃぃいぃぃぃぃー
0683NAME IS NULL
垢版 |
2017/06/06(火) 22:32:19.81ID:???
伝票ID、顧客名、売上金額、売上月というテーブルがあるとします
顧客毎の各売上月の合計を問い合わせしたい場合どうすればいいのでしょうか?
売上月、顧客名、合計金額という風に出したいですが、一つ一つ顧客名毎に問い合わせするしかないのでしょうか?
0685NAME IS NULL
垢版 |
2017/06/06(火) 23:17:47.18ID:2nFS6UGQ
>>683
それぞれの顧客に電話して聞くしかないな。
0686NAME IS NULL
垢版 |
2017/06/06(火) 23:49:15.89ID:???
select `顧客名`,`売上月`,sum(`売上金額`) as `合計金額` from TABLE
group by `顧客名`,`売上月`;
0687NAME IS NULL
垢版 |
2017/06/07(水) 06:22:26.56ID:WkwCrNcL
アポストロフィ?
0689NAME IS NULL
垢版 |
2017/06/09(金) 03:38:40.83ID:LAO2WyDa
バッククオートでないの?
0690NAME IS NULL
垢版 |
2017/06/12(月) 03:22:13.66ID:???
アゲイン

teradataの識者いる?
0691NAME IS NULL
垢版 |
2017/06/12(月) 12:54:09.35ID:???
SQLの神さま、み教えを!

二つのテーブルを比較し、複数項目(7項目)の値が全て合致した行の
1項目をアップデートをしたいのですが、長ったらしいSQLになってしまいます。

シンプルな記述で実現する方法は、ありますでしょうか?!

お願いします!
0692NAME IS NULL
垢版 |
2017/06/12(月) 12:54:49.15ID:RxG+k+1Y
m(_ _)m
お願いします!
0693NAME IS NULL
垢版 |
2017/06/12(月) 16:30:14.35ID:???
長ったらしくならないので下手なことをせずそのままがいいように思う
0694NAME IS NULL
垢版 |
2017/06/12(月) 19:09:30.01ID:???
Oracleだと
 where (a1, a2, ...) = (b1, b2, ...)
みたいに書けちゃうけどまあ普通は
 where a1 = b1 and a2 = b2 and ...
しかないな
0695NAME IS NULL
垢版 |
2017/06/12(月) 20:54:47.97ID:???
>>694
文字列にして連結して比較する作戦はどうかな?
0696NAME IS NULL
垢版 |
2017/06/12(月) 21:39:05.03ID:???
>>694
それNULL=NULLをどうするのかで問題がでる
NULLの項目があってそれをまじめに考えたら
結構長ったらしくはなる
0697NAME IS NULL
垢版 |
2017/06/12(月) 21:49:53.25ID:???
SQL Serverです。

商品No 価格1 価格2 価格調整コード 調整価格
10000 1,000 1,100 001     200
10000 1,000 1,100 002    100
10000 1,000 1,100 003    100
12000 600 700 001    50
13000 800 850 001    100
13000 800 850 003    50

価格調整コードが'001'か'002'の場合は、
調整価格を価格1に加算し、
価格調整コードが'003'の場合は、
調整価格を価格2に加算する。
その結果を、商品Noから一意で取り出せるビューにしたい。

※イメージ
商品No 価格1(調整後) 価格2 (調整後)
10000 1,300 1,200
12000 650 700
13000 900 900

これをSQLだけで作ろうとしているのですが、無理でしょうか。
0698NAME IS NULL
垢版 |
2017/06/12(月) 21:51:57.07ID:???
case when 価格調整コード = '001'などを入れて、
下記のようにしてみました。

商品No 価格1 価格2 価格調整コード 調整価格 001価格 002価格 003価格
10000 1,000 1,100 001 200 200 NULL NULL
10000 1,000 1,100 002 100 NULL 100 NULL
10000 1,000 1,100 003 100 NULL NULL 100
12000 600 700 001 50 50 NULL NULL
13000 800 850 001 100 100 NULL NULL
13000 800 850 003 50 NULL NULL 50

これを、001価格〜003価格のNULLの部分を統合して、
1行で表示できるイメージでもよいです。
※イメージ
商品No 価格1 価格2 価格調整コード 調整価格 001価格 002価格 003価格
10000 1,000 1,100 001 200 200 100 100
12000 600 700 001 50 50 NULL NULL
13000 800 850 001 100 100 NULL 50

プログラムができないため、SQL Management Studioで
SQLだけうって表示できればと思っています。
0699NAME IS NULL
垢版 |
2017/06/12(月) 22:50:34.48ID:???
>>697
>商品Noから一意で
それ、元価格が複数あったりしたらどうするんだよ

とりあえずそのデータでなら
select distinct
商品No,
価格1 + (select ISNULL(SUM(調整価格),0) from テーブル where 商品No=t.商品No and 価格調整コード in ('001','002')) as [価格1(調整後)],
価格2 + (select ISNULL(SUM(調整価格),0) from テーブル where 商品No=t.商品No and 価格調整コード in ('003') ) as [価格2(調整後)]
from テーブル t

で行けるんじゃね
0700NAME IS NULL
垢版 |
2017/06/13(火) 12:58:54.35ID:???
>>695
セパレータつけないと
'abc', 'de' と 'ab', 'cde' が一致しちゃう
絶対に値に含まれないセパレータがあるならいいけど
0701NAME IS NULL
垢版 |
2017/06/13(火) 13:14:09.59ID:???
>>697
「イメージ」じゃなくて、そのデータの完全な結果を示せ
0702NAME IS NULL
垢版 |
2017/06/13(火) 18:50:57.76ID:???
>>697
まだ設計変えられるんだったら、正規化した方がいいかもよ
0703NAME IS NULL
垢版 |
2017/06/13(火) 22:19:04.42ID:???
また意味不明な「正規化」
0704NAME IS NULL
垢版 |
2017/06/13(火) 22:59:33.06ID:???
結合した結果を表示してるのかもしれないし、そこはなんとも。

>>703
意味不明なの?
0705NAME IS NULL
垢版 |
2017/06/13(火) 23:11:18.91ID:yhROQb+J
無理だと思ったらなんだって無理なんだよ
聞くならせめて「可能でしょうか」と聞け
0706NAME IS NULL
垢版 |
2017/06/14(水) 07:04:12.48ID:???
> 意味不明なの?
>>703 には
ってことでしょ
>>699
> それ、元価格が複数あったりしたらどうするんだよ
を見たら普通正規化しろって思うと思うがまあここ初心者スレだから
0707NAME IS NULL
垢版 |
2017/06/14(水) 07:44:23.00ID:???
>> それ、元価格が複数あったりしたらどうするんだよ
>を見たら普通正規化しろって思うと思うがまあここ初心者スレだから

それはクエリの話であって正規化とは全然関係ないな。
0708NAME IS NULL
垢版 |
2017/06/14(水) 08:10:11.20ID:???
>>699
ありがとうございました。これでできました!
元価格はひとつです。
いろいろご意見ありがとうございます。
最近勉強始めたもので、正規化などこれから勉強中です。
0709NAME IS NULL
垢版 |
2017/06/14(水) 08:19:49.45ID:???
>>707
> それはクエリの話であって正規化とは全然関係ないな。
全く理解してないのがよくわかる秀逸なレスだな w
0710NAME IS NULL
垢版 |
2017/06/14(水) 08:44:04.31ID:???
価格1 価格2 というカラム名だけ見て脊髄反射で
「第一正規形じゃない」と思い込んじゃったんだろう。
0711NAME IS NULL
垢版 |
2017/06/14(水) 10:47:57.31ID:???
>>710
商品テーブル: {商品No}, 価格1, 価格2 ({ }はPK)
調整価格テーブル: {商品No, 調整コード}, 調整価格

ってことじゃないの?ってことだろ
0712NAME IS NULL
垢版 |
2017/06/14(水) 12:18:18.14ID:22bTQ0Ls
SQLの神さま!
非正規化テーブルから
正規化テーブル1、正規化テーブル2へ
同時にインサートする時に、
正規化テーブル1、2それぞれに同じ連番を振りたいのですが、
シンプルな方法はありますでしょうか?

ちなみに連番フィールドは、主キーです。
0713NAME IS NULL
垢版 |
2017/06/14(水) 12:47:47.15ID:egtOOHVa
また意味不明な「非正規化」
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況