SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>613
行列、列行なのかわからない聞き方だが、それが列、カラムだと想定すると、トリガーでも作らないとできないだろうな。
同じレコードのカラムから導出したデータを別カラムで持つのも馬鹿っぽい。
しかも数値型を連結するなら、いったん文字型に変換しないといけない。
なんでそんなことをしたいのか。ID3なんてビューを作ってみせればいいんじゃないの? >>614
>>615
すいません、DBわかってなくて失礼しました。
ID1 ID2 ID3 name
100 101 100101 hoge
101 201 101201 fuga
ID1とID2を繋げて、ID3を生成したかったです。
プライマリキーとは別に、識別用としてのユニークなIDが必要なので。
単純に繋げるには、文字列でやらないとダメみたいですね。
ありがとうございます。 ID2が2桁の時どうするの?
ID1と2と3は同じレコードのカラムなの?
手入力ってINSERT文書くの? lpad()で0埋めしてcontat で連結して castで数値にする手もあるけど
実行時に必要ならビューでいいよね >>617
ID1, 2は3桁のものしか用意しないので基本的には問題ないかと。
すべて同じレコードのカラムですね。
先に手入力と書きましたが、実際はほぼクライアントツールの
インポート経由で登録になります。
>>618
ビューってのがあるんですね、調べてみます。
ありがとうございます。 >>619
3桁で計算もしないなら、データ型が数値型なのは変だよ。 >>620
お前の根拠もない意見なんて聞いてねえから >>621
初心者は数字は数値と思い込むのはよくあることだろ。 何でこんなに質問外の話を夢中になって始めるか、理解出来ない >>624
初心者は質問内は質問外と思い込むのはよくあることだろ。 >>619
どちらも数値で桁数が3桁固定なら、ID1 * 1000 + ID2でどうだろうか number(string(id1) || string(id2)) insert時かselect時に導出すればいいようなものをなんで別カラムで持ちたがるのか、理由をまったく言わないからなw 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%')
以下のように書いたのですが検索できませんでした
またもっとシンプルに書く方法があれば教えてください そもそも
>(column1 like '%hoge%' AND column1 like '%drz%')
同じc1カラムにhogeとdrzの両方があるもの、というのはあってるの? 失礼しました、よく考えたら違いました
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%'))
すごく長いですがこんな感じなのでしょうか?
もっと綺麗にかけないのでしょうか? RDBMS何?
正規表現使えるやつならかなり短くできるけど、、
標準でもなんとかなるかな、長くてまだよく見てないw まだやりたいこと読み切ってるわけじゃないが
ANDの部分をサブクエリにすれば同じ検索を2回書かなくて済みそうだね >>636
それだとhogeしかない場合でもマッチしてしまうんじゃないか? where column1 || column2 || column3 like '%hoge%'
and column1 || column2 || column3 like '%drz%'
でいいと思う(|| はDBごとに適切な文字列連結演算子に読み替えて)
部分一致じゃあどのみち普通のインデックスは使えないし
速度を出したいならちゃんとした全文検索機能のあるDBを使うべき >>634
WHERE column1 + ',' + column2 + ',' + column3 like '%hoge%' and column1 + ',' + column2 + ',' + column3 like '%drz%' >>640
それ column1 = 'ho', columu2 = 'ged', column3 = 'rz' でヒットしちゃうぞ >>642
連結する時に適当なセパレータ文字を挟めばいいやん。 >>636
そういうもの。
対象のカラムやキーワードの数が変わっても困らないような動的クエリの仕組みに頭を使った方がいい。 もしcolumn1/2/3が相互に交換可能なのだとしたら第一正規形ではないことになるが、
>>636だけからはデータモデルがおかしいと断言はできんだろう。 no existか積集合演算子でできるが、このSELECT文がメインだったらデータモデルがおかしい。 データモデル厨は要らんよ
まあケチ付けたいだけなんだろうけど フィールドを>>640みたいに|| で文字列連結するのって、内部で何が起こってるんですか?
ORより速いんですかね?
ORより積極的に使った方がいいですか? 内部で何が起こってるのかを気にする必要がないのがSQLの良いところやで
実行速度が気になるんだったら自分で目的に最適化したDBを作ったほうが速い まあそれは建前であって実際のところは内部動作もある程度知っていないと
使い物にならないことも多いからねえ
自動チューニング的な機能があったとしても
その機能自体がどのように動くのか知らないとやっぱり上手く使えなかったり >>641
返信遅くなってしまいすいません
文字列を連結させてればいいんですね、やってみます >>649
内部ではいったんそういう表が作られて、それを検索している。 >>649
それぞれのカラムにインデックスがある場合。
まず、文字列を連結するとインデックスは使われません。
ORを使うと、全件検索(テーブルスキャン)よりもインデックスを使う方が速いと判断されれば
インデックスが使われます。
なので、ORが使えるならORを使うのがよいです。
さらに言うと、完全一致検索(hoge = 'aaa')と前方一致検索(hoge like 'aaa%')はインデックスが
使われますが、それ以外の場合(hoge = 'aaa%', hoge = '%aaa%')では、普通はインデックスは
使われません。(データベースの種類によっては、特殊なインデックスを作れるものもある) >>657
ではどのように処理しているのかご教示を。 >>658
ループしつつ文字列比較でフィルタリングでしょ
一時テーブルなんか作るメリットゼロ >>661
一部を除いてみんな正しい
まとめると、
・レコード数が少ないなら文字列結合してLIKE検索しろ >>641
・ORと文字列結合を比較するなら、ORの方がインデックスが使われるという面で優れている
・ただしLIKE検索の場合は、前方一致のみインデックスが使われる(普通は)
・普通じゃない方法は、データベース毎に異なる(フルテキスト検索用インデックスを作ったりとか) 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で、ひ孫からは不要らしいです。 孫まででいいならissueChildrenをもう一回JOINするだけ
末代まで辿りたいなら再帰問合せ もしかしてループってるかもしれないからチェックいるね >>664
具体的にどう書けばいいですか?
>>665
それはデータ的にはないようです >>666
実際にないなら良いんですけど
テーブル定義はそれを排除している訳ではないので >>668
さあね、RTRIM、LTRIMがあるからとりあえずいいだろうということなんだろ。 LTRIMって、やっぱエルトリム?
それともリトリム?
俺はどっちでもいいと思うんで、
どっちでもいいと思うんだけど。 リトリムだとRTRIMもリトリムになるし...
巻き舌とかで区別する?w 僕はシリコンバレーだけど、
エルティーアールアイエムって呼んでる うちのかあちゃん、
TRFを無理矢理トリフって読んだぞ。 伝票ID、顧客名、売上金額、売上月というテーブルがあるとします
顧客毎の各売上月の合計を問い合わせしたい場合どうすればいいのでしょうか?
売上月、顧客名、合計金額という風に出したいですが、一つ一つ顧客名毎に問い合わせするしかないのでしょうか? >>683
それぞれの顧客に電話して聞くしかないな。 select `顧客名`,`売上月`,sum(`売上金額`) as `合計金額` from TABLE
group by `顧客名`,`売上月`; SQLの神さま、み教えを!
二つのテーブルを比較し、複数項目(7項目)の値が全て合致した行の
1項目をアップデートをしたいのですが、長ったらしいSQLになってしまいます。
シンプルな記述で実現する方法は、ありますでしょうか?!
お願いします! 長ったらしくならないので下手なことをせずそのままがいいように思う Oracleだと
where (a1, a2, ...) = (b1, b2, ...)
みたいに書けちゃうけどまあ普通は
where a1 = b1 and a2 = b2 and ...
しかないな >>694
文字列にして連結して比較する作戦はどうかな? >>694
それNULL=NULLをどうするのかで問題がでる
NULLの項目があってそれをまじめに考えたら
結構長ったらしくはなる 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だけで作ろうとしているのですが、無理でしょうか。 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だけうって表示できればと思っています。 >>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
で行けるんじゃね >>695
セパレータつけないと
'abc', 'de' と 'ab', 'cde' が一致しちゃう
絶対に値に含まれないセパレータがあるならいいけど >>697
「イメージ」じゃなくて、そのデータの完全な結果を示せ >>697
まだ設計変えられるんだったら、正規化した方がいいかもよ 結合した結果を表示してるのかもしれないし、そこはなんとも。
>>703
意味不明なの? 無理だと思ったらなんだって無理なんだよ
聞くならせめて「可能でしょうか」と聞け > 意味不明なの?
>>703 には
ってことでしょ
>>699 の
> それ、元価格が複数あったりしたらどうするんだよ
を見たら普通正規化しろって思うと思うがまあここ初心者スレだから >> それ、元価格が複数あったりしたらどうするんだよ
>を見たら普通正規化しろって思うと思うがまあここ初心者スレだから
それはクエリの話であって正規化とは全然関係ないな。 >>699
ありがとうございました。これでできました!
元価格はひとつです。
いろいろご意見ありがとうございます。
最近勉強始めたもので、正規化などこれから勉強中です。 >>707
> それはクエリの話であって正規化とは全然関係ないな。
全く理解してないのがよくわかる秀逸なレスだな w 価格1 価格2 というカラム名だけ見て脊髄反射で
「第一正規形じゃない」と思い込んじゃったんだろう。 >>710
商品テーブル: {商品No}, 価格1, 価格2 ({ }はPK)
調整価格テーブル: {商品No, 調整コード}, 調整価格
ってことじゃないの?ってことだろ SQLの神さま!
非正規化テーブルから
正規化テーブル1、正規化テーブル2へ
同時にインサートする時に、
正規化テーブル1、2それぞれに同じ連番を振りたいのですが、
シンプルな方法はありますでしょうか?
ちなみに連番フィールドは、主キーです。 ■ このスレッドは過去ログ倉庫に格納されています