>>901 >この結果をさらにサブクエリーかCGIで
ん?where句に追加するだけじゃないのか?
SELECT t1.id1,t1.id2
FROM t1 LEFT OUTER JOIN t2 ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
WHERE t1.id1 = 1 and t2.id1 is null;
質問の意味を読み違えてたらスマン。
903 :
901 :2006/09/23(土) 23:25:09 ID:???
>>902 普通にwhere句に追加するだけだったんですね・・・
WHERE t1.id1 = 1 and t2.id2 is null;
で望む結果が得られましたので、データを増やして検証してみます。
ありがとうございました。
904 :
NAME IS NULL :2006/09/24(日) 00:04:18 ID:XMj5nZBr
MySQLにて、複数のレコードをINSERTするときはVALUES以降の値をカッコで 括ってカンマ区切りで複数レコードを並べることによってクエリ一発で出来るのですが、 UPDATEでも複数レコードをクエリ一発で更新することは出来るのでしょうか? いろいろ調べたけど、1度に1つのレコードを更新する例文しか見つかりませんでした。
わかんないけど、更新する値が複数あるってことは where句も複数必要になるからその辺の関係でわ?
あ、値じゃなくてレコードです。ゴメン('A`)
>>904 同じ値に更新するなら複数選択される条件があればいい
違う値なら無理
908 :
NAME IS NULL :2006/09/27(水) 09:25:43 ID:eq022I/L
古い順(ASC)で並んだ結果から最後の5行だけ取り出したいときってどうすればいいでしょうか? いつもは全体の件数を取得->件数-5のオフセットで取得してるんですけど、2回もクエリ送るのが低効率な気がして。。 MySQL4.0なんでサブクエリ使えないんです。
まず何故『新しい順(DESC)で取った最初の5行』にしないのだ
そうすると 9 8 7 6 5 の順番で表示されるからです。 5 6 7 8 9 の順で行きたいんですけど。。
可能ならプログラム側で逆にしたいところだな。
まあ当然ではある
え、4.0ってサブクエリ使えないの?
4.1から。てかなぜ4.0?
(……うちは3.0なので何も言わない……)
(……言ってるじゃまいか……)
イントラのWebでアクセス元のPCがどこの所属かを判定して表示内容を変える処理があります。 現在はポスグレでinet型をつかってますが、今度SQLServerにリプレースすることになりました。 現在のテーブル構成 bumon(int) | net_adr(inet) ------------------------ 1 | 192.168.1.0/24 2 | 192.168.2.0/24 3 | 192.168.3.0/24 4 | 192.168.4.0/24 現在発行しているSQL select bumon from table where net_adr>>=jspで取得したアクセス元のIP 新テーブル構成 bumon(int) | net_adr(varchar) | net_mask(varchar) ------------------------------------------- 1 | 192.168.1.0 | 255.255.255.0 2 | 192.168.2.0 | 255.255.255.0 3 | 192.168.3.0 | 255.255.255.0 4 | 192.168.4.0 | 255.255.255.0 SQLServerではinet型がないのでネットワークアドレスとネットマスクを別カラムで持つことになりました。 ここでどんなSQL文を書けば今までと同じ結果が取得できるでしょうか。 アクセス元のIPアドレスの取得方法は同じくjspです。
918 :
高木 :2006/09/30(土) 12:04:52 ID:???
-- 給与が30万円以上で,部署名が研究開発の人の名前をON句を使って求める SELECT 従業員名, 給与, 部署名 FROM 従業員 JOIN 部署 ON 従業員.部署NO = 部署.部署NO WHERE 従業員.給与 >= 300000 AND 従業員.部署NO = 20; 従業員名 給与 部署名 ---------- ---------- -------------- 藤井 300000 研究開発 桜井 300000 研究開発 上記と同じ結果をサブクエリを使って求めたく思い 以下のSQLを発行したのですが、うまくいきません。 どこが拙いのかご教示ください。 -- サブクエリを使って、給与が30000以上で部署が研究開発の人を求める SELECT 従業員名, a.部署名, 給与 FROM (SELECT 部署名, 部署NO FROM 部署) a, 従業員 WHERE 給与 >= 300000 AND a.部署NO = 20; 従業員名 部署名 給与 ---------- -------------- ---------- 藤原 研究開発 385000 高橋 研究開発 345000 藤井 研究開発 300000 林 研究開発 900000 桜井 研究開発 300000
>>918 最後のWHERE句がおかしいと思われ
WHERE
給与 >= 300000 AND
a.部署NO = 部署NO AND
部署NO = 20;
920 :
高木 :2006/09/30(土) 13:50:14 ID:???
>>919 ありがとうございます。うまくいきました。
ただ、a.部署NO = 部署NO を a.部署NO = 従業員.部署NO としないと
「ORA-00918: 列の定義が未確定です」というエラーが起こりますが。
>>920 レコード数が多い方をサブクエリにして先に絞り込んだ方が良いと思うけど
従業員数程度なら関係ないか
SELECT 従業員.従業員名, a.部署名, 従業員.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
従業員
WHERE a.部署NO = 従業員.従業員NO;
>>918 は間違い、適当に編集してたら混乱した
SELECT a.従業員名, 部署.部署名, a.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
部署
WHERE a.部署NO = 部署.従業員NO;
<table1> id | コード1 | コード2 -------------- 1 | 1 | 3 2 | 2 | 3 3 | 1 | 1 4 | 2 | NULL <table2> コード | 商品 ---------- 1 | みかん 2 | りんご 3 | バナナ から 1 | みかん | バナナ 2 | りんご | バナナ 3 | みかん | みかん 4 | りんご | NULL を取り出すのはどうしたらいいのですか。 table2を2回参照する部分がわかりません。 Mysql5.0 使用しています。
>>923 select table1.id, a.商品, b.商品
from table1, table2 a, table2 b
where table1.コード1 = a.コード and table1.コード2 = b.コード
メモリを節約したいならこうかな select a.id, a.商品, b.商品 from (select table1.id, table2.商品, table1.コード2 from table1, table2 where table1.コード1 = table2.コード) a, table2 b where a.コード2 = b.コード
これでメモリ節約になるDBMSって何?
展開する手間を掛けさせてるだけのような希ガスる。
DBMSの最適化機能でなんとかなるのかもしれんが サブクエリに分けた方が扱う結果セットが小さくなるから メモリは節約されると思うが
Aテーブルに入っている文字列XがBテーブルで値Yを与えられているとき BテーブルでYを持つAテーブルの文字列Xのみを取り出したいときはどう指定すればいいのでしょうか 例えばアルファベットで <文字> フィールド1|略|フィールド52 ------------------------ a|略|Z a〜Zまで文字列を入れてあり <音> フィールド|略|フィールド52 ------------------------ 母音|略|子音 母音か子音かの値を入れてあったとして 母音だけ取り出すときの指定です
>>929 そもそもテーブル設計間違ってるぞ
文字と文字種のフィールドを持つテーブルが一つありゃいいんじゃないの?
a|1
b|2
:
z|2
>>930 元々<文字>テーブル的なテーブル(ラテン行aとギリシャ行αを一緒の列に入れて対応させてるような感じ)がいくつかあったのですけど
そこから条件に合う一行の一部(ラテンの母音)を取り出すのにこういう形にしたのですが
やっぱり元テーブルから作り直す(ラテン文字と音テーブル、ギリシャ文字と音テーブルみたいに)方がいいですか
>>928 >>924 だろーが
>>925 だろーが、NestedLoopJoinに落ちるならどっちも
たいしてメモリ喰わんだろう。
つか逆に、最適化が下手なDBMSだと
>>925 はサブクエリの結果セットを
メモリ上にまるまる保持してしまう可能性があるんでない?
>>931 それってめちゃくちゃ扱いづらいだろ
もともと同じ目的のものを別フィールドに52個も並べてるんだから
直せるなら直した方がいいんじゃないか
>>931 直す場合のテーブルだけど文字ごとに分ける必要がないなら一つでいいと思うよ
|文字グループ|文字|音|
文字グループは{1ならギリシャ文字、2ならラテン文字}
文字は{A-Za-z後知らん}
音は{1なら母音、2なら子音}
こういうテーブルならたとえば「ギリシャ文字の母音を探す」なら
select 文字 from 文字テーブル where 文字グループ = 1 and 音 = 1;
ですぐもってこれる
MySQLを使用しています。 同じ内容の行を削除する最もスマートな方法を教えてください よろしくお願いします。
>>936 そんな質問じゃ答えられんがな
仮にテーブル名t1、カラムはc1, c2, c3で、キーなし
重複行を削除という話だとしよう
キーがある場合はもう少し工夫が必要だが
1.別テーブルを作成
create table t1_tmp (select * from t1 group by c1, c2, c3);
2.作成したテーブルと交換
rename table t1 to ti_backup, t1_tmp to t1;
3.不要ならti_backupを削除
メリットは、結果を確認できることと、元に戻せること。
どうせこんなことやるのはメンテの時1回だけだろ
A=1であり、『B=2 かつ C=3』でない というWHERE文はどのようになるでしょうか? WHERE A=1 AND !(B=2 AND C=3) であってますでしょうか?
940 :
NAME IS NULL :2006/10/03(火) 11:08:41 ID:Nw6npmkF
http://www.res-system.com/item/415 ↑コレを、(副問い合わせではなく)値を明示して実現するにはどうすればいいでしょうか?
具体的には
key1|key2
----+----
A | 1
A | 2
B | 3
C | 1
というテーブルで、「A-3とB-2とC-1だけ検索したい」のです。
key1 in ('A', 'B', 'C') and key2 in (1,2,3)
だと、全部検索対象になってしまいますし……。お知恵をお貸しください。
>>939 実際にやってみた?
WHERE A=1 AND NOT (B=2 AND C=3)
でどうか
942 :
940 :2006/10/03(火) 11:12:23 ID:???
↑若干間違いでした、すいません 誤:A-3とB-2とC-1だけ検索したい 正:A-2とB-3とC-1だけ検索したい まぁ、引っかからないのは読み飛ばしたいので、別に間違いではないのかもしれませんが……。
>>942 えっと、、、よくわからないが
WHERE (key1, key2) IN (('A',2),('B',3),('C',1))
とかでいいのかな?
>>940 WHERE (key1 = A AND key2 = 2) OR (key1 = B AND key2 = 3) OR (key1 = C AND key2 = 1)
リンク先の方法がダメな処理系もあるな。例えばMSSQLにはINのサブクエリは1列だけの制限がある。
945 :
940 :2006/10/03(火) 11:34:42 ID:???
早速のお返事ありがとうございます。
>>943 通らないっす……(T_T)
>>944 それっきゃないっすか……(T_T) ちょっと条件の数が多い(100前後)なので、どうしようかなぁ……。
ちなみにPostgreSQLではOKなようです>INのサブクエリに複数列
ってそう書いてあったか、スマン
1から順に足す関数ってありますか。 5なら15、10なら55って求められるようなの。
汎用的なのは無いんじゃないか。作るのは簡単
select (n+1)*n/2 from dual; こんなん?
952 :
950 :2006/10/05(木) 00:55:24 ID:???
>>951 いあ、昔読んだ話でピタゴラスだか何だかが子供の頃に
思いついたアルゴリズムって事で覚えてただけなんよ…。
自分で思いついたんならえらいんだけどね('A`;)
ガウスだろ
954 :
950 :2006/10/05(木) 02:02:58 ID:???
>>953 おおう。確かにwikipediaでガウス調べたら書いてたよー。
誰だったか思い出せなくて気持ちわるかってん。ありんこ('A`)ノ
ちゅうか高校数学1じゃないのか?
PostgreSQLなのですが、 ・あるテーブルtable_aが存在していないとき、table_aの作成と初期データの INSERTを行なう ・table_aがすでに存在するときは、table_aの作成と初期データのINSERTを 行なわない(初期データのINSERTをスキップする) といったことを実現するにはどのように記述すればいいのでしょうか。
>>956 なんでそんなことを、、、というのはともかく
PL/pgSQLを使えばできるかな?
SQLの範囲外なのでPosqgreSQLのスレで聞いてね
>955 小学校のときの「たのしいさんすう」って算数のノートに載ってたよ。
>>956 pg_tables だったか、そういう名前のシステムテーブルをselectしてtable_aの存在確認を行うといい。
960 :
NAME IS NULL :2006/10/06(金) 21:13:06 ID:bDRzLVyV
すまんおしえてくれ。 テキストボックスが4つくらいあってその中に文字入れて DBから抽出したいんだが。 WHERE〜ANDで結ぶとテキストボックスに全部入力値がないと 抽出できないじゃん。 空欄のテキストボックスはスルーして入力された単語のみで 抽出するにはどうすればいいの。。。
世にある検索の複数指定の多くがラジオボタンとかプルダウンってところから 察しろって気がするが。
962 :
674 :2006/10/06(金) 21:55:20 ID:???
VBAでそういうの作ったけど、SQLと全然関係ないじゃん。 まぁSQLステートメントの部分がって無理やりなら言えなくも無いけど。
963 :
NAME IS NULL :2006/10/06(金) 22:05:43 ID:bDRzLVyV
>>961 なるほど、自分で入力した文字列だと
確実じゃないしね。確かに言われてみるとプルダウンとかが多いですね。
いくら調べてもわからなくて。
やはりDBから、元から値を取得して選ばせたほうがいいのかな。
それでも複数テキストボックスから抽出ってできるんでしょうか?
SQLにテキストボックスなんてないぞ いったいなんの話をしておるのだ
環境がわからんから答えにくいんだが、WEBアプリとかだと テキストボックスに検索条件をユーザーに入力させるのは セキュリティ上かなり、アレなんだが・・・。 出来る出来ないの話しなら、そりゃ動的にSQL生成するか、 非常に無駄っぽいサブクエリがテキストボックスの分だけ 走る様に組んどけば可能だろう。
IF テキストボックス1.TEXT <> "" THEN SQL = SQL & " AND 項目1 = " & テキストボックス1.TEXT ENDIF IF テキストボックス2.TEXT <> "" THEN SQL = SQL & " AND 項目2 = " & テキストボックス2.TEXT ENDIF VBなんて10年ぶりだ。
てかMySQLじゃ動かねえなこれ 理屈は(unknown AND age < 20) is not falseはたしかになるほど
>>964 すみません、Webアプリかにあるテキストボックスです。
>>965 セキュリティー上では良くなのですか?
勉強になります。
>>966 それをクリックイベントのところに記述するんですね!
項目っていうのは列名ですよね。
やってみます。
>>967 それはわたくし当てですか?
見てみます。
質問です。 状況によって特定のカラムだけ欲しい場合と、ほぼ全てのカラム(の情報)が欲しい 場合があると思います。このとき、selectに指定するカラムの数によって実行速度や DB負荷などはどの程度違うものなのでしょうか? 1.) select foo from hoge; 2.) select foo, bar, baz, quux from hoge; (あるいは select * from hoge;) もちろんテーブル構造やDB規模によって異なってくるとは思いますが、指定した カラム数によってDBの動きがどうなるのかが知りたいのです。 数が少ないほどメモリの消費量が少ないとか、転送量が減るとか、あるいは テーブルのデータはメモリ上に載るのでカラム数が増えてもあまり気にするほどの 差はでないとかそういう感じで。。。
>>971 そんなことよりインデクスが効いてるかどうかの方が重要
200倍くらい速度が違う場合もある
>>971 そりゃ 出たviewのトータルバイト数が少ない方が、
全てにおいてメリットばかりっすわ。
逆にデメリットはないんじゃないの。プログラマの手間増えるぐらいか。
974 :
NAME IS NULL :2006/10/08(日) 06:59:08 ID:1t6iDKSI
ここで質問してる人は実は仕事で行き詰ってる人?
そりゃそうだろう、他に何の用途がある
>975 パズル好き
答えてるのはほぼ間違いなく暇人だがな
質問させてください。 Windows 2000 に SQL Server 2000 をインストールして使っていました。 OSのホスト名を変更したのですが、SQL Server に昔のホスト名が残ってしまいます。 (レジストリを検索しましたが、ヒットしませんでした。) SQL Server は、ホスト名をどこで管理しているのでしょうか? また、変更するにはどうすればよいのでしょうか?
>>978 つ Microsoft SQL Server 総合スレ 4
MySqlが多いみたいだが仕事で使うのか?暇人は同意。
981 :
978 :2006/10/08(日) 19:04:37 ID:???
>>979 そちらで質問させてもらいました。
誘導ありがとうございます。
ウチのサーバはMySQL。でも何故か3.0
素敵やん
SQLとはちょっと違うのだが一つ質問。 プロセス間通信のかわりにデータベースをメッセージパッシングのためのキューとして使うのってなんか問題あるのかな? アプリ同士のメッセージ交換にActiveMQとかCORBAを使わずに簡単にできる方法としていいのかなと思うのだが。 そもそもデータベースってシステム内のスケールがものすごく広いグローバル変数だよな?
>>984 AS/400(今はiSeriesか)でも使っとけ。
システム(OS)がDB以外にもDTAQ,OUTQ,MSGQ,SYSLOG等の
数々のキューが用意されている。
DB使うのは悪くはないと思うけどプロセスの数が増えて
メッセージの応答やらセマフォとか考え出すと、
自前でDB部に対してコーティングするのが
ウザくなってくるので、メッセージキューなんかはOSまかせに
した方がプログラミングが楽だ罠。
986 :
984 :2006/10/09(月) 14:55:26 ID:???
>>984 ×スケール
○スコープ
..................................org
987 :
NAME IS NULL :2006/10/10(火) 02:50:06 ID:0dcODXjr
下記の条件で商品数を集計したいと考えています。 しかし、原価のフィールドがNULLの場合、3つ全ての条件にヒット しないため集計対象となりません。 原価フィールドにNVL関数を使用すると集計できますが、 もっといい方法がないでしょうか? 「NOT」の使用方法に問題があるのでしょうか? 商品A.原価=100円 商品B.上記以外 かつ 原価=1円以上 かつ 売値=300円 商品C.上記以外 商品A>商品B>商品C(商品A、商品B以外の全て) SELECT SUM(CASE WHEN 原価 = 100 THEN 1 ELSE 0 END) AS 商品A, SUM(CASE WHEN (原価 > 1 AND 売値 = 300) AND NOT 原価 = 100 THEN 1 ELSE 0 END) AS 商品_B, SUM(CASE WHEN NOT (原価 > 1 AND 売値 = 300) AND NOT 原価 = 100 THEN 1 ELSE 0 END) AS 商品C FROM 商品管理表
988 :
987 :2006/10/10(火) 03:09:06 ID:0dcODXjr
>>987 の質問に関連して
下記条件では原価がNULLのレコードが
ヒットできませんでした。
WHERE NOT 原価 = 100
下記条件だとヒットします。
WHERE NOT NVL(原価,0) = 100
データがNULLの際には特別な扱いが必要なのでしょうか?
989 :
NAME IS NULL :2006/10/10(火) 03:12:16 ID:wLuxOSg2
>>987 T−SQL、PL/SQLなら、
AND ISNULL(原価, 0) <> 100
DB2なら、
AND IFNULL(原価, 0) <> 100
考え方はいいね。こういう部下なら教えても意味がある。OTZ
990 :
NAME IS NULL :2006/10/10(火) 03:14:58 ID:wLuxOSg2
>>988 あれ?分ってるじゃん。
NULLは何に対しても偽になるよ。
逆に言うと計算をキャンセルさせるロジックとしても利用できる。
991 :
987 :2006/10/10(火) 03:23:38 ID:0dcODXjr
992 :
NAME IS NULL :2006/10/10(火) 03:32:55 ID:wLuxOSg2
>>991 どうしても0に変換したくないなら
AND (原価 <> 100 OR 原価 IS NULL)
って方法もあるけど、データ量が多い時にOR入れると遅くなるよ。
TABLE A +---------------------+----+--------+ | time | name | +---------------------+----+--------+ | 2006-05-27 14:01:07 | apple | 2006-05-27 14:01:07 | apple | 2006-05-27 14:01:12 | banana | 2006-05-27 14:01:00 | orange +---------------------+----+--------+ TABLE B +---------------------+----+--------+ | time | rw | name | +---------------------+----+--------+ | 2006-05-27 14:01:05 | w | apple | 2006-05-27 14:01:07 | r | apple | 2006-05-27 14:01:09 | w | orange +---------------------+----+--------+ というテーブルがあり、Bのrwをtimeの値が大きいものから抽出し、Aの同じnameのデータを持つ行に追加した結果を得たいのですが、どうすればよいでしょうか? よろしくお願いします。
>>993 よくわからん、追加した結果がどうなるかも書いてみて
^
^
^
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。