ペット嫌い板は、2ちゃんねるの鬼門だったな。
子供だからわかりませんってほんとに言ったの?>にかいどー氏に
「○○人は〜」
「×△国は〜」
の類は名誉毀損にはならない罠。
ゲーム鯖やコミック鯖もIP記録するようになったのね。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
のりゆき登場キボンヌ
電柱が一本も無い町並みを、初めて見た。
そんなまわりくどい傍証より見ればいいわけなんだけどね(^_^;)
<丶`∀´><あっ糖が。
そういうわけでここは快速スレですすれ違いのタラコの話などはやめてくださいね。
うそをうそと
>>IP記録
告発ネタが減少するのは残念。
・WTCテロのリーク
・西部の松坂の駐車違反
・牛肉買い上げの告発
等々、
いろいろとおいしいネタがあったのになあ。
おまえらの知ってる2ちゃん内の告発ネタを教えてください。
良識ある書き込みをしろ
何を今更・・・
孫悟空、フリーザ、クロコダイン、フレイザード、アシベ、ノーマッド、メロンパンナ
全部漫画・アニメのキャラの名前
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|タキューウしようよ!
∠________
∧_∧ ∧ ∧ο
( ・∀・) │ (゚Д゚ ∩
( つ=○つ ━┳━━┷━━┳━ | つ○
| | | ┃ .┃ / _ |〜
(__)_) ..┃ .┃ U ∪
管理人よくこんなに金あるな
こんな厨房にも分けてほしいわ
おれのイズピン記録すんなや
(^_^;)だけでマァヴに思えてくる。あぁ。
証明と実体を混ぜたら話がわかんなくなるが、、、
マジレスすると、確認のために2ちゃんを閲覧するだけでも2ちゃんのルールに
従えというのですか?
#イケメン
(・◇・)
(´ー`)ゝビッ 乙ですた〜 よーしおじさん過去ログ読んじゃうぞー
(^^)
次週には元気に走ってる刑事ドラマと違い
銃創や刀瘡は一生残るだろうな
以前入院してたトコに発砲事件で手を撃たれた主婦が来てた
軽症ってことで殆ど報道もされなかったが
肉と神経を掠った右手は、端は持てない字は書けない
賠償請求しようにも犯人に支払能力無しで治療費自腹
見ていて痛々しかった
犯人の私財も私物も刑務所での給与も取り上げろ!償い終わるまで贅沢を許すな
民事賠償が円満に終わるか保険入って首括るまで塀の中に入れとけ
27 :
デフォルトの名無しさん:03/01/14 16:21
age
(^^)
29 :
デフォルトの名無しさん:03/01/15 18:04
こんにちは
外部結合で結合で
一方の条件に対するデータが存在しなかった場合でも
片方のデータを結果セ ットに含める指定を含めた選択を
行いたいのですがうまくいきません
TOKMST
SHITENCODE TOKCODE ...
01 0001
01 0002
01 0003
01 0004
01 0005
TOKTRN
SHITENCODE TOKCODE ZANDATE ZANKIN ...
01 0001 '2002/01/31' 1000
01 0004 '2002/02/01' 6000
01 0005 '2002/01/31' 1500
これらのテーブルで取り出した結果が
SHITENCODE TOKCODE ZANDATE ...
01 0001 2002/01/31 1000
01 0002
01 0003
01 0004
01 0005 2002/01/31 6000
としたいのです
/*マスタとトランザクションファイルを結合*/
select MST.SHITENCODE ,
MST.TOKCODE ,
TRN.ZANDATE ,
TRN.ZANKIN ,
from TOKMST MST
RIGHT OUTER JOIN TOKTRN TRN /*LEFT OUTERでもうまくいかない*/
ON MST.SHITENCODE = TRN.SHITENCODE /*支店名
AND MST.TOKCODE = TRN.TOKCODE /*得意先コード
WHERE MST.SHITENCODE = '01'
AND MST.TOKCODE BETWEEN '0001' AND '9999'
AND TRN.ZANDATE = '2002/01/31';
としましたが
これらのテーブルで取り出した結果が
SHITENCODE TOKCODE ZANDATE ...
01 0001 2002/01/31 1000
01 0005 2002/01/31 6000
となって思うような結果が返りませんでした
どなたかどうぞよろしくお願いします
最後の
AND TRN.ZANDATE = '2002/01/31'
を削ってみては?
返信ありがとう
>29-30です
たしかに
AND TRN.ZANDATE = '2002/01/31'
を削ると希望の動作に近い結果が返ってきますが
SHITENCODE TOKCODE ZANDATE ...
01 0001 2002/01/31 1000
01 0002
01 0003
01 0004 2002/02/01 6000 /*このデータが不要*/
01 0005 2002/01/31 1500
となってしまいます
下記のような結果を出すことは出来ないものでしょうか?
(最初の投稿で希望する出力が間違っていたため再書込)
SHITENCODE TOKCODE ZANDATE ...
01 0001 2002/01/31 1000
01 0002
01 0003
01 0004
01 0005 2002/01/31 1500
うう、結果表を良く見てなかったです。申し訳ない。
AND (TRN.ZANDATE = '2002/01/31' OR TRN.ZANDATE IS NULL)
ではいかがでしょう。
返信ありがとうございます
>>29-30,
>>32です
実は
AND (TRN.ZANDATE = '2002/01/31' OR TRN.ZANDATE IS NULL)
も試していまして(書き込まず申し訳ないです)結果は
01 0001 2002/01/31 1000
01 0005 2002/01/31 1500
となってしまいます
InterBase+WindowsXPだからかな?
このような構成でこういった結果を期待すると
いうのは、結構多いような気がするのですが
私だけなのかな?
>34
WHERE句の「AND TRN.ZANDATE = '2002/01/31'」
を外す。
FROM句の「TOKTRN」の代わりに
「(SELECT * FROM TOKTRN WHERE ZANDATE = '2002/01/31') AS TRN」
とかやってみる。
ちなみに未検証。
返信ありがとうございます
>>29-30,
>>32,
>>34です
>FROM句の「TOKTRN」の代わりに
>「(SELECT * FROM TOKTRN WHERE ZANDATE = '2002/01/31') AS TRN」
>とかやってみる。
Oracleでしたらこれで解決なのですが
InterBaseなのでFrom句でのSelect文をサポートしてないようです
これ以上時間を割くわけにはいきませんので
プロシージャを書いて抽出しようと思います
返信して下さった
>>31,
>>33,
>>36さん
ありがとうございました
38 :
デフォルトの名無しさん:03/01/20 08:11
外部キーで繋がっている項目を削除するときに、
いちいち参照元から順に DELETE しているのですが、
一発でできるテクがあったら教えてほしいです(無理!?)
DBの実装によりますね。
CASCADING DELETEをサポートしているRDBであれば、
参照整合性制約を作成するときに指定することで、DELETE発行時に
子表にあるデータを削除してくれるはずです。
>>39 InterBase 使ってるんですが ON DELETE CASCADE というのがありました
ありがとぉ
と思ったら全然違うものみたい
>>29 一回VIEWに吐いた物からSELECTすれば?
>>29 おれはオラクルしかしらんなぁ・・SQLPLUSだとこれでよしだった。IBてなんじゃろ
select *
from TOKMST MST ,TOKTRN TRN
WHERE MST.SHITENCODE = TRN.SHITENCODE(+)
AND MST.TOKCODE = TRN.TOKCODE(+)
AND MST.SHITENCODE = '01'
AND MST.TOKCODE BETWEEN '0001' AND '9999'
AND (TRN.ZANDATE = '2002/01/31'
or TRN.ZANDATE IS NULL)
44 :
デフォルトの名無しさん:03/01/21 18:20
NTで動かしているMSSQL2000で、アップデート(かな)で以下のような
メッセージが出てしまいます。
[Microsoft][ODBC SQL Server Driver][SQL Server]
データベース コンテキストは '<***>' に変更されました。
[Microsoft][ODBC SQL Server Driver][SQL Server]
言語設定を 日本語 に変更しました。
SQLは初めてで何のことか調べてもサッパリで困り果てて...
おわかりになる方いましたらご教授願えませんでしょうか。
45 :
デフォルトの名無しさん:03/01/23 20:02
設計値テーブルを元に単価テーブルを更新をしようと思いますが、
設計値テーブルが下記のようになっているため、
UPDATE 単価
SET T.COST = S.長さ x S.高さ
FROM 設計値 AS S, 単価 AS T
WHERE S.ID = T.ID
したいのが思うようにいきません。
設計値
ID PARM VALUE
01 長さ 30
01 高さ 25
02 長さ 50
02 高さ 30
03 長さ 50
03 高さ 30
単価
ID COST
01 ...
02 ...
03 ...
(^^)
47 :
デフォルトの名無しさん:03/01/23 20:36
sybase-11.0.3使用してます。
以下のテーブルがあるとします
# 表中「_」はスペースだと思ってください。
販売コード___販売明細コード_大分類コード_売価
------------_--------------_------------_-----------
K0000000004__001____________01_________________10000
K0000000004__002____________03_________________10500
K0000000005__001____________01_________________13000
K0000000006__001____________03_________________10000
K0000000016__001____________03_________________10000
このテーブルから↓の行だけを取り出したいのです。
K0000000005__001____________01_________________13000
条件は
・大分類コード「01」または「02」を持っている
・同じ販売コードの中に大分類コード「03」を持っていない
といったものですが、group by を使ったり等何度試しても取り出せません…。
>47
NOT EXISTS とか NOT IN とか
>>45 たしか、SQL鯖できるんだけどORACLEは出来なかったとおもう?
ビュー作ってやった記憶ある
>>45です。
>>49 ORACLEだめっ?!(はぅ・・・・・)
SQLServerだとどうしたらよいのでしょう。
51 :
デフォルトの名無しさん:03/01/24 10:14
>>47 sybaseは知らないけど
SELECT * FROM テーブル WHERE
大分類コード IN('01','02') AND
大分類コード NOT IN ( SELECT DISTINCT 販売コード FROM テーブル WHERE 大分類コード <> '03' )
てなかんじでいけない?
>>51 間違えた...
SELECT * FROM テーブル WHERE
大分類コード IN('01','02') AND
販売コード IN ( SELECT DISTINCT 販売コード FROM テーブル WHERE 大分類コード <> '03' )
>>50 Oracleだと、
update t set cost = (select parm*value from s where s.id = t.id);
>>52 それだと、
K0000000004__001____________01_________________10000
K0000000005__001____________01_________________13000
の2行が取れてしまいました。。
select * from TABLE T1
where 大分類コード in ('01','02')
AND
NOT 販売コード in (
select 販売コード from TABLE T2
where 大分類コード = '03')
こんな感じでできました。お騒がせしました。
55 :
デフォルトの名無しさん:03/01/25 01:53
質問です。
データをNoでソートした後、分割して、その分割した
塊のN個目だけをのこして削除する。
No Name
------- ------
1008012 あああ
1008055 いいい
1008061 うううう
1000072 えええ
・
例:1000件のデータを100分割して、その中の2番目だけ取り出す。
つまり、11番目から20番目のデータが残る。
このようにできるDELETE文はないでしょうか。
ただしNoは連番ではありません。
お願いします。
>55
TOP 10 〜 で、最初の10件が取得できる。
NOT IN あるいは NOT EXISTS を使うことで
最初の10件以外のデータが取得できる。
そのデータのTOP 10 を取得することで
11〜20件目が取得できる。
DETETE と NOT IN(NOT EXISTS)で11〜20件目以外の
データをたぶん削除できる。
>>50 SQL鯖では
>>45のSQLが通るはず
ORACLEは
>>50でいくみたいね
おいらは思いつかずVIEW作ってUPDATEしてた
>>55 質問ではDBMS名を書きましょう
答える方もいろいろ考えるの大変だし
PostgresはLIMITとOFFSETを使用すれば簡単
ORACLEはrownumでサブクエリにすれば出来るし
SQL鯖では(たぶんSQL2発かな?)
select TOP 10 * from
(
SELECT TOP 20 * from Table order by No asc
)
order by No desc
58 :
デフォルトの名無しさん:03/01/26 19:14
現在インターネットが繋がりにくい障害はSQL使っているサーバーの穴をアタックしてるらしいんですが、
うちの会社は大丈夫なんだろか…
月曜日出勤するのが恐しい…
((;゚Д゚)ガクガクブルブル
59 :
デフォルトの名無しさん:03/01/27 10:32
select * from table where tableid='target';
みたいにしてレコードを選択する場合
tableidの大文字小文字を無視することはできないでしょうか?
tableidがTargetだったりtarGetだったりTARGETだったりする
レコードをすべて抜き出したいのですが・・・
正規表現の//iに近いイメージです。
60 :
デフォルトの名無しさん:03/01/27 12:44
Javaのプログラム中からテーブルに要素を追加しようとしているのですが、
うまくいかない部分がありますので教えていただきたいと思います。
使っているデータベースのソフトは MicrosoftAccess です。
要素を追加しようとしているテーブルには、3つの列(key, ID, time)があり、
データ型はオートナンバー(key)とテキスト型(ID, time)です。
プログラム中で、
String sql = "INSERT INTO table (ID, time) VALUES ('user', '1:10')";
という感じで、オートナンバーは挿入時に自動的に決まるように INSERT 構文を
書いたのですが、
「INSERT INTO ステートメントの構文エラーです」
というメッセージが出てしまいます。
どこかおかしいところがあれば、ご指摘いただきたいと思います。
SQLの入門書を一冊くらい通読したほうがいいよ
|------|------|------|------|---|------|
| kumi |name1 |name2 |name3 |...|name10|
|------|------|------|------|---|------|
|1kumi | 安藤 | 伊藤 | 上田 |...| 斉藤 |
|2kumi | 赤田 | 上島 | 浦部 |...| 小島 |
|3kumi | 安西 | 池田 | 榎本 |...| 田方 |
|------|------|------|------|---|------|
というようなmeibo1というテーブルがあり、
同じような形式のテーブルがmeibo4まであります。
それぞれのテーブルにははじめの列に必ずkumiという列があります。
つまり学級ごとの生徒の名前が10人づつはいっているテーブルが4つ
あり、全部で1クラス40人の名前データがあるのですが、
たとえばこの複数のテーブルから
「鈴木」と「矢田」という名前のあるデータのkumiの値を取り出したいのです。
しかし、「鈴木」と「矢田」というデータが違うテーブルにあるため
どのようなSQLを入力すればよいのかわかりません。
このような複数のテーブルからの重複検索の方法はありませんか?
テーブルをまとめずに検索したいのですが。よろしくお願いします。
ちょっとずれてたので修正します。
|-----|------|-----|-----|...|-------|
| kumi |name1|name2|name3|...|name10|
|-----|------|-----|-----|...|-------|
|1kumi | 安藤 | 伊藤 | 上田 |...| 斉藤 |
|2kumi | 赤田 | 上島 | 浦部 |...| 小島 |
|3kumi | 安西 | 池田 | 榎本 |...| 田方 |
|-----|------|-----|-----|...|-------|
すみません。まだずれてますけどお願いします。
>>62 > このような複数のテーブルからの重複検索の方法はありませんか?
に対しては、union で何とかなると思う。しかし...
>>64 の言うように、テーブル設計が無茶苦茶。
こんなテーブルでは、多分たいしたことしてないだろうから無理せず Excel で運用した方がいいとおもう。
>>62 んだから質問するならDBMSくらい書けよ
折角書いてもサブクエリ使えなきゃ意味無いじゃん
>>59 select * from table where lower(tableid)='target';
みたいに、カラム側に大文字or小文字変換をかければ良し。
ただ、indexが使われなくなる可能性大。
>>63 SQL−DBとしての意味をなしてないな。 そら非効率だわ。
一応方法は
>>65が指してるから置いといて…
面倒だけど今からでも遅くない。こうしとけ
[meibo]
serial bigint(20) unsigned not null auto_increment, (若しくはpgならserial宣言)
meibo_number bigint(22) not null,
kumi varchar(12) not null,
name varchar(50) not null,
上から順番に シリアル番号 名簿番号 クラス 名前 だな。
最初っからこうしとけば
select kumi from meibo where 1 and name='鈴木' or name='矢田' order by meibo_number, class, serial
の1発で済むだろうに。
【
>>63 は DBを理解するところから始めましょう 】
しかし、作ってしまったものは…いや!
やはりここはプログラム書いてでも今すぐテーブル構造を何とかしろ! 今すぐ!
>>67 うわ、変換あったんだ。 覚えとこう…。
>>68 とりあえずマニュアル見とけ
SQLリファレンスとかきっとあるから関数の章を眺めること
>>69 関数とトリガーって、やっぱり見ておかないとダメか。
久しぶりにやる気出てきた。 がんばるべー。
WHERE句の条件にマッチする行が1つでも存在するのかどうかをSQLで書きたいんですが、
SELECT COUNT(*) FROM TABLENAME WHERE HOGE='HOGE';
のようにした場合は全行をカウントするのでロスが出ると思い、効率のいい方法を探して
いるのですがよい方法はないのでしょうか?
たしかexists使えば一件ヒットしたらそこでストップするっての書けたと思うんだが・・・ド忘れした。
明日でよければ書いとくよ。
SELECT 1 FROM DUAL
WERER EXISTS (SELECT 1 FROM TABLE
WHERE 〜)
SQLオンリーで書きたいのですが
例えば「必須項目」と「任意項目」とあったときに
WHERE句で条件分岐させたい
(任意項目が入力されていたら任意項目も検索条件にする)
と言うようなものは書けるのでしょうか?
また書けるのでしたらどのように記述すれば良いか
ご教授お願いいたします。
>>71 SQLServerにはTOP 1がある。
他は知らん。
>>75 WHERE 検索対象 = 必須 AND (任意 = '' OR (任意 <> '' AND 検索対象 = 任意))
日本語をそのままSQLに翻訳してみた。
でも動的SQLの方が良くない?
>>76 thx
さっそく試してみます。
ってか、動的にしたいのはやまやまなのだが
とある事情で動的に書いてはダメなそうな・・・
>>75=
>>77です
>WHERE 検索対象 = 必須 AND (任意 = '' OR (任意 <> '' AND 検索対象 = 任意))
をちょっとデータに当てはめてみました。
TEACH_CODEはNUMBER(3,0) NOT NULL
FRUIT_CODEはNUMBER(6,0) NOT NULL
WHERE TEACH_CODE = 181 AND (FRUIT_CODE = '' OR (FRUIT_CODE <> '' AND FRUIT_CODE = 100005))
これだとTEACH_CODEが「181」でFRUIT_CODEが「空」のものか、FRUIT_CODEが「空」では無く「100005」
のデータを取得する。
・・・と言う事になってしまうと思うのですが。
>>78 [検索対象1] = [TEACH_CODE]
[検索対象2] = [FRUIT_CODE]
[必須] = [181] ←「181」が入力された
[任意] = [100005] ←「100005」が入力された
WHERE TEACH_CODE = 181 AND (100005 = '' OR ('100005' <> '' AND FRUIT_CODE = '100005'))
[必須] = [181] ←「181」が入力された
[任意] = [] ←未入力
WHERE TEACH_CODE = 181 AND ('' = '' OR ('' <> '' AND FRUIT_CODE = ''))
数値かよ。
型に注意して適当にやってね。
SQLSERVERならこれでも通る。
81 :
デフォルトの名無しさん:03/01/30 20:53
VB6.0でAccessに接続している。
データベース内のテーブル「Table1」に「年齢」というフィールドがあったとする。
その時、VBのコードに(もちろん実際はstrSQLとかいうstring型の変数を用意しておいて
やるが、ここは簡略的に書いてある)
str文字=20
SELECT * FROM Table1 WHERE 年齢 = 'str文字'
と書いてレコードを検索しようとした場合、「str文字」という項目を探してしまう。
裏技のようなものはないですかね・・・。
str文字はstring型の変数で、VB内で宣言しています。
スマソ
ん?
俺変なこと聞いてる?
>>83 脳障害の疑いがあります。知能検査を受けてください。
(知的障害者更生施設への入所をお奨めします)
>>84 お前は人格に欠陥がある。死んだ方がいいよ。
WHERE 検索対象 = 必須 AND (任意 = '' OR (任意 <> '' AND 検索対象 = 任意))
↓
WHERE 検索対象 = 必須 AND (任意 = '' OR 検索対象 = 任意)
>>83聞いてる
>>86 あらほんと、こぼけかましてました。
でも
>>78は「任意」に「FRUIT_CODE」を当てはめてしまいましたとさ。
>>81 内容的に変なことは聞いてない。聞き方が変なだけ。
レベルの低いこと聞いてることは確か。
strSQL = "SELECT * FROM Table1 WHERE 年齢 = " & str文字
そんなあなたも
>>84に比べれば全然素敵です。
>>87 ありがとうございました。
今日の午前中に会社からここを見て助かりました!!!
お陰で実験が成功して上司に報告する事が出来ました。
聞き方・・・勉強します。はい。
89 :
デフォルトの名無しさん:03/01/31 18:36
>>88 この不景気なご時世に、そんな「実験」でメシが食えるなんてオメデタイ会社だね(w
90 :
デフォルトの名無しさん:03/01/31 18:45
>89 今そんなこと書いたらお前
>>84と思われるのに勇気あるな。
ん?
別にSQL文の実験じゃないぞ。
上に書いたことは実験に必要な極一部分だ。
それくらい解らないか?別にいいけどもさ。
>>89 いや、そんなこともないよ。SQLを使えるベンダはまだ国内で10社もないからね。
>>92 ORACLEとMicrosoftとSybaseとIBMとInfomixと・・・あと何だ?
>>93 あと思いついたのが、びーとりぶ?
ボーランドも作ってないかい?
質問です。
TabA
Key1 Data1 Data2
----------------
1 2 A
2 2 X
3 1 L
Key1 Key2 Data3 Data4
---------------------
1 4 o p
1 8 e f
3 3 x q
というテーブルがあった時、
Key1 Key2 Data1 Data4
-----------------------
1 8 A p
2 NULL 2 X
3 3 1 q
と言うようなデータを選るにはどうしたらよいでしょうか?
TabA.Key1=TabB.Key1の関係ですが、
必ずしも結合出来るデータがあるとは限りません。
TabBに結合できるデータが複数ある時は
Key2が一番大きい値のデータが欲しいです。
Ora8i使ってます。
最初、サブクエリーで余裕かと思ったんですがダメでした。
>>95 とりあえず外部結合でググると(・∀・)イイ!
あと、検索結果2行目のData4が「X」になっているけど
1.NULLの間違い
2.Tab2で等価結合できるデータがない場合はTab1.Data2を表示する、という仕様を書き忘れた
3.その他
どれ?
1.だとして話を進めるとこうかな?
select a.Key1,c.maxKey2,a.Data1,b.Data4
from Tab1 a,Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where a.Key1 = b.Key2(+)
and a.Key1 = c.Key2(+)
眠いからあんまり深く考えてない。駄目だったらスマソ
やっぱ寝ぼけてた。
select a.Key1,c.maxKey2,a.Data1,b.Data4
from Tab1 a,Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where a.Key1 = b.Key1(+)
and b.Key1 = c.Key1
and b.Key2 = c.maxKey2
>>98 目立グループ内では、天下だろうけど...。
>>97=96
ありがとうございます。すいません、例題ミスってましたね。1番が正解です。
自分も同じようなSQL文書いたんですがダメだったんです。
>>97を実行すると下のようになります。
KE MA DATA1 DATA4
-- -- ---------- ----------
1 2
2 2
3 3 1 q
念のため、サンプルSQLを書いておきますので
暇が余っていたら試してみてもらえませんか?
とりあえず、プログラムではデータ量・要求パフォーマンス共に
たいしたこと無かったんで、ループさせながらSQL1つかませて
逃げたんですが、どーしてそれじゃダメなのか納得行かないんです。
create table TabA(
Key1varchar2(2),
Data1varchar2(10),
Data2varchar2(10));
create table TabB(
Key1varchar2(2),
Key2varchar2(2),
Data3varchar2(10),
Data4varchar2(10));
insert into TabA values('1','2','A');
insert into TabA values('2','2','X');
insert into TabA values('3','1','L');
insert into TabB values('1','4','o','p');
insert into TabB values('1','8','e','f');
insert into TabB values('3','3','x','q');
すいません。
100で書いた結果は
>>96の結果でした。
>>97の実行結果は
KE MA DATA1 DATA4
-- -- ---------- ----------
1 8 2 f
3 3 1 q
が正しいです。
>>97 Oracleの外部結合って結合条件以外にも
外部結合演算子付けなきゃいけないんじゃ
なかったっけ?
>>100>>102ガ━━━━(;゚д゚)━━━━━ン !
select a.Key1,c.maxKey2,a.Data1,b.Data4
from Tab1 a,Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where a.Key1 = b.Key1(+)
and b.Key1 = c.Key1(+)
and b.Key2 = c.maxKey2(+)
今の職場、Oracle入ったマシンが無いから試してない。
つーか試せない。駄目だったらマジスマソ
104 :
95=100:03/02/04 01:53
>>97=103
度々すんませんです。
でも・・・・・
KE MA DATA1 DATA4
-- -- ---------- ----------
1 2 p
1 8 2 f
3 3 1 q
2 2
という結果なんですよ。
なんででしょうね?ぱっと見簡単そうなんですけど。
別に謝ってもらう必要は無いっす。
俺もできないんだし。
さぁ、SQLパズル大好きな人挑戦してくださいっ!
>>104 97さんと変わらないと思うけど
SQL Serverで試したらうまくいったっぽい
SELECT TabA.Key1, TabD.Key2, TabA.Data1, TabD.Data4
FROM TabA
LEFT OUTER JOIN(
SELECT TabB.* FROM TabB
INNER JOIN ( SELECT Key1, MAX(Key2) AS MaxKey2 FROM TabB GROUP BY Key1 )TabC
ON ( TabB.Key1 = TabC.Key1 AND TabB.Key2 = TabC.MaxKey2 )
)TabD ON ( TabA.Key1 = TabD.Key1 ) ORDER BY TabA.Key1
あとはOracleで試して。
でも
>>95の結果
Key1 Key2 Data1 Data4
-----------------------
1 8 A p
2 NULL 2 X
3 3 1 q
の一行目って間違いじゃない?
1 8 2 f
では?
>>104 103はこれの間違いでした。
(A.X = B.X(+) AND B.X = C.X)とやるとAについて全件出てこないという
話を聞いたので・・・。けど、今見ると駄目っぽいな(;´Д`)y ─┛~~
select a.Key1,c.maxKey2,a.Data1,b.Data4
from Tab1 a,Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where a.Key1 = b.Key1(+)
and b.Key1 = c.Key1(+)
and b.Key2 = c.maxKey2
なので代案。
これで駄目なら漏れはあきらめまつ。
(1)
select a.Key1,d.Key2,a.Data1,d.Data4
from Tab1 a,
(
select b.* from Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where b.Key1 = c.Key1
and b.Key2 = c.maxKey2
) d
where a.Key1 = d.Key1(+)
(2)
select a.Key1,c.maxKey2,a.Data1,b.Data4
from Tab1 a,Tab2 b,
(select Key1,max(Key2) as maxKey2 from Tab2 b group by Key1) c
where a.Key1 = b.Key1
and b.Key1 = c.Key1
and b.Key2 = c.maxKey2
union
select a.Key1,NULL,a.Data1,NULL
from Tab1 a
where
and NOT EXISTS (select 1 from Tab1,Tab2 where Tab1.Key1 = Tab2.Key1)
>>105 わざわざすんません。
でも、Ora8iじゃJOIN構文は使えないんです。
9i以降ならOKなんですが。。。
昨年末まではLinuxに入れた9iあったんですけど
もう潰してしまったので試せる環境が無いっす。
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>107=97
(1)で逝けました。
ふむふむ、サブクエリーにサブクエリーをさらにかませると。
パフォーマンスは大丈夫っすかね?
時間が取れたら、大量データ(という名の実データ(w )で試してみます。
しかし、なーんでそんな面倒な事しなくちゃいけないんでしょ。
今一歩理解が足りないようですね>自分
ちなみに(2)は最後の行で式がありませんと怒られます。
本当にありがとうございました。
>>109 また間違えた(;´Д`)y─┛~~
(2)の最後の行は
where
NOT EXISTS (select 1 from Tab2 where a.Key1 = Tab2.Key1)
でつ。
a.Key1 NOT IN (select Key1 from Tab2 where a.Key1 = Tab2.Key1)
と同じになるはず・・・。多分だけど。
要は内部結合の結果と、Key1がTab1にあってTab2にないデータをUnionしてるだけです。
ちなみにパフォーマンスは(・Α・)イクナイ!と思う。
データ量が多いなら(1)はテンポラリセグメントを大量に使いそうだし、
(2)は相関副問い合わせになってるし・・・。
>しかし、なーんでそんな面倒な事しなくちゃいけないんでしょ。
多分、b,cでの内部結合の結果集合に対してaと外部結合しなきゃいけないから
じゃないかと。WHERE句じゃあ順番指定できないし・・・。
>>105さんのを見るとINNER JOINの結果に対してLEFT OUTER JOINしてるから
大丈夫なんだなぁ、と思いますた。
111 :
デフォルトの名無しさん:03/02/06 23:06
おまいらの皆さん!
(Postgresでいうところの)DATE型のカラムに生年月日が入っています。
このカラムから現時点での年齢を求めるにはどうすれば???
おしえてください!
よーし、こんどは俺が答えてやろー。
日付をYYYYMMDDの8桁の数字ととらえる。
当日と生年月日の後ろ4桁を比較し、
当日=>生年月日 なら 当日の前4桁ー生年月日の前4桁
そうでなければ(当日<生年月日)、当日の前4桁ー生年月日の前4桁+1
を算出。DECODEとかで。
つーか、俺はORACLEしか触った事ないんでPostgreにDECODEがあるかしらんけどなー。
なんか気になったのでoracle版を作ってみた
create table date_sample(UMARE DATE);
というテーブルを作って
select umare
,decode (
sign(to_char(age,'MMDD') - to_char(sysdate,'MMDD'))
,-1
,to_char(sysdate,'YYYY') - to_char(age,'YYYY') + 1
,to_char(sysdate,'YYYY') - to_char(age,'YYYY')) toshi
from date_sample;
UMARE TOSHI
---------- ----------
2000/02/04 2
2000/02/07 3
2000/02/09 3
つーことで、ちゃんと誕生日が来たかも判別しております。
鬱だ・・・・写し間違えてる
select umare
,decode (
sign(to_char(umare,'MMDD') - to_char(sysdate,'MMDD'))
,-1
,to_char(sysdate,'YYYY') - to_char(umare,'YYYY') + 1
,to_char(sysdate,'YYYY') - to_char(umare,'YYYY')) toshi
from date_sample;
>>111 その名も Age() と言う関数があるのだが...。
Extract(Year From Age(生年月日))
>>115 いやー、100さんには申し訳ないんだけど
こういう関数があるんじゃないかとおもってたんですよね。
Ageかー。
なんで自分で調べてわかんなかったんだろ。
いやでも助かりました。
どもども。
>>116 > なんで自分で調べてわかんなかったんだろ。
まあ、ちょっとわかりにくいやね。
俺なら、'-' 演算子で timestamp - timestamp → interval ができるようにして、Age(x) は、now - x の略記法だよ。とすると思う。
おいこらっ、そんな便利な関数つくるんじゃねー>Postgre
別にいいんだもーん、自分の勉強になったから
と強がってみるテスト
質問です。Oracle8i使ってます。
主キーが数値型で、ほとんど連番になっているテーブルがあります。
ほとんど、というのは物理削除されたレコードの欠番があるからです。
そのテーブルに対して新規挿入する時に、欠番になっている番号を
主キーとして発番し、登録しなくてはなりません。
こういう場合、その欠番になってる番号ってSQL文一発でとって来れます?
やっぱり、FETCHして下から空きになってる番号をアプリ側で
探さないとだめですか?
よろしくおながいします
>>119 rownumと連番が違う最初の番号を抽出するとかかなぁ?
しかし負荷かかって意味ねーな
どうしても連番に拘るのなら
物理削除の発生頻度がわからないので、
あくまでも案だけど、
削除時にトリガ等で、連番を振り直す方が
よいかと思うのだが?
>>119 select min(id) from (
select id+1 id from tbl
minus
select id+0 id from tbl
)
こんな類。速いかつーと微妙だけど。
DeleteTriggerでInsertする欠番テーブル作っちゃダメ?
>>120 rownumと連番が違う最初の番号を抽出ですか。
ぱっと思いつかないんですが・・・
select id,r from (
select id,rownum as r from (
select id from tbl order by id
))
where r <> id
and rownum = 1
こんな感じですかね?rownumってサブクエリで使っていいのかな?
ちょっと良く分からないので月曜日に試してみます。
連番の振り直しについては、説明不足で申し訳ないのですが
削除はけっこう頻繁におこるようで、無理そうです。
>>121 それ分かりやすくて(・∀・)イイ!
>>122 実は、この仕様が出てくる前はキーの最大値+1で発番してたんですけど
その時に発番テーブル作りましょうってテーブル設計者に言ってみたら
select max(id)+1 〜で取れって言われたんですよ。なんか、テーブルを
増やすのが嫌いな人みたいで。折角ですが、これも駄目って言われそうです。
とりあえず、FECTHしてロジックで比較と120さんのと121さんのを比べて
早そうなのを使います。みなさん、ありがとうございました。
>>123 >>select max(id)+1 〜で取れって言われたんですよ。なんか、テーブルを
普通はシーケンスを使うんだけどなぁ〜
今日試してみた所、123のでいけました。
rownumってサブクエリに書けたんですね。知りませんでした。
>>124 発番するキーがテーブル毎に「接頭語+年月+連番」とか「年月日+連番」とか
色々パターンがあって、月とか日とかが変わると連番を0に戻して振りなおす
という仕様があるんですよ。またまた説明不足でした。スマソ
まあ、実は0に戻す必要もないのでシーケンスでもいいのですが
「0に戻した方がカコ(・∀・)イイ!」
「ついでに欠番も埋めると超カコ(・∀・)イイ!」
という客&設計者の方針で今のような形になった訳です。
>>125 >>rownumってサブクエリに書けたんですね。知りませんでした。
書けるよーん
ふと思ったんだけど、論理削除しておいて
論理削除の番号があったら、そこにアップデートの方が
パフォーマンス的には良いかもなぁ
っとオモタ
>>126 >論理削除の番号があったら、そこにアップデートの方が
確かに変なSELECT文を発行しない分その方が速そう。
一から作るというのならその方が良さそうですね。
まあ、一から作るんならこんな変な作りにはしないという
話はありますが・・・(´・ω・`)
128 :
デフォルトの名無しさん:03/02/12 22:02
すみません、教えてください!!!!
検索結果によってもう一度検索を行うテーブルを変更する(?)という
事はできますか?
例えば、
TableA
ID TABLE
--------------------
1 TableB
2 TableB
3 TableC
TableB
Key1 Key2
--------------------
01 X
02 Y
03 Z
TableC
Key1 Key2
--------------------
01 a
02 b
03 c
というテーブルがあった場合、
ID="1", Key1="01"の時は、"TableB"のテーブルから Key2="X"を、
ID="3", Key1="02"の時は、"TableC"のテーブルから Key2="b"を、
というような情報の取得を行いたいんです。
できれば1回のSQLでやりたいのですが、このような事はできる
でしょうか?
ちなみにDBはSQL Serverです。
>>128 select ID, Key1, Key2
from TableA, TableB
where TABLE = 'TableB'
union
select ID, Key1, Key2
from TableA, TableC
where TABLE = 'TableC'
SQL Serverでも使えると思う。
・・・が、このような設計には普通はしない。
サブタイプの場合、子テーブル(TableB, TableC)側に
親テーブル(TableA)のキーを持たせて従属関係を作る。
#つーか、TABLEって列名使えるのか?
>>129 ありがとうございます!
unionは考えたのですが、今回想定してるものではTableB,TableCに
あたるテーブルが6つあり、全部unionでつなげるとパフォーマンスが
怖いかなと思ってます。。。
普通は子テーブル側に親テーブルのキーを持たせるとの事ですが、
TableB
ID Key1 Key2
--------------------
1 01 X
1 02 Y
1 03 Z
2 01 X
2 02 Y
2 03 Z
TableC
ID Key1 Key2
--------------------
3 01 a
3 02 b
3 03 c
このようなイメージでよいでしょうか?
#この場合TableBとTableCを分ける必要ないですけど。
これの場合、Key2の部分がかなり重複する(20倍程度)してしまうので、
これまた怖いのですが、こういった形で組むのが無難なのでしょうか?
下手に何度もクエリーするより、こちらの方がパフォーマンスも良いですか?
#列名にTABLE・・・・。 ま、まぁ、サンプルとゆーことで(^^;
・・初心者ということをさらけ出しまくってます。
>128
TableList ←テーブル一覧を格納するテーブルを作る。
ID(PK) TableName
--------------------
1 TableB
2 TableC
3 TableD
TableA
ID(PK) TABLE(FK) ←TABLEはTableListを参照する。
--------------------
1 1
2 1
3 2
TableBC
Key1(PK) TABLE(PK,FK) Key2 ←TABLEはTableListを参照する。
--------------------
01 1 X
02 1 Y
03 1 Z
01 2 a
02 2 b
03 2 c
TableBとTableCが分かれているのはレイアウトが同じで種類が違うんだろうから
TableListの代わりに種類マスタとかにしてTABLE列もSYURUIとかにしたらどーよ。
これで自然なSQL1文でお望みのデータが取得できます。
ちなみに「親テーブル(TableA)のキーを持たせて従属」させてはいけません。
結果は>130のとおり、データが冗長します。
132 :
デフォルトの名無しさん:03/02/13 21:59
MS SQLサーバーって幾ら位するの?
サーバー側のアプリケーションをかいている者ですが、
下のコード、どこがおかしいのかわからないので
分かる方助けて下さい。 エラーメッセージは
Microsoft JET Database Engine (0x80040E14)
Extra ) in query expression '(UserID=)'.
だそうです。 データベースはアクセス使っています。
多分3行目の所が何か変なのでしょうが、さっぱり分かりません。
いらないスペースがありますか?
SQL = "Select "
SQL = SQL+"EmpUserName, EmpPasswd from tEmployee"
SQL = SQL+" Where "+"(UserID=" & inputID & ")"
response.write SQL+"<BR>"
よろしくお願いします。
ASPなの?
>>133 inputIDが空っぽなんじゃないの?
はい。
ASPしてます。
書き込む掲示板が違ったかな? ゴメンナサイ。
やっぱりプログラム全体をみて
ながれをみないと、よく分かりませんよね。
もう一度出直してきます。
134さん、135さん、ありがとう。
まあ定石としては、そのSQL文を実行する直前でメッセージボックスかなんかに
表示させてコピーし、AccessのSQL窓で直接実行してみるこった。
それでちゃんと走るなら、SQL文の構文は正しい=原因はSQL以外ってことになる。
>>133 UserIDが文字列型なら
SQL = SQL+" Where "+"(UserID='" & inputID & "')"
かもね。
数値型なら
inputIDが空文字になることがあるかどうかってとこ。
139 :
デフォルトの名無しさん:03/02/14 17:18
始めまして。SQLを勉強しようと体験版オラクルを入れようとしてもWinMEなので使用できません。
フリーツールでsqlを使えるものはありませんか?練習用に・・・
>>139 フリーって事なら、PostgresかMySQLだべ?
Linuxでしか動かしたこと無いから
WINでのバージョン対応はわからないけど
これくらいは調べて練習してくださいな
141 :
デフォルトの名無しさん:03/02/15 19:05
ツリー型構造をDBにもたせて
ID, PID, NAME(何でもいい)としています。
(親なしはPID 0、階層は任意)
1, 0, A
2, 0, B
3, 1, A-a
4, 1, A-b
5, 3, A-a-1
6, 3, A-a-2
というテーブルがあった場合に、ID 1 を指定して
A, A-a, A-b, A-a-1, A-a-2
を引くようにするにはどのようなSQLを書けば良いでしょうか。
使用しているDBはMySQLです。
>>139 PersonalOracleははいるはず。
>>139 >>140のやつを除けばFirebirdとかHSQLDBとかForte入れたらついてくるPointbaseとか
MSDEって9x系で動くんじゃなかったか?
>>139 おもいっきり忘れてたけど
練習用ってことなら
MSDEがええんちゃうか?
SQL鯖と代わり映えしないし
あまりマイナーすぎると
詰まったときに情報少ないし
>>141 ツリー構造を持たせるときには他の階層のデータを保持させてます。
特定階層以下の全データを取得したりするならこれでいいかな。
create table 階層_MST(
階層ID CHAR(8),
階層名 VARCHAR2(28),
第1階層 CHAR(8),
第2階層 CHAR(8),
第3階層 CHAR(8),
第4階層 CHAR(8),
第5階層 CHAR(8)
)
/
select * from 階層_MST A
where A.第1階層 = '〜'
/
>>147 >>147 再帰SQLなんて知りませんでした、感謝
で、MySQLでは通りませんでした
プロシージャ書くにもC/C++じゃなきゃダメらしいし
結局DB利用するプログラム側で何とかしました (´・ω・`)
テーブルの別名で
FROM hoge AS T と
FROM hoge T
ってどっちが ANSI 準拠ですか?
動けば(・∀・)イイ!!
151 :
デフォルトの名無しさん:03/02/19 23:21
SQL言語(っていうのかな?)って、出来ることが限られていると思うのは
俺だけであろうか・・・。
俺はSQL初心者だけど、何故かコードが長くなってしまう。
VBやC++のコードのように短くコンパクトにまとめようと思ってはいるんだけど、
試行錯誤の上、コードが長くなる・・・。
みんなはどう?
追記:
コードが長くなるってのは、例えばSELECTでレコードを一行持ってきて
それを10回続けてから、すべてのレコードをUNIONでくっつけて表示させようとすると
似たようなコードを10回書いかないといけない(俺の知識だとそうなる)。
ということです。はい。
不思議だ・・・。
普通プログラマとして働いていれば「データベース」を扱う機会が
少なからずあるはずなのに、この板では「SQL」に関するスレが少ないし
レス数が伸びない・・・・・・・・・。
不思議っぽ。
おしえてやる。シークゥェルと読むんだ。
155 :
デフォルトの名無しさん:03/02/19 23:58
なんだここ?アホの集まりじゃねーか。
156 :
デフォルトの名無しさん:03/02/20 00:00
>アホの集まりじゃねーか。
まさにオマエモナ(プププ
昔々、平日の〇時前後に即レスが付くと思っている奴がおったそうな
めでたくないめでたくない・・
SQLってのはあくまでデータ取得のための言語っていうか文法であり
コーディングしてるっていう感覚はないんだがな
>>151-152 なんじゃ?もしかして
ORやINを使えば良いだけのことか?
件数や合計など得る場合なんかは
プログラム側でループをしなくても一発でいくし
その他にも、使いようによっては便利だけどなぁ
>153
SQLはデータ操作言語であり、VBやC++みたいな、何でも出来る普通の
プログラム言語に比べて定型化してるから、定番的な処理はFAQとして
蓄積されてる。
業務が変わってもDB構造の基本はほとんど変わらないのと同じ。
だからあえて2chで聞く必要も無いんじゃないの。
たまに変態的な処理をしなければならなくなった時に聞くくらいかなw
162 :
デフォルトの名無しさん:03/02/21 12:33
だね。
Oracleの掲示板よく利用してるけど、SQLの質問ってSQL入門程度の本でも分かるような超初心者的なものか
パズルとして出題できそうなほどの複雑な問合せかの2種類に殆ど分類できる。
前者については返答の後にSQL入門書買うことやんわりと薦めてるけど、そうするとお礼のレスが来る確立が下がるw
ロクに調べずに聞いてくる教えてクンだからしょうがないけど。
SQL2000でPL/SQLを使いたい(DBMSも言語も顧客の指定なのです(T_T)のですが、
方法を教えてください。
>163
無理です・・・
いやまてよ、Oracleへリンク張って・・・
アーヒャヒャ
166 :
デフォルトの名無しさん:03/02/21 20:10
SQL-99 ってどうよ?
Access2000でSQLのお勉強ってのは無しですか?
>>167 ありです。
ただ Jet の場合、ストアド使えないし
関数が VB なので基本のみにしましょう。
169 :
デフォルトの名無しさん:03/02/21 22:59
売上伝票と入金伝票という全くレイアウトの違う2つのテーブルに、
それぞれ、得意先コード・伝票日付・伝票番号があるとするでしょ?
で、その2つのテーブルを合わせて、得意先コード順+伝票日付順+伝票番号順に
並び替えるSELECT文って、どう書くの?
170 :
デフォルトの名無しさん:03/02/21 23:04
>>169 select
〜
from 売上伝票 a,入金伝票 b
where a.得意先コード=b.得意先コード
and a.伝票日付 = b.伝票日付
and a.伝票番号 = b.伝票番号
order by a.得意先コード,a.伝票日付,a.伝票番号
>>169 自然言語で記述すると、仕様がひどくあいまいに聞こえる。
他人に明確に要件を伝えられるぐらい自分が理解した時点では恐らく
問題はすでに解決しているのではないか。
・・・結局、他人に聞くよりは自分で考えてさっさとSQLを書いた方が
早い罠(w
>>169 一時テーブルにINSERTする手もあるが...。
UNIONしろよ
>>168 ありがとうございます。
実は先日選挙事務所でAccess2000使って仕事してたのですが
(後援会名簿のメンテナンス)、デザインビューで定義できる範囲
を超えた複雑な抽出が必要になり、生まれて初めてSQL文を
書いてクリアしました。
それから急にSQL文に興味を持った次第です。選挙事務所に
手伝いに来てた人の誰もSQL文を書いた事がないと言っており
ました。PGはいなかったようです。
Access使ってて、デザインビューではどうしても定義できない
抽出という場面に出くわした人は相当多いのではないかと思います。
親テーブル 1 - n 子テーブル
親テーブルの主キーが複数
子テーブルは親テーブルの外部キーを持つ
親テーブルと子テーブルは別DB(これが問題)
ってな場合で、ある条件を満たす子供を持つ親の数が欲しい場合は、
select count(*) from (
select distinct parent_id_1, parent_id_2 from child where 条件
)
以外にやりようがあるでしょうか?
単純に言うと複数カラムでdistinctしたうえでcountしたいってことです
sybaseだとこれ動かないんですよ!(from句のsubqueryが駄目ぽい)
>>176 自分の場合は全くの逆っす
ORACLEやSQL鯖では、普通に出来ていた事が
ACCESSで使えなくて歯がゆい思いをしている人の一人です
こういう人も少なくは無いと思う。
>>177 select count(distinct parent_id_1, parent_id_2) from child where 条件
って通らなかったっけ?
>>178 そういう場合distinctの対象のカラムは1個までなようです。
○ select count( distinct id ) from something
× select count( distinct id_1, id_2 ) from something
なんでだろ?
>>179 なんでだろ?Oracleは大丈夫だ。
式にするしかなさそうだね。
183 :
デフォルトの名無しさん:03/02/24 18:44
テーブル設計についての質問です
正規化を行ったら、A,B,Cの3つのテーブルができたのですけど、データ量から
いうと、Aのテーブルがデータ全体の80〜90%くらいを占めるのです。
この場合、Aを、たとえば年度ごとに分けるなどしたほうがよいのでしょうか。
あるいは、巨大でも一つのテーブルにしておいたほうがいいのでしょうか
>183
ムダに複雑になるkら、基本的におすすめできない。
データ量がパフォーマンス悪化への与える影響が顕著で、それがシステムを使用する
側にとって致命的で、なおかつテーブルを分ける以外に改善する方法が無いなら
しょうがないかもしれないけど。
>>184 レスサンクスです。
テーブルの大きさを概算してみたら
1年分で
多くて1000バイトx1日あたり20くらいx365日 で
10^7バイト程度のオーダーだったので、1テーブルにします
>>183 年度をまたいだ処理を行わないならいいけど。
巨大といってもテラバイトとかじゃないんでしょ?
DBMSにもよるけど、100ギガ超とかなら良くある話なんで気にしないのがいいかも。
>>184 DBMSはPortgreSQLかMySQLです。
>>183 とりあえず、特殊なケースではなさそうなので一般的な作りこみでいい
んじゃない?
普通に正規化して。
MySQLが候補にあるってことは参照系のシステム?
>>189 何をもって参照系って言ってる?
ちなみにMySQLはトランザクションはあるが。
>>189 INSERT UPDATEの頻度がSELECTに比べて十分に小さいという点では
参照系です。
候補がpostgresqlとmysqlなのは、予算の関係です。
>INSERT UPDATEの頻度がSELECTに比べて十分に小さい
普通だよな
参照系というのは、
最初にCSVかなんかからデータを一気にテーブルに流し込んで、
あとはSELECTのみ
ってかんじかな?
うん。普通ぽい。
断言して無いじゃん。
DBMSの候補、質問者のスキル、スケールからなんとなく、小企業のサブシ
ステム程度かなと思っただけ。
某Oraマンセー的な発言じゃないから、あまりつっこまないで。
確かにFirebirdは好きだけど。
Interbaseを使っているのですが
会員ID 質問ID 解答
------ ------ ------
aaa 01 11111
aaa 02 22222
bbb 01 11111
bbb 02 33333
ccc 01 44444
ccc 02 22222
このようなテーブルから
質問01の解答が11111、かつ、質問02の解答が22222という会員のIDを
1度のSQLで取得したいのですが、SQLをどう書けばいいのかわかりません。
SELECT distinct 会員ID from TBL where
( 質問ID='01' and 解答='11111' ) and (質問ID='02' and 解答='22222');
ぐらいしか思いつかないのですが、もちろんこれではひとつもかかりません・・・。
1度で取得することは可能なのでしょうか?
よろしくお願いします。
>>196 AND と OR の意味を英和辞典で調べてみましょう。
>>196 そのクエリでは、質問ID='01'かつ質問ID='02'かつ解答='11111"かつ解答='22222'
と同じ。
>196
よくある「たての物を横にする」的SQlを使えば可能ではあると思うが、
たぶん遅いしエラーも発見しにくい気が。
回答1、回答2・・・みたいな一時テーブルを作るほうが早いんじゃね?
>>197 むぅ・・・
このSQLで引っかからないのは分かってたんだけど
他の書き方が思いつかなくて・・・。
>>196 「質問01の解答が11111という会員」 の一時テーブルを作る
「質問02の解答が22222という会員」の一時テーブルを作る
この二つのテーブル両方にある会員のIDを抜き出す
>>196 突っ込まれている意味がわかってないようなので
よく見比べてください
SELECT distinct 会員ID from TBL where
( 質問ID='01' and 解答='11111' ) OR (質問ID='02' and 解答='22222');
それとも?
SELECT * FROM
(SELECT 会員ID FROM TBL WHERE 質問ID='01' and 解答='11111') a,
(SELECT 会員ID FROM TBL WHERE 質問ID='02' and 解答='22222') b
WHERE a.会員ID = b.会員ID
をしたいのか?
SQLの考え方や、アプローチの仕方や慣れ必要なので
本などで理解を深めた方が良いかと思います
>>196 SELECT 会員ID
FROM TBL
WHERE (質問ID = '01' AND 解答 = '11111') OR
(質問ID = '02' AND 解答 = '22222')
group by 会員ID
having count(*) >= 2
普通はinとかexistsを使う。
Interbaseにあるかは知らんが。
>>197-203 お前らの中にレベル低すぎる奴が5,6人いる。
>>204 それだとさ、同じレコードがあったとき
出てきちゃうんじゃ?
まぁ普通はプライマリキー違反起きると思うけど
会員ID 質問ID 解答
------ ------ ------
aaa 02 22222
aaa 02 22222
bbb 01 11111
bbb 02 33333
ccc 01 44444
ccc 02 22222
俺はAccessでアクションクエリ使ってやった。
SELECT テーブル1.会員ID INTO Fromクエリ1
FROM テーブル1
WHERE (((テーブル1.質問ID)="01") AND ((テーブル1.解答)="11111"));
SELECT テーブル1.会員ID INTO Fromクエリ2
FROM テーブル1
WHERE (((テーブル1.質問ID)="02") AND ((テーブル1.解答)="22222"));
SELECT [Fromクエリ1].[会員ID]
FROM Fromクエリ1, Fromクエリ2
WHERE ((([Fromクエリ1].[会員ID])=[Fromクエリ2].[会員ID]));
クエリでテーブル作成する手間はあるが。
>>196 SELECT T1.会員ID FROM テーブル AS T1, テーブル AS T2
WHERE T1.会員ID=T2.会員ID And T1.質問ID='01' And T1.解答='11111' And T2.質問ID='02' And T2.解答='22222';
Interbaseで使えるかどうかしらないが、普通なら
select distinct 会員ID from TBL
where 会員ID in(select distinct 会員ID from TBL where 質問ID='01' and 解答='11111')
and 質問ID='02' and 解答='22222'
と書くよ。
>>209 少なくとも、こんな書き方が普通とは思えない
質問が2通りだけしかないってのなら、アリかもしれないけどね
>>206 >それだとさ、同じレコードがあったとき
>出てきちゃうんじゃ?
それの答えは
>普通はinとかexistsを使う。
です。
>まぁ普通はプライマリキー違反起きると思うけど
そですね。
>>196のテーブルは会員テーブルと質問テーブルの関係テーブルだろうから。
...ってところまで書いて思いついた。
「〜問目に対する答えが〜なら〜点」のような評価する用のテーブルを用意すれば
もっと自然なSQLが書けるかもね。
現在顔写真付きの名簿を製作しているのですが、同一の会員番号のレコードがイメージテーブルに存在する場合(同じ人で複数の写真が登録してある場合)、写真取込日>写真貼付日>ファイル名
の最大値のレコードを対象としファイル取得するようなSQLを書きたいのですが、どのようなSQLを書けばいいのでしょうか?最初はSELECTでファイル名の取得の際に、複数レコードがあるかどうかを判別させて、
上記条件に合うレコードを持ってくるようにしたのですが、これでは上記条件に合うレコードしか引っ張ってこないので失敗でした。またWHEREで抽出できるかどうかと考えたのですが、これも上記条件のレコードのみを引っ張ってきて、
写真が複数無い人を引っ張ってきませんでした。何かいい方法はないでしょうか?
テーブルは会員登録用の下記と、
会員CD 氏名 会員区分CD
------ ------ ------
000001 モナ 000013
000002 ギコ 000013
000003 ぞぬ 000014
イメージ登録用の下記です
会員CD ファイル名 写真取込日 写真貼付日
------ ---------- ---------- ----------
000001 monakao.jpg 2003/03/01 2003/03/01
000001 monakao2.jpg 2003/03/04 2003/03/04
000002 gikokao.jpg 2003/03/04 2003/03/04
000003 zonukao.jpg 2003/03/04 2003/03/04
この二つをJOINさせて吐かせるときにモナーでmonakao2.jpgを選択して結果として下記を出したいのです。
会員CD 氏名 会員区分CD ファイル名 写真取込日 写真貼付日
------ ------ ---------- ---------- ---------- ----------
000001 モナ 000013 monakao2.jpg 2003/03/04 2003/03/04
000002 ギコ 000013 gikokao.jpg 2003/03/04 2003/03/04
000003 ぞぬ 000014 zonukao.jpg 2003/03/04 2003/03/04
お知恵を拝借できましたら幸いですます
213 :
デフォルトの名無しさん:03/03/04 12:49
>>212 意味が読みとりにくい文章だけど、、、
こんな感じ?
SELECT
会員.会員CD, 会員.氏名, 会員.会員区分CD, 最新イメージ.ファイル名, 最新イメージ.写真取込日, 最新イメージ.写真貼付日
FROM
会員,
(
SELECT * FROM (
SELECT
B.会員CD, B.写真取込日, B.写真貼付日, B.ファイル名 ,
(
SELECT COUNT(写真取込日) + 1 FROM
イメージ A
WHERE
A.写真取込日 > B.写真取込日 AND A.写真貼付日 > B.写真貼付日 AND A.ファイル名 > B.ファイル名 AND A.会員CD = B.会員CD
) AS RANK
FROM
イメージ B
) RESULT
WHERE
RESULT.RANK = 1
)最新イメージ
WHERE
会員.会員CD = 最新イメージ.会員CD
ORDER BY
会員.会員CD
もう一回。
SELECT
会員.会員CD, 会員.氏名, 会員.会員区分CD, 最新イメージ.ファイル名, 最新イメージ.写真取込日, 最新イメージ.写真貼付日
FROM
会員,
(
SELECT D.* FROM
(
SELECT B.* FROM
(
SELECT イメージ. * FROM イメージ,
( SELECT 会員cd, MAX(写真取込日) as 最新写真取込日 FROM イメージ GROUP BY 会員cd)A
WHERE イメージ.会員cd = A.会員cd and イメージ.写真取込日 = A.最新写真取込日
)B,
( SELECT 会員cd, MAX(写真貼付日) as 最新写真貼付日 FROM イメージ GROUP BY 会員cd )C
WHERE B.会員cd = C.会員cd and B.写真貼付日 = C.最新写真貼付日
)D,
( SELECT 会員cd, MAX(ファイル名) as 最新ファイル名 FROM イメージ GROUP BY 会員cd )E
WHERE D.会員cd = E.会員cd and D.ファイル名 = E.最新ファイル名
)最新イメージ
WHERE
会員.会員CD = 最新イメージ.会員CD
ORDER BY
会員.会員CD
全然スマートじゃない&データが多いと重そう。。。
とりあえずこんなんもあるということで。
>>214 うまくいきそうです!ありがとうございますです
レスありがとうございます。
>>202 後者のやつです。
こんな書き方ができることすら知りませんでした・・・。
でもこの書き方だとエラーになるみたいです(2つ目のselectで)。
いろいろいじってみたけどInterbaseがわるいのかな?
>>204 やりたかったのはまさにこれです。
こーゆーやり方があるんですねぇ。
>>206 会員IDと質問IDをプライマリにしてます
>>208 実行できませんでした(ASのところでエラー)
なんかSQLに関して無知すぎた気がします・・・。
も少し勉強してきまつ
ありがとうございました。
PLSQL
型番テーブル
PNO PRIMARY KEY 重複ナシ
KATANO VARCHAR2(6) 重複アリ
マスタテーブル
KATAMASTER VARCHAR2(10) 重複アリ
MAKER VARCHAR2(7) 重複アリ
結果表示
型番テーブルの「PNO」をマスタテーブルのMAKERで昇順出力すること。
KATAMASTERの先頭6桁は、KATANO(型番)
KATAMASTERの後ろ4桁は、訂符である(更新記録)。
KATANOは必ずKATAMASTERの先頭6桁とマッチする
KATAMASTERの先頭6桁が同じものであれば必ず同一のMAKERである。
できますか?私はギブアップしました。
>>218 SELECT PNO FROM 型番テーブル, マスタテーブル WHERE KATANO = LEFT(KATAMASTER, 6) ORDER BY MAKER
とかいうことではないの?
ちなみにPLSQLではLEFTじゃなくてSUBSTRかもしれない。
>>213さま
ちょっとやってみたんですが、
FROM
会員,
(
SELECT D.* FROM
(
SELECT B.* FROM
(
SELECT イメージ. * FROM イメージ,
( SELECT 会員cd, MAX(写真取込日) as 最新写真取込日 FROM イメージ GROUP BY 会員cd)A
WHERE イメージ.会員cd = A.会員cd and イメージ.写真取込日 = A.最新写真取込日
)B,
( SELECT 会員cd, MAX(写真貼付日) as 最新写真貼付日 FROM イメージ GROUP BY 会員cd )C
WHERE B.会員cd = C.会員cd and B.写真貼付日 = C.最新写真貼付日
)D,
( SELECT 会員cd, MAX(ファイル名) as 最新ファイル名 FROM イメージ GROUP BY 会員cd )E
WHERE D.会員cd = E.会員cd and D.ファイル名 = E.最新ファイル名
)最新イメージ
CとEのFROMでそれぞれ先にやった作業の結果を受けないとだめですよね?
とおもって「FROM イメージ」をそれぞれ「FROM B」と「FROM D」にしてみましたけど動かないです…
さらに別名振らないといかんのですかね?それとも全く別の回避方法があるでしょうか?
>>220 また間違ってたですか、、、
これはどう?
SELECT 会員.会員CD, 会員.氏名, 会員.会員区分CD, 最新イメージ.ファイル名, 最新イメージ.写真取込日, 最新イメージ.写真貼付日 FROM
会員,
(
SELECT イメージ. * FROM イメージ,
(
SELECT 会員CD, MAX(ファイル名) AS 最新ファイル名 FROM
(
SELECT イメージ. * FROM イメージ,
(
SELECT 会員CD, MAX(写真貼付日) AS 最新写真貼付日 FROM
(
SELECT イメージ. * FROM イメージ,
( SELECT 会員CD, MAX(写真取込日) AS 最新写真取込日 FROM イメージ GROUP BY 会員CD )A
WHERE イメージ.会員CD = A.会員CD and イメージ.写真取込日 = A.最新写真取込日
)B GROUP BY 会員CD
)C WHERE イメージ.会員CD = C.会員CD and イメージ.写真貼付日 = C.最新写真貼付日
)D GROUP BY 会員CD
)E WHERE イメージ.会員CD = E.会員CD and イメージ.ファイル名 = E.最新ファイル名
)最新イメージ
WHERE 会員.会員CD = 最新イメージ.会員CD ORDER BY 会員.会員CD
しかし重そう。
だれかスマートなやりかた教えて欲しい。
>>221 いや、やっぱり
DとBの中の「SELECT イメージ. * FROM イメージ,」がすてたはずのものを再度とってきちゃって
最終的にはファイル名の最大の物を持ってきてしまうです、その前でやってるはずの日付での抽出が無駄に…
(´・ω・`)ショボーン
>>212 select K.会員CD, K.氏名, K.会員区分CD, ファイル名, 写真取込日, 写真貼付日
from イメージ登録用 M INNER JOIN 会員登録用 K ON K.会員CD = M.会員CD
where exists
(SELECT * FROM (
select top 1 * from イメージ登録用 S
where M.会員CD=S.会員CD ORDER BY 写真取込日 DESC, 写真貼付日 DESC, ファイル名 DESC
) AS S
where M.ファイル名=S.ファイル名 AND M.写真取込日=S.写真取込日 AND M.写真貼付日=S.写真貼付日)
当方SQLServer
>>223 おおこれは逝けそうです、
質問ですが「select top 1 * from イメージ登録用 S」ここって
「select top 1 * from イメージ登録用 AS S」
ってことですよね?
あと
最初のSELECTで持ってきてる「ファイル名, 写真取込日, 写真貼付日」
って
「S.ファイル名, S.写真取込日, S.写真貼付日」
でよいのですよね?
>>213さま
>>223さま
ありがとうございました
223さまの方法でうまくいきました。
こんな方法があるですね、やっぱりきちんと勉強しないとダメですね>俺
>>225 >「select top 1 * from イメージ登録用 S」ここって
>「select top 1 * from イメージ登録用 AS S」
>ってことですよね?
はい。
SQLServerでは「As」は省略可能です。他は知らん。
>最初のSELECTで持ってきてる「ファイル名, 写真取込日, 写真貼付日」
>って
>「S.ファイル名, S.写真取込日, S.写真貼付日」
>でよいのですよね?
はい。
SQLServerでは使用するテーブル内でカラム名が重複しないとき、
相関名は省略可能です。他は知らん。
いずれもあったほうが可読性は増しますけどね。
>>223は検証済みですよ。一応...
>>227 ええ、ばっちし動きました、マジでありがとうございます
ASの所を聞いたのはそこのSと外のSとがあったので訳わかんなくなりそうだったんで…
ホントありがとうございました
>>228 あらほんと。まぎらわしいことやっちゃいましたね。
こんな場合いつもは違う名前つかうんだけど、ミスってしまいました。
ちゃんと動いたのはたまたまです。てへっ!
あり得るパターンを考えると、「イメージ登録用テーブル」に
同じ会員さんが、同日で複数登録してると「どっちやねん」って話にならない?
だから、「イメージ登録用テーブル」にユニークなキー(シーケンス)を
つけるのが一番楽でしょ
select a.会員CD, a.氏名, a.会員区分CD, b.ファイル名, b.写真取込日, b.写真貼付日
from 会員登録用 a, イメージ登録用 b,
(
select max(シーケンス) as シーケンス from イメージ登録用 group by 会員CD
) c
where a.会員CD = b.会員CD
and b.シーケンス = c.シーケンス
(未確認)
>>230 イメージのテーブルのキーに会員区分CDとファイル名が設定されていますので大丈夫かと思うです
そのために三段階でソートしたのを持ってくるですし
232 :
デフォルトの名無しさん:03/03/05 11:15
A B C の条件のどれかが一致し、かつ条件Dを満たすデータを取り出すにはどうしたらいいでしょうか?
WHERE A OR B OR C AND D
じゃないですよね?
233 :
デフォルトの名無しさん:03/03/05 11:19
WHERE (A OR B OR C) AND D
じゃないですか?
SQL以前の問題だ
日本語をそのまま書くだけじゃん…
初歩の初歩の簡単な簡単な論理演算くらい
できるようになれよ…(;´Д`)
つーかこんくらい論理演算と呼ぶのもおこがましいよ
>>235 あなたの説明はわかる人にはわかり、わからない人にはまったくわからない
無意味なものです。
わからない人がなぜわからないのかを考えなさい。
ちなみに全てのSQL文は日本語をそのまま書くだけです。
>>232 質問する前に検証しやがれこのハゲ!
知識レベル以前の問題じゃこのチ○ゲ!
日本語じゃなくて英語だろうな
>>238 「SQL文は日本語をそのまま書く」は
日本語をSQLに翻訳する、ということなので
変換前は英語じゃなくて日本語ですよこのハゲ!
変換後の話にしてもSQLのことを英語と呼ぶ人はいないと思いますよこのチ○ゲ!
あ、でもシンプルなサブクエリとか関数とかないSQL文ってエキサイトとかの翻訳ページで普通に翻訳できるんだよね
まあ、素人はEnglishQueryでも使ってなさいってこった。
A B C の条件のどれかが一致し、かつ条件Dを満たす
~~~~
読点打てただけマシだと思おうぜ
もっとひどいのが周りにイルヨー タスケテー
SELECTで*を使うなって言われたんだけど、何で?
>244
ちゃんと「※」を使わなきゃだめだよ。
>>219さん
ありがとう、ちょっと修正したらできました。
1列だけの、例えば name だけの場合
select name と
select *
では何か違う?
253 :
デフォルトの名無しさん:03/03/07 18:05
>>251 テーブルを調べて * が name だということを確認する手間がかかる。
>>244 使うな言った人に聞くのが良い
マジレスすれば
DBレイアウトが変わったときなんかに
影響でないようにとかだべ
>>256 そうか?
その例だと、上りの通信トラフィックが3バイト分はかかるじゃん
例が1項目だからたいしたこと無いけど
全ての項目を書いたら、結構なバイト数になる場合あるっしょ
DBレイアウトなんぞ変わったら
SELECT * はそのままでもいいかもしれんが
結局他の場所は変更しなきゃいけないのでは?
素直にSELECT name って書いておけ
>>257 マジレス。
結果が返ってくる時のトラフィックに比べれば
select文の通信トラフィックは遙かに小さい。
>>259 その通りだ
*指定でも、全項目書くのも。同じ項目数のデータ量をとるならね
前後を読んでね
>>253でに対しての確認する手間がかかる 今の性能からしたら影響薄
>>255でのレイアウト変更の影響を考えて 今の性能でも影響大
>>258参照系には影響ない(はず)
だから追加更新系だけ重点的に見れば良い
かなりの工数は減らせる
だから、SELECT nameにしておけって事だ
>>257 お前は...
1) バカみたいに項目数が多いテーブルを作っている
2) バカみたいに低速な回線を使っている
のどっちだ ?
>>261 お前は...字が読めないのか?
ちゃんと読め
どう考えても
>>253の方が正解とは思えない
それとも、バカみたいな低速な鯖使ってるのか?
だから
>>255の方が正解
トラフィックの例も今の性能からしたら大したこと無い
ただ自分は、DBにもネットワークにも負荷を抑えるように
そう心がけてるだけだけど
こんなスレがあったのか。
わざわざ遠い本屋に行って立ち読みして調べちゃったYO!
>>264 自分で調べた方が勉強になるだろ。
聞くのは最後の手段に汁
>>265 うん。
ちなみに文字列にある文字列があるものだけ抽出したいんだけど、LIKEを使えばいいんだよね??
s/文字列にある文字列がある/文字列にある文字列が含まれる/
>>266 そうだけど、LIKE使うと(特に先頭に%)遅くなるから注意な
>>268 先頭に%を使うことになるとおもう(^_^;)
%string% これだし・・・
>>262-263 問題すり替えは辞めろ
結論
select nameで指定するのが良い
レイアウト変更時の影響のことと
無駄なモノを抽出しないって考えてだな
(結果が返ってくる通信トラフィックも考えて)
>>268 じゃあ、たいした検索はできないな。
1レコードに300文字くらいの文章が入っている場合、ナマズとかに食わせてインデックスを作らせて検索した方がいいのかな。
>>262 DBMSでSQL受け取ったあと何してるのかもちゃんと考えても
>>253がわからない?
1) SQL受け取る
2) SQLをコンパイル
a) 「*」をシステム表に問い合わせて展開
b) 実行プラン作成
3) コンパイル済みSQLを実行
4) 結果を戻す
って感じだとおもうんだけど、2-a)って無駄な割りにコスト高いと思うんだけどな
まあ、馬鹿みたいに低速な回線使ってるんならせいぜい数十バイトをケチってくれって
感じなんだが。
その場合はDB直接アクセスするような設計が悪いとしか思えないけど。
>>273 2-a)ってそんなにコストが高いのか?
何度もくればキャッシュが効かなかったっけ?
ネットワークも1回のSQLが数バイトだろうと、
秒間何度もくれば、チリも積もればって事もあるし
そんな努力よかなら、ストアドなんか使えば劇的に減らせるけどね
複数のDATE型のカラムで構成されたテーブルから、
1レコードを見て、その中から最新のDATEを取得するには
どのようなSQLを書いたらいいのでしょうか?
DBはInterBaseを使っています
>>276 select max(ddd) from (
select max(date1) as ddd from table
unian all
select max(date2) as ddd from table
unian all
select max(date3) as ddd from table
)
って通るか?
>>277 unian all→union all
鬱だ
279 :
デフォルトの名無しさん:03/03/12 16:20
環境 WinNT+SQLServer7.0
view A
| DEPT(PK) | ID(PK) | POINT |
-------------------------------
| 0001 | 01 | 1 |
| 0001 | 02 | 2 |
| 0002 | 02 | 6 |
| 0002 | 03 | 7 |
| 0002 | 05 | 9 |
| 0003 | 03 | 2 |
table B
| DEPT(PK) | ID(PK) | POINT |
-------------------------------
| 0001 | 01 | 1 |
| 0001 | 04 | 1 |
| 0002 | 01 | 1 |
| 0002 | 03 | 1 |
| 0003 | 03 | 1 |
A.POINTの値を対応するB.POINTに格納したいんですが・・・
update B set POINT = (select POINT from A where A.DEPT = B.DEPT and A.ID = B.ID)
where A.DEPT = B.DEPT and A.ID = B.ID
ではダメでした。
厨房な質問ですがこの場合のSQLを教えてください。
280 :
デフォルトの名無しさん:03/03/12 16:25
>>279 DELETE FROM A;
DELETE FROM B;
COMMIT;
>>279 select POINT from A where A.DEPT = B.DEPT and A.ID = B.ID
これ複数行戻ってくるんだからだめじゃん
>>281 むしろ
DROP TABLE A;
DROP TABLE B;
FROM句を使って出来ました。
お騒がせしました。
UPDATE文にFROM句が使えるとは知りませんでしたが、
これってSQLサーバーのSQLの仕様なんでしょうか?
Oracle等でもUPDATE文にFROM句が使えるのでしょうか?
>>286 っていうか、FROMを入れるのは基本構文っしょ?
だけど、ORACLEのUPDATE時は
テーブル名が一つしか書けなかったような?
だから省略するのが一般的になってたと
(ORACLE8iまでしか知らないけど)
SQL鯖はFROM句に複数個テーブル書けちゃうんだよなぁ(意外と便利)
>>281 SQL鯖はデフォルトではトランザクションにならないっす
だからCOMMITはいらんっす
ちなみに「COMMIT TRAN」って書かなきゃダメ
>>279 >>279の路線で行くなら
UPDATE B SET POINT = (SELECT POINT FROM A WHERE A.DEPT = B.DEPT AND A.ID = B.ID)
WHERE EXISTS (SELECT * FROM A A WHERE A.DEPT = B.DEPT AND A.ID = B.ID)
ですかね。無理矢理ですが。
最終形は
UPDATE B
SET POINT = A.POINT
FROM B INNER JOIN A ON B.DEPT=A.DEPT AND B.ID=A.ID
かな?
>>274 > ネットワークも1回のSQLが数バイトだろうと、
> 秒間何度もくれば、チリも積もればって事もあるし
悪いけど、その3バイトの差がどれだけの時間の差になるか計算してから発言した方がいいぞ。
TCP/IP のヘッダ長ぐらい知ってて言ってんだよな。
>TCP/IP のヘッダ長
「TCP/IP」のヘッダ長
>286
>テーブル名が一つしか書けなかったような?
>だから省略するのが一般的になってたと
ありがとうございます。納得しました。
>288
最終的には
UPDATE B
SET POINT = A.POINT
FROM B, A WHERE B.DEPT=A.DEPT AND B.ID=A.ID
でいけました。
select count(*) from table
select count(name) from table
の違いって知ってる?
>>292 tableの項目
SEQ_NO USER_NM
だったらどーすんだ
>292
書き込みの意図が判らんよ。
質問してるんかい?
>>292 こんなことできるんだ。使い道あるんかわからんけど。
select count(distinct col1),count(distinct col2) from table
>>292さんありがとう。
似たような質問で変な方向に行ってたから
違いがわかってんのかなぁ っと思って
297 :
デフォルトの名無しさん:03/03/14 01:27
レコードの(主キーの)リストが記録されたファイルがあります。
このリストを読込んで、このリストに存在しないものを抽出するSELECT文を作る
関数を作成しているのですが、よい方法が思いつきません。
以下のような方法以外で、何か賢い方法はありませんか?
SELECT * FROM tbl1
WHERE tbl1.KeyFld NOT IN(ファイルから取得したリスト)
>>397 DBにもよるけどNOT EXISTかMINUSを使うってとこかな。
299 :
デフォルトの名無しさん:03/03/14 01:34
>244および244に回答した方
以下のようなコードを書いていると、カラムの変更があったときに
コードも変更する必要があるため、"SELECT *"は使わないように
してほしいのです。
INSERT INTO .... SELECT * ....
300 :
デフォルトの名無しさん:03/03/14 01:41
>298
ありがとうございます。
MINUS:
SELECT * FROM tbl1
MINUS
SELECT * FROM tbl1 WHERE KeyFld IN(ファイルのリスト)
ということでしょうか?
NOT EXISTSは?
SELECT * FROM tbl1
WHERE NOT EXISTS(
SELECT * FROM tbl1 tmp
WHERE tmp.KeyFld = tbl1.KeyFld
AND tmp.KeyFld IN(ファイルのリスト)
)
???
INを使わないとダメですか?
>>300 ファイルのリストちゅーのが
テンポラリのテーブルに入れられれば
SQL Serverの質問で申し訳ないです。
以下のような感じで動的SQLのフェッチをしたいのですがこのままでは
サーバー : メッセージ 170、レベル 15、状態 1、行 4
行 4: '@hoge' の近くに不正な構文があります。
のようなエラーが出てしまいます。
どのようにすれば動的SQLが可能になりますでしょうか?
declare @hoge varchar(100)
declare @val varchar(100)
set @hoge= 'select top 1 名前 from 商品マスタ'
declare wk cursor for (@hoge)
open hoge
fetch hoge into @val
close hoge
>>292 >select count(*) from table
tableの全レコード数
>select count(name) from table
nameがnullじゃ無いレコードの数
ちなみに全レコード数求めるときはこんな書き方も出来る
select count('X') from table
>302
完全に自由にしたいのならクライアント側でSQL文組み立てたほうが
良くないか?
>>299 なんでいまさら?
>>304 ほんとなんだけど、*を全カラム名に展開する必要があるかは判断してると思うけど
count(*)と単なる*は挙動が違うってことじゃないかなと
>>303を知らんかったので確定情報じゃないけど
307 :
デフォルトの名無しさん:03/03/15 17:08
>>302 Execの中にカーソル定義を全部ぶちこめばいい
Exec('declare cursor for ・・・ select ')
308 :
デフォルトの名無しさん:03/03/15 17:12
select句で終わるということではない。
Exec('declare cursor for ・・・ select ・・・')
もし女だとそのまま受け取ることが多いから一応いっとく
>>308 >女だとそのまま受け取ることが多いから
以前に、某MLで、「"Hoge.DLL"云々・・・(略)」という「例文」の文意を読み取れず、
「Googleで検索したのですが、"Hoge.DLL"が見つかりません(泣)」と投稿した女性が
いたのを思い出したよ。
>>309 ホントか ? 今検索したら、128件も見つかるんだが...。
(hage.dll なら確かに見つからないけどな。)
禿ライブラリ(・∀・)イイ!!
( ´_ゝ`)フーン
314 :
デフォルトの名無しさん:03/03/17 12:32
以下のようなテーブルがあります。
ユーザID 質問グループ 質問番号
A 1 00001
A 1 00003
A 2 00002
A 2 00003
A 3 00001
A 3 00002
A 3 00003
B(省略)
C(省略)
ユーザIDがA、かつ質問番号が00001と00003のみを保持する質問グループを取得する。
これをSQLのみで記述できるでしょうか?
この場合は1のみが結果としてかえってくればいいのですが、上手くいきません。
わかる方いらっしゃいましたら、よろしくおねがいします。
315 :
デフォルトの名無しさん:03/03/17 12:59
>>314 where だけで何とかなると思ってる
>>315 はほっとくとして、
とりあえず環境は何よ ?
ユーザID 云々は単純に条件に加えるだけだからひとまず置いて、
質問番号 1 と 3 の両方を持つ質問グループの一覧 ( → A )と、
質問番号 1 と 3 以外を持つ質問グループ一覧 ( → B) を求めて、
A から B の差分を取ればいいんじゃないの ?
Postgres なら Excep 句あたりでできそうな気がする。
317 :
デフォルトの名無しさん:03/03/17 16:26
VBスレで聞いたのですが、すれ違いなのでこちらでおうかがいします。
Set recRS = dbDB.OpenRecordset(" SELECT * FROM ifile_Converter " & _
" WHERE Hoge1 = " & strString1 & _
" AND Hoge2 = " & strString2 & _
" AND Hoge3 = 完了;", dbOpenSnapshot)
直接VBとは関係のない話になってしまうのですが、上記のCSVファイルが
構文エラーになってしまいます。なぜなのでしょうか?
(´-`).。oO(CSV?Hoge3 = 完了;?)
すいません CSVじゃなくてSQLでした。。。
Hoge3 = 完了 のように文字列で直接比較することはできないのですか?
>>319 たとえばVBなら
Hoge3 = 完了
Hoge3 = "完了"
のどっちが正しいと思うよ
ありがとうございます。
VBスレのほうで解決策を教えてもらえました。
どうもお騒がせしました。
>> 314
Select 質問グループ
From TABLE
Where ユーザID = 'A' And 質問番号 In (1, 3)
Group By 質問グループ
Having Count(Distinct 質問番号) = 2
>>322 「質問番号 In (1, 3)」で選んでるんだから
> Having Count(Distinct 質問番号) = 2
は質問番号 1 と 3 以外を持つものにも成立しないか?
つーか手元にあったAccessで試したら「演算子がない」っつーエラーになったけど、
これはAccessが腐ってるだけ?
>> 314
Select 質問グループ
From TABLE
Where ユーザID = 'A' And 質問番号 Not In (1, 3)
Group By 質問グループ
Having Count(Distinct 質問番号) = 0
>>324 ユーザID 質問グループ 質問番号
A 4 00002
A 5 00001
A 6 00003
全部引っかかるぞ。
問題文をちゃんと読め。
>>316 すみません。環境記述しわすれました。Oracle9iです。
>A から B の差分を取ればいいんじゃないの ?
>Postgres なら Excep 句あたりでできそうな気がする。
このあたりで調査してみます。ありがとうございます。
>>322、324
だとうまくいかなそうです、、すこし付加すればできるのかもしれないですが、、
#というか正直テーブル構成がくさってるのが問題、、
>>314 ユーザーを絞る部分は端折るとして、これでどう?
サブクエリがNGならtemp table使って。
select 質問グループ
from
(select 質問グループ from table 質問番号 = 1) a
inner join (select 質問グループ from table 質問番号 = 3) b
on a.質問グループ = b.質問グループ
left join (select distinct 質問グループ from table 質問番号 not in (1,3)) c
on a.質問グループ = c.質問グループ
where
c is null
> (select distinct 質問グループ from table 質問番号 not in (1,3))
where抜けてた
(select distinct 質問グループ from table where 質問番号 not in (1,3))
単純に、これでダメ?
SELECT distinct 質問グループ
FROM TABLE
WHERE ユーザID = 'A' AND 質問番号 IN (1, 3)
>>329 質問番号が2のがあったら弾きたいんだから、ダメじゃん?
>>327 を、、なんかできそげ?
正確な検証は午後になってしまうかも。うまくいったら報告します。
SQLServerのストアドでUPDATE文発行で更新できた件数を取得したいのですが
どのようにすればよいでしょうか?
OracleのSQLCA.SQLCODEみたいなヤツが欲しいです。
すいません、SQLserverの質問ですが
AとBというテーブルがあって、AにBをLEFT JOINして結合できなかったデータを抽出するというのはいったいどのように書けばいいんでしょうか?
そもそもそんなことってできるんでしょうか…
>>333 何がしたいのかよくわからんけど出来ると思うよ。
>> 314
Select 質問グループ
From TABLE
Where ユーザID = 'A' And 質問番号 In (1, 3)
Group By 質問グループ
Having Count(Distinct 質問番号) = 2
これでうまくいったけど?
>>335 Select 質問グループ
From TABLE
Where ユーザID = 'A' And 質問番号 In (1, 3)
Group By 質問グループ
Having Count(Distinct 質問番号) = 2
これでうまくいかなかったけど?
>>327 すこしなおしましたができました!
ありがとうございました。
>>335 レコードが選択されませんでした。、、、
>>337 今さらですが別解です。
SELECT DISTINCT 質問グループ
FROM TABLE A1
WHERE
A1.ユーザID = 'A'
AND 質問グループ IN
(
SELECT 質問グループ
FROM TABLE A2
WHERE 質問番号 IN (1, 3)
AND A1.ユーザID = A2.ユーザID AND A1.質問グループ = A2.質問グループ
GROUP BY 質問グループ
HAVING COUNT(*) = 2
)
AND 質問グループ NOT IN
(
SELECT 質問グループ
FROM TABLE A3
WHERE 質問番号 NOT IN (1, 3)
AND A1.ユーザID = A3.ユーザID AND A1.質問グループ = A3.質問グループ
GROUP BY 質問グループ
)
>>332 select @@reccont
だったと思った?
@@なんとかってのを調べてみて
SQLサーバーのことで聞きたいんですけど、レコード追加のためにストアドプロシージャー
をつくったんです。パラーメーターが複数あるのでVariant型の配列に入れてVB側でCommand
文でストアドプロシージャーを呼んでいます。しかし、”textからintには変換できません”
などとエラーが出ます。”smalldateやnvarcharには変換できません”などのエラーも出ます。
パラメーターをint型の項目一つにしたときは、普通に登録できたのですがエラーの理由がわかりません。
何か心当たりのあるかたいますか?
>342
SQLつーよりはVB側の問題だと思うぞ。
で、VB側は何使ってる?
ADOなら
Dim oCmd as New ADODB.Command
with oCmd
.ActiveConnection = (どっかで開いたコネクション)
.commandType = adStoredProc
.commandText = "ストアド名"
.Parameters.Append .CreateParameter(Name:="hoge", Type:=adInteger, Direction:=adParamReturnValue)
.Parameters.Append .CreateParameter(Name:="arg1, Type:=advarchar, Direction:=adParamInput, size:=255, value:=sArg1)
....
.Execute
If .Parameters("hoge") = ... then ....
とかするけど。てきとーに書いたんで間違ってたらスマン。
>562
とりあえずマルチやめろよ。
>562
>342あての間違い。
346 :
デフォルトの名無しさん:03/03/24 19:39
以下のようなテーブル1とテーブル2があった時に
テーブル1(名前,教科,得点)
鈴木,国語,80
鈴木,数学,90
鈴木,英語,70
田中,国語,70
田中,数学,65
田中,英語,95
・・・
テーブル2(名前,クラス)
鈴木,301
田中,302
・・・
347 :
デフォルトの名無しさん:03/03/24 19:42
このようなことをしたいのですが
「b.クラス」をSELECTしようとするとエラーがでます。
このようなGROUP化の制限がいまいち理解できないのですが、
対策方法はどのようにすればいいんでしょうか?
SELECT a.名前,b.クラス,Sum(a.得点)
FROM テーブル1 AS a
INNER JOIN テーブル2 AS b
ON a.名前=b.名前
GROUP BY a.名前
ORDER BY Sum(得点)
分かりにくく書いてすいません。
346=347です。
自己レスです。
意味の無いMax関数を使って回避してみたんですが、
これって余計な不可がかかるんじゃないかと思うんですがどうでしょう?
他によい方法ありませんかねぇ。
SELECT a.名前,Max(b.クラス),Sum(a.得点)
FROM テーブル1 AS a
INNER JOIN テーブル2 AS b
ON a.名前=b.名前
GROUP BY a.名前
ORDER BY Sum(得点)
350 :
デフォルトの名無しさん:03/03/24 20:45
>>346 SELECT a.名前,b.クラス,Sum(a.得点)
FROM テーブル1 AS a
INNER JOIN テーブル2 AS b
ON a.名前=b.名前
GROUP BY a.名前,b.クラス
ORDER BY Sum(得点)
>>350 なるほど、勉強になります。
ありがとうございました。
352 :
デフォルトの名無しさん:03/03/25 21:49
TO_CHARで左寄せにするにはどうすればいいでしょうか?
INSERT INTO TESTTBL VALUES(0,TO_CHAR(1,'99'));
TEXT列はCHAR(4)です。
ID TEXT
0 1
と入るのですが、TEXTフィールドの「1」の前にスペースが入り
正確には「____1」 (_はスペース)みたいに
右寄せになってしまいます。
これを「1___」としたいのです。
よろしくお願いします。
353 :
デフォルトの名無しさん:03/03/25 22:38
SQLは排他制御はどうなっているんでしょうか?
updateやdelete,insertが同時に起きても大丈夫なんですか?
>354
ありがとうございます。
スペースを省く、という解釈より
左寄せ、
という解釈が頭にたってしまい全く思いつきませんでした。
「そうか!!なるほど!」
といった心境です。
ありがとうございました。
356 :
デフォルトの名無しさん:03/03/26 11:35
例えば test.db に time という項目名があり、 timeは整数型で
10時20分30秒なら 102030 と値が入っているとします。
これを1時間ごとにまとめたい場合はどうすれば良いでしょうか?
select code, time, sum(goukei) from test.db
group by code, time
だと1秒ごとになります。
これを1時間(60分)ごとにまとめる事は可能ですか?
>>356 とりあえずイカサマ的方法。
select code, time/10000, sum(goukei) from test.db
group by code, time/10000
>>357 ありがとうございます。
でもDelphiのTQueryでは使えないようです。
(デルファイで使うという一文を入れるのを忘れていました、すいません)
>>358 それはきっと使っているDBによるのだと思うでし
(DelphiのTQueryは単にDBに対してクエリを発行するだけかと)
Oracle、SQL-Server、InterBase(Firebird)
といった本格的なものではなく
Access、Paradox
といったデスクトップDBだといろいろ制約があるかも知れないでし
>>358 select JIKAN, sum(goukei) from
(select time/10000 AS JIKAN, * from test.db)
group by code, JIKAN
こんなんもダメ?
361 :
デフォルトの名無しさん:03/03/26 13:10
SQLってDB間でちょっとずつ違う仕様になってますが、
ユーザー定義関数を使えるなどのシステムがあれば
その差も多少埋まると思うのですがどうですかね?
レスありがとうございます。
>>359 Paradox なので無理なのかも・・
>>360 ダメでした。
2行目のselectで「キーワードの使用が無効です」とエラーになりました(T^T)
今調べてたんですけど、もしかしてストアドプロシージャっていうのが
SQLのユーザー定義関数のことなんでしょうか?
>>362 FirebirdならVIEWを使ってできたよ
どうしてもアプリ側のコードでやりたくないのなら
Firebirdへ乗り換えるのも手かと、無料だし→ググれば見つかる
(ただしTTableの代わりに使うのはTIBTableではなくTIBDataSet)
>>364 情報ありがとうございます。
上司に「コードで組め」と言われてしまったので、
(Paradoxじゃないとダメみたいです)
今回は無理ですが、自作アプリなどで使ってみます。
失礼しました。
2つめのselect文の所をストアドにしてみてください
>今調べてたんですけど、もしかしてストアドプロシージャっていうのが
>SQLのユーザー定義関数のことなんでしょうか?
違います
>353
SQLは言語。
排他うんぬんはSQLの仕事ではなくDBMSの仕事。
つか、ヘルプ嫁。
>368
手取り足取り説明して欲しいのか?
>369
説明してほしいのは>368じゃないだろ。
>367
>353の質問を
「SQL実行時の排他制御はどうなっているんでしょうか?」
と読みかえれないやつは低脳。
だから、読み替えて手取り足取り説明してほしいのかと。
>>371 おまえが
>>367かどうかは知らんが
>>367は読み替えを一切行っていない。
その証拠に答えが「SQLは言語。」
手取り足取り説明云々の次のステップにつては俺は一切言及していない。
なんか変な答えかたしたかも。
つまり
>>367は読み替えることを*あえて*せず、*わざと*揚げ足を取り、
>>353にとっては何の助けにもならない回答を*ねらって*した、ということか。
それなら俺がわるかった。
>>372を撤回する。
>>363 >今調べてたんですけど、もしかしてストアドプロシージャっていうのが
>SQLのユーザー定義関数のことなんでしょうか?
ユーザー定義関数とストアドプロシージャは異なるものだよ。
ユーザー定義関数は、組込み関数と同じ文脈で使用することができる。
SQL Server 2000 のユーザー定義関数はスカラー値だけじゃなく、
テーブルを戻り値とすることもできるので、かなり便利だよ。
それと、SQL-99 で定義された WITH を使うと、
醜いサブクエリの多重ネストを解消できたりするよ。
375 :
デフォルトの名無しさん:03/03/26 21:46
SQLやストアド・プロシージャの構文を統一しようという動きは当然ある。
SQL99ではPSMとしてストアドの標準化にも踏み出したし、これからSQLはベンダ間の移植性が高くなることを期待できる名じゃないかな。
排他制御に関しては、
楽観的ロック
悲観的ロック
時刻印方式
For Update
などの単語をぐぐれ。そうすれば間違いなく見つかる。
望んだ結果が出ずに困っています。
@のデータを出す作業(B=3)
Aのデータを出す作業(A=1,B=3)
上の2つは上手く抽出できたのですが、
@とAの合算データを出す作業
が難航しています。
SQL = "SELECT * FROM TBL WHERE(((TBL.B)='3' ) AND ((TBL.C)='01') OR ((TBL.A)='1' ) AND ((TBL.A)='3')) AND ((TBL.C)='01')"
>>376 SQLのトランザクションの中で足し算処理する価値ってどのくらいあるとお考えか
>377
プログラムの構造上、SQLの合算抽出しか方法が見当たりませんでした。
本来なら@のデータをBのテーブルへ、
AのデータをBのテーブルへ吐き出せば良いのですが
いろいろな都合上それも難しく…
>>376 レコードつらつら出して最後に合計行がほしいってことか?
WITH ROLLUPなんてどうよ?
SQLServerだけど。
>>380 select a,b,kingaku from tbl
union all
select null as a,null as b,max(kingaku) as kingaku from tbl
こんな雰囲気のことやってみ。
>>381 解決しました。
ありがとうございます。
383 :
デフォルトの名無しさん:03/03/27 16:17
Access2000でストアドプロシージャやユーザー定義関数って使える?
>>383 ストアドは使えるみたい(使ったことないけど)
385 :
デフォルトの名無しさん:03/03/27 16:24
386 :
デフォルトの名無しさん:03/03/27 21:46
Accessにストアドあるんだ・・・
でもユーザ層から言ってストアド組む人間少なそうだな。そういうプログラムを組みたくないユーザのためのツールがAccessなんだし
387 :
デフォルトの名無しさん:03/03/27 22:40
SQLSeverのストアドって関係を戻り値にできるって聞いたんだけど、その関係が何万行もあったりしても大丈夫なの?
おれオラクルしか使ったことないんで、そういうことできるなら便利だなあ。PL/SQLってそういうことできんよね?
388 :
デフォルトの名無しさん:03/03/28 01:18
SQLServerですが、階層問い合せをする方法ってないのでしょうか?
例えばカラムがID(pk)、階層、情報、親ID(fk)で、
自己参照型のテーブルになっています。
オラクルなら簡単にできるのですが、
SQLServerはストアド・tempdbを使わないと無理なのでしょうか?
>387
関係? 結果セット?
SQL Serverからは戻せるけど、それをVBで扱うときってどうする?
390 :
デフォルトの名無しさん:03/03/28 21:53
>389
そう。関係ってのは結果セットのこと。
>SQL Serverからは戻せるけど、それをVBで扱うときってどうする?
埋め込みのときと同じようにoo4oのダイナセットに格納するとかはダメなの?
>388
烈しく関心あり、LinuxでPostgreSQLやっているんだけど
PostgreSQLでも階層てきなテーブルとか特定のテーブルを
グループ化はできないのでしょうか?
392 :
デフォルトの名無しさん:03/03/30 23:54
Access2000なんですが、
教師マスタ
TeacherID TeacherName
----------------------
1 山田
2 佐藤
…
10 田中
クラスマスタ
ClassID TeacherID
-------------------
1 1
2 3
3 1
4 2
で、各教師の名前と受け持つクラス数を得たいんですが、
SELECT 教師マスタ.TeacherID,TeacherName,Count(クラスマスタ.ClassID) AS ClassCount
FROM 教師マスタ,クラスマスタ
WHERE 教師マスタ.TeacherID = クラスマスタ.TeacherID
GROUP BY 教師マスタ.TeacherID
では「集計関数の一部として指定された式'TeacherName'を含んでいないクエリ式を実行しようとしました」
とエラーが出て、動きませんでした。
GROUP BY にTeacherNameも含めてやると動くのですが、
フィールドが多くなると全部加えるのは大変になってきます。
もっとスマートにしたいんですが…
393 :
デフォルトの名無しさん:03/03/31 00:26
select a.TeacherID,a.TeacherName,Count(a.TeacherID)
from 教師マスタ as a inner join クラスマスタ as b on
a.TeacherID = b.TeacherID
group by a.TeacherID,a.TeacherName
これで動くはず。試してないのでわからんが。
>フィールドが多くなると全部加えるのは大変になってきます。
>もっとスマートにしたいんですが…
集計関数はそんなもの。がまん汁。
394 :
デフォルトの名無しさん:03/03/31 01:45
>>393 >集計関数はそんなもの。がまん汁。
そうですか…
では、シコシコと頑張ります。
ありがとうございました。
>>392 First(TeacherName)ってのはどうよ
397 :
デフォルトの名無しさん :03/04/02 20:55
質問です。
以下のようなフィールドが等しいテーブルがあるとして
tableBが更新用マスタとします。このときtableBをtableA
へ更新してtableCに書き出すにはどうすればよいですか?
ADO使って突合すればできるんですけど、SQLで一発で出来ないかと思いまして。
よろしくご指導下さい。
tableA:
------------------------------
key f1 f2 f3
------------------------------
100 10 20 30
------------------------------
101 12 22 32
------------------------------
102 13 23 33
------------------------------
tablaB:
key f1 f2 f3
------------------------------
100 20 40 60
------------------------------
101 11 21 31
------------------------------
UpdateしてInsertすれ
>>398 >UpdateしてInsertすれ
わたくし、SELECTしか使ったこと無いので今から調べてみます。
構文エラーで怒られました。何処がだめなのでしょう。
UPDATE A SET A.* = B.* WHERE A.KEY = B.KEY;
>>400 いっこいっこせっとしんといかんのとちがうか
>>401 えー、そんなー。
それじゃRecordset使ったが早いよねえ。
>>402 いやA.* = B.*ではなくA.ID = B.ID,A.NAME = B.NAMEみたいにしるということで
今からやってみます。
UPDATE A SET A.f1 = B.f1,A.f2 = B.f2,A.f3 = B.f3 WHERE A.KEY = B.KEY;
これでACCESSで試すと、
「パラメータの入力」ダイアログが表示されて、
「B.f1」と聞いてきます。ダイアログにはテキストボックスがあります。
406 :
bloom:03/04/02 21:45
中継はせんでええから、まずSQL入門書を買ってきて穴があくまで読みなさい。
ACCESSは糞なのでSQL Serverを使って以下のクエリーでうまくいきました。
お騒がせしました。
UPDATE A
SET f1 = B.f1, f2 = B.f2, f3 = B.f3
FROM A, B
WHERE (A.key = B.key)
久々にオモシロイ検索方法のSQLを書いた。
教えて!じゃないから暇なヤツは頭の体操の
つもりでやってみそ。
漏れの書いたSQLはちょっとくどく
なっちゃったけどね。
インラインビューを使えないDBMSは普通のVIEWを
使用しても可とする。
(当たり前だけどカーソルは不可)
***
>>412のお題 ***
各組織の会議用資料提出状況を調べたい。
<会議>
会議番号(PK)---会議名
1---------------部長会議
2---------------役員会議
<組織>
組織コード(PK)---組織名
A----------------管理部
B----------------営業部
C----------------購買部
<会議資料> (これは資料のヘッダー情報)
会議番号(PK)--組織コード(PK)--提出日付
1-------------A---------------2003/04/05
1-------------B---------------null(nullは作成中)
>>413の出力結果
会議番号--組織コード--提出状況--提出日付
1---------A-----------提出済----2003/04/05
1---------B-----------未提出----null
1---------C-----------未提出----null
2---------A-----------未提出----null
2---------B-----------未提出----null
2---------C-----------未提出----null
>>414 <会議>と<組織>をクロスジョインさせてそれをひとつのテーブルと見立てて
それと<会議資料>を外部ジョインさせる。
提出状況に関してはCASE 〜 WHEN 〜(SQLServerの場合)。
未検証だがたぶん出来る。
レベル的には中の中。
>漏れの書いたSQLはちょっとくどく
>なっちゃったけどね。
どーやったらくどくなるの?
416 :
デフォルトの名無しさん:03/04/04 10:31
>>412 >>415 こんなかんじか?
SELECT
会議組織.会議番号,
会議組織.組織コード,
CASE
WHEN 提出日付 IS NULL THEN '未提出'
ELSE '提出済'
END AS 提出状況,
提出日付
FROM
(
SELECT * FROM 会議
CROSS JOIN 組織
)会議組織
LEFT OUTER JOIN 会議資料
ON 会議組織.会議番号 = 会議資料.会議番号 AND 会議組織.組織コード = 会議資料.組織コード
ORDER BY
会議組織.会議番号,
会議組織.組織コード
>>416 >SELECT * FROM 会議
>CROSS JOIN 組織
は
SELECT 会議.会議番号, 組織.組織コード FROM 会議
CROSS JOIN 組織
がよい
SELECT 会議.会議番号, 組織.組織コード FROM 会議, 組織
でもよい
418 :
デフォルトの名無しさん:03/04/04 17:44
SQLのWHERE句でPerl並みの正規表現が使えるような裏技って
ないですかねー
SQLのLIKEって正規表現としてはちょっと貧弱すぎませんか?
ユーザー定義関数か何かで対応するしかないですかね。
>>420 >SQLのLIKEって正規表現としてはちょっと貧弱すぎませんか?
(;´Д`)
>>422 正規表現じゃないだろ。単なるワイルドカード。
現場からは串の関係でカキコできなくて
遅レススマソ。
そう、クロスジョインがこのお題のキー
(でもレベルが中の中で悪かったな)
くどくなったというのは、Sybaseの11.0.5なので
caseがつかえなくてUNIONで提出済結果セットと
未提出結果セットをドッキング
しなければならなかった為。
>>423 Transact SQLではワイルドカード%だけでもない
完璧ではないが、正規表現の一部も使える。
like "[a-A][0-9]"
なんて言うのも使用できる。
>>424 >(でもレベルが中の中で悪かったな)
妥当だと思うが...。
> Transact SQLではワイルドカード%だけでもない
PostgresSQL, mSQL 等でもその手の拡張はされている。
>>420 に限らないけど、なんで自分の環境を書かないのか...。
>>425 じゃあ、オマエ何かオモシロイ
例題だしてみろよ。
>>426 なにこいつ ? 指摘されて、キレてんの ?
428 :
名無しさん@Emacs:03/04/05 19:22
postgresのlimitってoracleでないの?
>>427 おい、今見たけどおれは!426だぞ。
でも、おまえの上レベルていうやつを
見てみたいな。
432 :
デフォルトの名無しさん:03/04/05 23:28
>>427 (プッ
コイツこそ煽られて、
そんな返ししかできない口先だけのやつ。
他人のレベルを評価、指摘できる
レベルなら、早く上級者の問題出してみろよ。
おれは、別に上級者でもないから
レベルの高いのは出せないけどな。
(そもそもなにが高いとか低いとか分からん。)
>>424 せっかく加勢してやったのに。
煽るなよな。
チェックする暇があるなら、
早く問題出せよ。
どうせ、コイツも評価されるのが
嫌なんだろ。
出せないなら、エラソーに
評価すんな、アフォ。
>>434 ププッ、またまたでてきたよ。
そんなに悔しかったのか ?
そんな返しはどうでもいい
早くも・ん・だ・い
だしておくれ。
>>436 なんか必死やねぇ。
出したって、どうせ難癖つけるだけだろ ?
あっ、「そもそもなにが高いとか低いとか分からん。」だったんだよね。ぷぷっ。
>出したって、どうせ難癖つけるだけだろ ?
そんなことはしましぇん。
出たら考えるよ。
別にさ、こういうことでSQL上達して
パクリだろうと、ユーザに満足してもらえれば
いいと思ってるだけだからさ。
そうだよ、オレは高低は分からないよ。
(だが、少なくともオレが解けなければ、
オレにとってはレベルが高いわな)
質のいちゃもんは他の上級者に任せるよ。
>>438 > そんなことはしましぇん。
ホントかよ。
> そんな返ししかできない口先だけのやつ。
と威勢のいいこと言ってたのはどうしたんだ ?
まあ、荒れる元になるから、今日はもう寝るよ。
はやくぅ〜
上級者なら(経験豊富なら今までのヤツで)
サクッと作れるんだろ。
もう寝るから次の機会によろしく。
しかし、最初、落ち着いた返しをしていた
ヤツがこうも乱れるとは、
変なプライドとはホントいやだね。
とカキコしたら、同時に書いてたのね。
なんだ、結局出さないのか。
やっぱ、口先だけか...
煽って本当に問題出すのを期待してたのに。
残念だバイバイ。
DBシステム系のプログラム
特にSQLはレベルなんて存在しない。
経験値の大小のみだ。
>>440-441 そんなに悔しかったのか ? それとも、ただの粘着 ?
> しかし、最初、落ち着いた返しをしていた
> ヤツがこうも乱れるとは、
> 変なプライドとはホントいやだね。
ププッ、自分のことですか ?
> 煽って本当に問題出すのを期待してたのに。
まあ、やっぱり煽りだったことが判明したわけだな。
444 :
デフォルトの名無しさん:03/04/06 10:27
春うららか
443も粘着だな
>>443 なんだ、なんだ、朝っぱらから
起きたとたんチェックしてたのか...
(なんか書いてるとはオモータけど。)
オレは何言われてもいいから早く問題出せよ、
ププや必死ダナとしか書けない上級者さん。
前言撤回して、公正な評価してやるからさ。
447 :
デフォルトの名無しさん:03/04/07 04:29
SQLで、テーブルのカラム名を変えたいんですが
できますか?教えてください
450 :
デフォルトの名無しさん:03/04/07 10:17
>447
単に取得するときに変えるのなら、
select fld1 as hoge, fld2, .fld3 from table1 ....
だけど、テーブルの構造を変えるんだったら、ちょっと難しいのかも。
識者の説明きぼんヌ。dropせずに変えられるんだっけ?
>>449 その返しは「下の上」を「上の下」に変えることで
面白さのレベルが「下の中」から「下の下」に下がった。
下、下、下下下の下〜
俺やん
453 :
デフォルトの名無しさん:03/04/07 12:49
>>450 本当にカラム名変えるなら、
alter table (文)をぐぐったり、マニュアル見れ。
だが、マジレスだがカラム名変更
(やスキーマ変更)は既存のシステムなら
多大な影響を与えるから注意しないといけない。
448-449みたいに(前のと同一人物だろ)
口だけくんに下の下と言われてしまうぞ(ワラ
つまらんことカキコする暇があれば早く問題だせよ下の下のモゲラ。
仕事もしろよエセ関西人。
私は、げのちゅうです。
どうしたら上天丼になれますか。
貴様ら教えてください。
この度は私の「中の中」という表現のため皆様を振り回してしまい、申し訳ありませんでした。
てゆーか釣りだったんだけどね。
>>424 >(でもレベルが中の中で悪かったな)
悪くないですよ。頭の体操にはなりました。
ところでSybaseってcaseみたいなやつできないの?
昔Anywhereでif 〜 else 〜 でやった記憶あるけど。
>>451 ゴメン。素で間違えてた。逝ってくる(´Д⊂
>453
俺は448-449じゃねーぞ。
で、dropせずにできるわけ? できないわけ? 教えてくんろ。
lt;3gt;
>>458 マジで聞いてるんなら、DBMS ぐらい書けよ。
PostgresSQL のマニュアル見る限りでは、SQL92 で
alter TABLE rename column OLD_NAME to NEW_NAME;
とできるらしい。
>460
スマソ。
SQLのスレでの発言だから
てっきり機種依存しない方法があるのかとおもたよ。
>>458,461
言い訳並べる暇があったらまずぐぐりやがれこのハゲ!
おまえが
>>448だろうが
>>449だろうがそんなこたぁどーだっていいわけよ。
それより
>>453の
>本当にカラム名変えるなら、
>alter table (文)をぐぐったり、マニュアル見れ。
は完全に無視か?
いいか?まずぐぐれ。機種依存云々はそのあとじゃ!
お前みたいな奴のかあちゃんは出べそじゃ!
464 :
デフォルトの名無しさん:03/04/07 18:18
ストアドプロシージャでUpdate等をする時に、DBの型はint のところを文字型で入力し
た場合のエラー処理をしたく、以下のif文を用いたのですが、処理が中断してしまいま
す。SPの本にも処理をするに至らないエラーもあると記してあったのですが、これが
そうなのでしょうか。
どなたがご存知の方教えてください。
if @@Error <> 0 Goto CatchError
以下の方法で明示的にエラーを流してみましたらうまく処理ができました。
RAISERROR (50001,1,1)
>>460 てめぇふざけんなよ。何で答えてんだよ。
>本当にカラム名変えるなら、
>alter table (文)をぐぐったり、マニュアル見れ。
って言われても無視してるんだから放置だろうが。
そういうことしてるからバカが増殖すんじゃねぇか。
甘やかし過ぎるのはやめろ。
466 :
デフォルトの名無しさん:03/04/07 19:54
translate使えば正規表現のキャラクタクラスぽい事ができるよね。
あいまい検索もできたりする。
なんか、すごいことになってたんだね。
ちなみに折れは431以降登場してないよ。
(
>>424で言ったように昼間はカキコできないし)
>>456(415)
こっちも2ちゃん的に返しただけで、
意味は無いし、こんな風になるとは
思わなんだ。こっちこそゴメソね。
折れの言葉の方がトリガーとなってしまったと思う。
オレの環境のSybaseではASE(Adaptive Server)
の方だから11.9.2以降(だったと思う)なら
case文が使えるけど、それより前の
バージョンは使えません。うちのASEも12にUpする
みたいだけどね。
>>464 >DBの型はint のところを文字型で入力し
>た場合のエラー処理をしたく
状況が良く読めないのだけど、
SP実行以前にSP実装時にコンパイルエラー
にならない?
>>469 返答ありがとうございます
Updateで説明すると以下の様になります
ここで、Kingaku は int型です
Update Koujihi
Set Kingaku = "nichan"
・
・
if @Error <> Goto catchError
SP実装時とはいったいどの時なのか、よくわからないです。
今手元に資料がないので、明日本で調べて見ます
実装時とは
create procedure
実行時のことだけど。
簡単にいうと、コンパイルエラーで
SPを作ることができないということ。
動的SQLでも使ってるの?
早いですね、ありがとうございます
あっ実装時とはそのことなんですか、それは大丈夫でした。
SP実行時にエラーがおきます。
エラー内容も今伝えることができればいいのですが、違う場所にしかないです。
エラーのレベルが 16 ということしか思い出せないです
それから環境ですが、SQL Server 2000で作成しています。
>>472 ごめん、コンパイルエラー起きないみたいだね。
isnumericは使えないかな。
>463
特定のDBMSに依存しない方法があるなら知りたかったんだが。
>>474 そしたら、最初からそう書けば良いじゃん
OracleやSQL Serverのスレじゃないわけだろ? だったら言わなきゃ
DBMSを特定しないことになるんかと思い込んだ訳だわ。
まぁ、漏れの思い込みだったわけだが。
手元のSQL Server7のヘルプ見る限りではそういうのは無かったし、
Oracleは詳しくないけど、そういうのは無かったような気がする。
でもひょっとして漏れの知らないことを知ってる凄い香具師がいるかもしれん。
後学のためにちょっと質問してみよう。
ということなんだが。
>>477 > OracleやSQL Serverのスレじゃないわけだろ? だったら言わなきゃ
> DBMSを特定しないことになるんかと思い込んだ訳だわ。
俺の、「SQL92 で」と言う言葉は、全く無視したと言うことだな。
すまん、名前間違えた。
>>460 に書いた「SQL92 で」だったわ。
>>478 >俺の、「SQL92 で」と言う言葉は、全く無視したと言うことだな。
俺が思うにこいつ(
>>477)は悪意を持って無視しているわけでなく、
大事な情報に限って見事に取りこぼす単に使えない奴だとおもわれ。
これ以上ひどいとネタ認定でよろしいかと。
さんざん苦しい正当化しといて最後に「釣れた(w」とか言い出しそう。
濡れた(w
DDLはDBMSにより、方言のあるコマンドが多い。
SQL鯖(T-SQL)ならSQL文ではなく、
SPに実装されている。
sp_rename "table.old_column_name", "new_column_name"
Oracle、Postgresは上記の通り。
まぁ、ここのスレは基本的にマターリ進行だったから、
広い目でみようや。
漏れた(w
のほうがピッタンコ。
>482
OracleとSQL鯖のコマンド比較みたいなの無いですかね?
俺どっちも中途半端にしか使ってないんで、「Oracleではこうだけど
SQL鯖では?」とかを調べるのに時間かかってしまう・・・
>483
技術評論社 「SQLポケットリファレンス」
ISBN4-7741-0907-X
\1980+税
細かいことは書いとらんが、参考になると思う。
ウス。読んでみます!
486 :
デフォルトの名無しさん:03/04/16 00:31
tblMember
メンバID 名前
-------------------
1 山田
2 佐藤
3 山下
4 上田
tbl組
組ID メンバID
-----------------
1 1
2 2
2 1
3 1
3 3
4 3
といった感じに2つのテーブルがあります。
各メンバーは2つ以上のグループに属する場合があります。
「1,2,3いずれかのグループに属するメンバー」を得るのは
select tblmember.名前 from tblmember,tbl組
where tblmember.メンバID=tbl組.メンバID and 組ID in (1,2,3)
でいけたのですが、「1,2,3全てに属するメンバー」は
どうやれば得ることができるでしょうか。
上げときます
>>486 tbl組マスタ
組ID(PK)
1
2
3
なるテーブルはもちろん存在するよね。
(なければインラインビューで対応する。)
また、tbl組は組ID,メンバIDでもちろんユニークだよね。
(でなければこれもインラインビューを作る。)
SELECT DISTINCT Tc.メンバID,Tm.名前
FROM tbl組 AS Tc, tblMember Tm
WHERE Tc.メンバID in (
SELECT メンバID
FROM tbl組
GROUP BY メンバID
HAVING count(*) = (SELECT count(*) FROM tbl組マスタ)
)
AND
Tc.メンバID = Tm.メンバID;
サブクエリ使えるDBMSなら依存はしないはず。
(^^)
請求書などの固定行数のレポートを出力したいんだけどさ。
(固定行数とは、お買い上げ明細が 5行しかなくても ページを空罫線で 30行分埋めるとかね。)
レポートツールでループ処理を書くのがいやなので、
データベースから取得する結果セット自体に空データをつめて
30行とか 60行、90行…にしたいんだけど、そんなことってできる?
>>490 お買い上げ明細テーブルのレイアウトは?
そのテーブルのキーと行の結びつけが出来れば
ワークテーブル作って出来ないことは無い(かも)。
でもループ処理の方があんたにとっては簡単。
492 :
デフォルトの名無しさん:03/04/18 00:06
>490
やったことあるので可能。
困っています。
使用されていない最小のIDを得たいのですが、
AccessのSQLがよくわかりません。
これをAccessで同じ動きにさせるには
どうしたらいいでしょうか?
SELECT MIN(ID) FROM
(
SELECT ID+1 ID FROM TABLE_NAME
MINUS
SELECT ID+0 ID FROM TABLE_NAME
)
よろしくお願いいたします。。
>>492 oracleのMINUSに変わる処理を作れば可能
おまえも意地悪な答えしてるから
これ以上は書かないYO
>>490 30行の専用紙2ページにわたって45行の明細を出力するケースもあるよね。
となるとSQLだけでグループ内連番の処理をして+αてことか。
やってできなくもないけど笑っちゃうくらいトリッキーなコードになるよ。
>>490 明細の項目がどのくらい、あるか解らないけど
30明細分を1レコードにするって手も無くはない
まぁループ処理でやるのが
バグや仕様変更に柔軟に対応できるとは思うっすけど
ありがとう。
固定行数表示は、ワークテーブルを使って対応することにしました。
ストアドでループを書いて、ワークテーブルに不足分の空レコードを
挿入していくようにしたら、できました。
∧_∧
( ^^ )< ぬるぽ(^^)
499 :
デフォルトの名無しさん:03/04/22 16:38
DTSのパッケージログについてご教授いただけますでしょうか。
(1)ASPサーバーとSQLサーバーの2台を使用
(2)ASPサーバーからの処理でSQLサーバーのDTSを実行する
(3)そのDTSのパッケージログをSQLサーバーの配下に書き出す。
ということなのですが、どうしてもASPサーバーからの処理実行に関してだけパッケージログが書き出されません。
SQLサーバーにてDTSのパッケージの実行すると正常にログが書き出されるのですが。。。
ご存知の方、いらっしゃいましたらお教え願えますでしょうか?
よろしくお願いいたします。
>494
それはわかってます。
キーワードだけでも教えてもらえないでしょうか?
イジワルというより、もう既に答えがでてたので
>無い(かも)。
経験上、「できる」とそえさせてもらっただけなのです。
>>500 無理にSQLで書かないでAccessVBA使えば?
>501
それを言われてしまうと元も子もないのですが、
そうなると、とりあえずSELECTでIDをとってきて、
ループして空き番を探すという処理になってしまい、
クライアント側に負担がかかると思うので、
できれば避けたい、と思い、
できればSQLで書きたいと思って悩んでいます。。
>>502 JETを使ってるわけじゃなくて別のServerに繋ぎに行ってるの?
だったらパススルークエリにすればServer側の機能を好きに使えるよ。
繋ぎに行った先もMDBじゃどうしようもないが。
>503
別PCへつなぎにいってます。
別PCのMDBへ、ですが(涙
なんとかなりませんでしょうか。。
>>500 はいな、これで思い通りになってるっしょ?
ようは、抜けのある連番の最小値を求めたいと。
ちがってらすまそね。
キーワードはNOT INかNOT EXSIST
SELECT MIN(ID)
FROM
(SELECT ID_NUM+1 AS ID FROM TAB_1
where ID_NUM+1 NOT IN (SELECT ID_NUM FROM TAB_1)
)
パフォーマンス悪くても許して頂戴。
Access2002で検証済み
>>499 DTSのことはあまり良く知らないんだけど、
ASPがSQL側にアクセスするときのアカウントは大丈夫?
書き込み権限を持ってないとかはない?
なんでこうもDBに連番処理を
させようとする輩が多いのがワカラン
508 :
デフォルトの名無しさん:03/04/23 11:18
>506
499です。
お返事ありがとうございます。
もう少し詳しくご説明しますと、
・SQLは、2000です。
・DTSの処理は正常に実行され戻り値も得ているが、DTSのパッケージログだけが書き出せない。
・ログを書き出すフォルダには、書込み権限を一応つけています。
こんな状態が1週間以上続いています。
どうか宜しくお願い致します。
509 :
デフォルトの名無しさん:03/04/23 18:02
age
>>508 はずしてるかも知れんけど呼び出し側のASPサーバ側にログはかれてない?
DTS内部で持たせたローカルのパスは呼び出し時のノードのローカルのパスになったような。
511 :
デフォルトの名無しさん:03/04/24 02:19
SELECTの結果を上から10番目から100番目まで抽出したいんですけど
どうすればよかとにあんですか?
512 :
動画直リン:03/04/24 02:26
>>511 その辺は方言あるからまずDBMS名書いて。
514 :
デフォルトの名無しさん:03/04/24 09:46
>510
仰る通り呼び出し元へログが書き出されていました。
本当にありがとうございました。
>506
お騒がせをいたしまして申し訳ございませんでした。
本当にありがとうございました。
ものすごく初歩的な質問ですみません。
昨日、SQL serverをインストールしました。認証はwindows認証を使用、にしました。
で、ASPでプログラムの練習をするため、ODBCを登録しました。認証は、
windowsNTの認証メカニズムを使う、にしました。
一応、ODBCの連絡はうまくいっているようです。
そこで、ASPで、
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "・・・", "ID", "Password"
で「ログインできませんでした。」のエラーが出ました。
ID,Password は、このマシンのログイン時のもの「Administrator」とパスワードを
入れました。
SQL serverの設定が悪いのかと思って、Enterprize Managerで
サーバーを右クリックして登録プロパティの変更で、
SQL Server認証を使用にし、「Administrator」とパスワードにしたのですが、
SQL Server自体にログインできなくなりました。
これらの認証には、全部、「Administrator」と同じパスワードを使用していますが、
何が悪いのか混乱しています。
どうぞよろしくおねがいします。
>516
SQL鯖はWindowsドメイン、コンピュータ、SQL鯖、データベースという
4段階の認証があって、組み合わせが色々あって面倒です。
ものすごく簡単に言うと、Win認証はWindowsのユーザ名で。
SQL鯖認証は、指定したユーザ名で認証を行うって事です。
とりあえずスタートメニュ-→SQL鯖→BooksOnlineの、「認証モード」って
いうキーワードで出てきた項を見て下され。
山太郎さん、ありがとうございました。
さっそく、見てみます。
ヘルプで勉強、これ基本でした。忘れてました。反省。
519 :
adduser:03/04/26 15:42
T-SQLのSQL Server認証でのユーザ追加について質問があります。
当方MSDE2000です。
下記のスクリプトでユーザを追加しました。
use MSCatalog
go
sp_addlogin 'WWWUser', 'password'
go
sp_defaultdb 'WWWUser', 'MSCatalog'
go
sp_adduser 'WWWUser'
GRANT SELECT, UPDATE, INSERT, DELETE ON Products TO WWWUser
go
quit
でうまくいったようなのでこのユーザでログインしてみると
>osql -UWWWUser -Ppassword
ユーザー 'WWWUser' のログインに失敗しました。理由 : SQL Server の信頼関係接続に関連
付けられていません。
何か勘違いをしているのでしょうか?ポイントを教えてください。
オラクル9iで新しく追加されたMERGE文
(その行があればUPDATE、なければINSERT)ってあるじゃないですか。
俺、使ってるDBがオラクル8なのでMERGEを利用できなく、
まんまストアドで「まずSELECTで探して、行があればUPDATEなければINSERT」と
書いてやっています。周りに詳しい人いなくていつも疑問に思っていたのですが
こういう処理って一般的には、どう書くものなんでしょう?
もっと効率よくやる方法ってあるのでしょうか?
522 :
adduser:03/04/26 18:35
>519自己レス
既定インスタンスの認証方法がWindows認証モードでした。
レジストリHKLM\Software\Microsoft\MSSqlserver\MSSqlServer\LoginMode
を1→2に変更して混合モードに変えたら以前のユーザのままログインできました。
ゴミ質問流しました。すいません。
>>520 delete from dst where key in (select key+0 from src);
insert into dst select * from src;
between句で疑問なんですが、
SQLServerで、
where 5 between 10 and 1
とすると引っかかりませんが(必ず小 and 大でなければいけない)
Accessとかだと大→小でも引っかかりますが、
どっちが規格に沿った動作なんでしょう?
後、Oracleではどっちの動作なんでしょう?
※そもそもBetweenなんぞ使うな・・・ってのは言わんでください
>>524 Oracleでもヒットしない。規格は知らないけど。
>>524 > ※そもそもBetweenなんぞ使うな・・・ってのは言わんでください
そんなことを言う人はいないでしょう。
ただし、最近は、Betweenでも、>= 条件 AND <= 条件でもパフォーマンスに
大差ないらしいです。(何かの雑誌で読んだ)
# DBエンジンの作り次第ですが・・・。
>>524 PostgreSQL のマニュアルには...
| 比較演算子に加えて特殊な BETWEEN 構文が使えます。
| a BETWEEN x AND y
| は次と同等です。
| a >= x AND a <= y
と書いてあったりするから、between 小 and 大 と使うのが無難かと。
そもそも SQL の規格の正式な奴ってどっかにあるの ?
>>526 同じく PostgreSQL のマニュアルには...
| 内部的に最初のの形式を 2 番目の形式に書き換えるのに必要となる CPU サイクル以外それぞれの形式には違いはありません。
と書いてあったりする。他の DBMS は知らんが。
>>528 その中の "SQL92 specification draft" をみると...
6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".
つーことだから、Access の動作は (MS がよくやる、MS が勝手に便利だと考えている) おせっかい機能のようだな。
>>526 「大差ない」ではなくて「変わらない」が正しいと思う。
なぜなら、オプティマイザが内部的にbetweenを >=条件1 AND 条件>= に置き換えて実行してくれるからら。
実行計画を採ってみれば、一目瞭然。
ただし、例外があるのもこれまた当然の話だが。。。。
531 :
デフォルトの名無しさん:03/05/01 20:16
JDBC+Oracle9iです。
キーとなる値だけ変えてレコードの複製を行いたいのですが、1レコード分全て
取得して新たにINSERTする以外に方法はあるでしょうか?
>>531 質問の意図がワカランが
INSERT INTO Table SELECT ... FROM Table WHERE ...
っで 出来ないのか?
534 :
デフォルトの名無しさん:03/05/02 01:05
SELECT * FROM 〜
で、「*」じゃなくて特定のカラムだけ取得しないようにってできるの?
20個(?)のカラムがあるレコードで1つだけ取得しなくてもいいカラムが
あるんだけど「*」の代わりに19個カラム列挙するのは厳しいでつ…
>>534 列挙しろアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホアホ
536 :
デフォルトの名無しさん:03/05/02 01:11
そんな〜(;´Д`)
というか列挙してた漏れが頭悪いのかと思ってたけど、それが普通のやり方ってこと?
列挙するのが普通です。
どうしても一部だけを別扱いしたい時は
仮想表をCREATEして使いましょう
でも作りすぎには要注意。
20カラム取得して1カラムを無視すればいいじゃないか
>>537 そうなのね…。
実際は20個よりも多いのでちょっと大変だけどやるしかないかぁ。アリガd
>>538 その1カラムがvarchar2(2000)で大きいので一緒にすると結構負荷が来るんでつ。
今までは面倒だったので一緒にしてたけど、改善しる!と言われてしまったので。。。
>>534 ってことは、現状は"select * "で記述してるんですか?
だとすると、 列挙して記述しといた方が良いと思われ
542 :
デフォルトの名無しさん:03/05/02 02:16
すいません、今SQLをやっているのですが
重複したデータを排除して取得するもので
DISTINCT というのがありますが、その逆の
重複したデータだけを取得するという命令はないでしょうか?
今やっていることでは
テーブルAのデータとテーブルBのデータを比較して
AとBで重複していないデータだけを取り出したいのですが
どうすればいいのでしょうか・・・
> 重複したデータだけを取得するという命令はないでしょうか?
> AとBで重複していないデータだけを取り出したいのですが
どっちだ
>>543 すんません、重複してないデータのみ取得したいほうでした
日本語が馬鹿ですんません・・・
外部結合→くっつけた方がnullのやつを取得
(SQL_A UNION SQL_B) MINUS (SQL_A INTERSECT SQL_B)
>>534 列挙すべきだな
"SELECT *"は、名前解決に時間がかかるとかで
話題になってたなw
たいした問題じゃ無いと思うけど
頻繁にプログラムやSQL*Plus等で参照をするのであれば
VIEWにするのも手ではある
テーブルAをテーブルBの内容で更新・追加する場合、
下のような記述以外に適切な方法はあるでしょうか?
update A inner join B on A.ID = B.ID set A.F1 = B.F1
insert into A(ID,F1) select B.ID,B.F1
from A right join B on A.ID = B.ID where A.ID is null
>>533 遅くなりましたが、それでできました。ありがとうございましたヽ(´ー`)ノ
>>548 失礼しました。同じような質問があったのですね検索でヒットしなかったので見落としました。
こちらもoracle8でmergeが利用できませんから、やはり2回のSQLで実現するしか無いのかな?
>>523 の方法は、テーブルAの一部のフィールドの値を残す必要があるので使えません。
全てではなく特定のフィールドのみ更新が必要となります。説明不足ですいませんでした。
>>551 となると
>>548の線しかないや。個人的にはいつも、
insert into a (id) select id from b where not exists (select * from a where a.id = b.id);
update a set (f1,f2) = (select f1,f2 from b where b.id = a.id);
て書いてる。insert先のがコードの量減るんで。
しかしOracleでupdate〜inner joinってできたのか。知らなかった。
553 :
デフォルトの名無しさん:03/05/04 19:25
fetch文で行われているデータ取得をArray fetch文に変更すると
データ取得の性能が上がるのでどうして上がるか調べておけと言われたのですが、
古いSQLの本しかなくてArray fetch文の解説が載ってません。
Array fetch文の簡単な解説と、なぜfetch文に比べて
データ取得の性能が上がるか教えてください。
554 :
デフォルトの名無しさん:03/05/05 17:11
おまえらみんなソフトは何使ってんの?
SQL ServerやOracleはとても手が出ねーし・・・
>>554 会社でまともに使うなら、サポートの手厚い SQL Server/Oracle とだし、個人的に使う分には PostgreSQL とか MySQL とかのフリーのやつでいいんじゃない ?
556 :
デフォルトの名無しさん:03/05/05 21:13
557 :
デフォルトの名無しさん:03/05/06 17:35
SQLServer2000です。
SELECTと同時にロックをかける・・・Oracleでいう、FOR UPDATEみたいな
動作をさせたい場合はどうすれば良いのでしょうか?
ヘルプには、SELECT文に使うヒント句でロック方法を指定するような記述が
あるのですが・・・
どのヒントを指定しても別の接続からSELECTできてしまいます。
(UPDATE等は出来ないので、ロックはされているようです)
>>557 FROM table_name (UPDLOCK) かな?
>559
XLOCKで逝けました!!
>557で「どのヒントを指定しても」って書いたのにXLOCKを試していませんでした。
何故なら、印刷したヘルプのXLOCK以下が切れていた為(鬱死
今度はもっとヘルプをよく読みます。
ありがとうございました。
phpを使ってmysqlのdbを表示させたいんですが
どうすればいいのかまったくわかりません。
ご伝授おねがいします
563 :
デフォルトの名無しさん:03/05/12 14:38
5:00, 5:30, 6:00, 6:30, 7:00〜というように30分おきのデータがDBに入っています。
列は date=日付 と int=ある数値データ の2つです。
そこで現在から遡って100件分のある数値データをとると言ったような場合、
どのようなSQLを書けばよいでしょうか。
ただし、 2003/5/5 6:00:00, 2003/5/5 6:30:00, 2003/5/5 7:30:00といったように
本来あるべきはずのデータがかけている場合があります。
そのような時はある数値データに0を入れたいのです。(これはプログラム側でもよい)
やはり、時刻を自分で30分ずつマイナスして100回SQLを流すしかないのでしょうか?
使用DBはMysqlです。長文失礼です。
○ そのような時はある数値データに0を入れたいのです。
× そのような時はある数値データを0としてとりたいのです。
すいません。
SELECT 日付, 数値
FROM テーブル
WHERE 日付 <= 現在の日付 AND 日付 < 現在の日付-(30分*100)
ORDER BY 日付
歯抜けデータはデータ取得後に判断する方が楽かと。
SQLで歯抜けデータを0で埋めるには、
30分おきのデータが入った一時テーブルでも用意してやれば
元テーブルと連結して出来ないことは無い。
×)日付 < 現在の日付-(30分*100)
○)日付 > 現在の日付-(30分*100)
>>565 現在が、
SELECT 数値 FROM テーブル
WHERE 日付 < sysdate()
ORDER BY 日付 DESC LIMIT 0,100
これなんですね。
それだと必ずしも100件とれないような…
> 歯抜けデータはデータ取得後に判断する方が楽かと。
結局100回ループさせて抜けてないか見るわけですよね。
下3行は残念ながらやり方わかりません。調べてみます。
>>567 >それだと必ずしも100件とれないような…
「それ」って自分のSQLの話でしょ?
>>565の何が不満なの?
>>597 でなければ、30分区切りのカレンダーテーブルを予めまとめて作成して、そいつで外部結合する。
JDBCだったらnullをgetIntしたら0だからいけるでしょ。
SELECT * FROM
テーブル RIGHT OUTER JOIN カレンダー ON テーブル.日付 = カレンダー.日付
WHERE カレンダー.日付 BETWEEN 開始日 AND 終了日
開始日と終了日はプログラムで出しやがれ。
>>568 ようは、数値のあるデータを100件取りたいそうな
SQL鯖でいう、TOP 100や
ORACLEでいう、rownum
があれば良いんだな
>>570 >本来あるべきはずのデータがかけている場合があります。
>そのような時はある数値データに0を入れたいのです
ってことは結局、現在から30*100分前のデータまでを取るわけだから、
>WHERE 現在の日付-(30分*100) < 日付 AND 日付 <= 現在の日付
じゃないのかい?
(俺が質問者みたいになってキター)
>>570 そうなんですよ。
でもMysqlにはLIMITっていうのがあって、その件は解決済みです。
>>571 それだと 現在の日付-(30分*100) < 日付 AND 日付 <= 現在の日付 の中に
データが2件しかなかった場合、100件とれませんよね。
573 :
動画直リン:03/05/13 09:13
>>572 だからその2件以外の98件は全部0なんだろ?
>>574 そうですけど、どの時刻のデータがあってどの時刻のデータがないのかは
わかりませんよね。つまりどちらにせよ時刻を30分マイナスさせながら
100回ループ(プログラム側)でチェックするしかないのかな?
>>575 >時刻を30分マイナスさせながら
>100回ループ(プログラム側)でチェックするしかないのかな?
何でこれが手間やねん! ┐('_`)┌ ヤレヤレ
>>574 んっ?
数値のあるのを100件じゃないのか?
歯抜けが2件あったら、
トータル102件分って意味合いと解釈したんだけど?
何でこれが102件やねん! ┐('_`)┌ ヤレヤレ
>>575 100回SQL発行するんじゃなくて足りない分だけプログラム側で付け足せ
>>575 何で組もうと思ってるか知らないけど、SQLの返りをいれた配列が
30分刻みで、かつ無いデータが0になってるというのは不可能。
だから、100件分に相当する時刻の範囲を取り出して、それを使うときに
無い時刻には0を返すか、100件分の時刻が入った配列にコピーするかだね。
>>581 JAVA+Mysqlなんですが、やっぱりSQL単体では不可能ですか。
とすると、JAVA側で時刻を20分ずつマイナスした日付と、DBから取り出した日付を
比べて、なければ配列に0を入れるというようにするしかないですね。
>>581 >何で組もうと思ってるか知らないけど、SQLの返りをいれた配列が
>30分刻みで、かつ無いデータが0になってるというのは不可能。
だから一時テーブル使ったらできるんだって。┐('_`)┌ ヤレヤレ
>>582 >やっぱりSQL単体では不可能ですか。
だから一時テーブル使ったらできるんだって。┐('_`)┌ ヤレヤレ
>時刻を20分ずつ〜
しばらく見ないと思ったら仕様変更でつか。大変ですね〜。
>>569 答え載ってるじゃん!と思ってこの方法でやってみたのですが、
レスポンスが恐ろしく悪いです。
SQL100回流すよりも遅いのです…
>>583 一時テーブルの使い方教えてもらえますか?
>>584 >答え載ってるじゃん!と思ってこの方法でやってみたのですが、
>レスポンスが恐ろしく悪いです。
ありえねぇ〜。SQL晒してみ。
>SQL100回流すよりも遅いのです…
じゃあSQL100個UNION ALLでつないだら?(わら
>一時テーブルの使い方教えてもらえますか?
作り方:CREATE TABLE
使い方:普通のテーブルと同じ
処理後:DROP TABLE忘れずに
>>569参考にしたときのカレンダーテーブルは普通のテーブルか?
まあいいけど。
SQL一発でやるにゃ、
縦展開では無理
横展開(項目を100個)すりゃ出来ないこともない
しかし縦展開でフェッチ100回する方が、
コーディング量少なくすむし、かつ無難
587 :
デフォルトの名無しさん:03/05/14 22:52
質問なんですが、
オラクルのSQLでパフォーマンスを上げるために
副問い合わせと集合演算を多用していますが、
後からのメンテナンスが大変です。解析に時間がかかってしまいます。
やっぱりこういうモンなのですか?
例:
Select name1, name2 From table1 Where key1 > 55 And name1 <> 'ばか'
↓
Select name1, name2 From table1 Where (key1,key2) In
(Select key1, key2 From table1 Where key1 > 55) Minus
(Select Key1,Key2 From table1 Where key1 > 55 And name1 = 'ばか')
>>586 一時テーブルじゃなくて一時的にテーブル作ってるやん(ゲラゲラ
テーブル名の先頭に#をつけると一時テーブルが作られてセッションが切られると
自動解放されます。複数で同じ一時テーブル作ってもだぶらないよん。drop不要。
ん? CREATE TEMPORARY TABLE ってやるんじゃないの?
>>587 やっぱ、そーいうもんじゃね。
どーしてもというなら、仕様書かソースのコメントに
それらしき内容を言葉で書いておくとかすれば?
俺は、自分ですら怪しくなりそうなやつには
そうしてるよ。一般的かどうかは知らないけどね。
591 :
デフォルトの名無しさん:03/05/15 07:16
>>590 ありがとうございます。
ところで佐藤さんじゃないですよね?
>>588 はぁ〜? 一時的テーブル? どっちでもいいや
っでカレンダー情報作るのかいな?
意味ねー(コード量とSQL発行回数的に)
だまって最初に配列作って、ループでフェッチして
該当する時間にセットしとけ
>>592 >はぁ〜? 一時的テーブル? どっちでもいいや
ハゲワラ
ダサ過ぎ。
>>585 こんな感じです。
テーブル1(列: 数値(int)、日付(datetime))
テーブル2(列: 日付(datetime))30分刻みの時刻入力済み
SELECT 数値 FROM テーブル1
RIGHT OUTER JOIN テーブル2 ON テーブル1.日付 = テーブル2.日付
WHERE テーブル2.日付 <= ? ORDER BY テーブル2.日付 DESC LIMIT 0,73
?には任意の時刻を入れています。
ちなみに100回ループバージョンはこうです。
SELECT 数値 FROM テーブル1
WHERE 日付 = DATE_SUB(?, INTERVAL "?:0" DAY_SECOND)
1個目の?には任意の時刻を、2個目には30ずつ値を増やして回しています。
ごめんなさい。
× WHERE テーブル2.日付 <= ? ORDER BY テーブル2.日付 DESC LIMIT 0,73
○ WHERE テーブル2.日付 <= ? ORDER BY テーブル2.日付 DESC LIMIT 0,100
73って何で書いてあるんだろ…
>>594 テーブル2の条件は
日付 <= 現在の日付 AND 日付 > 現在の日付-(30分*100)
LIMITいらんでしょ。
なんでSELECT句に日付がないの?
後の処理しにくくない?
もともとテーブル2にはほしい日付の範囲の100データぶち込んでおくことを考えていたんだが。
そうすれば
日付 <= 現在の日付 AND 日付 > 現在の日付-(30分*100)
は不要。
>>598 LIMIT使うより 日付 <= 現在の日付 AND 日付 > 現在の日付-(30分*100) 使ったほうが速いんですかね
> なんでSELECT句に日付がないの?
これグラフ化のための数値取りなんで必要ないんです。
> テーブル2にはほしい日付の範囲の100データぶち込んでおく
とするとこのページを更新するたびに100データぶちこんでは消してってなりますよね。
遅くなりませんか。時間軸が移動できるグラフなので結構更新されるんですよ。
SQLServerで日付のデータを20030515といった形で持っているのですが、特定の月間のデータだけを抽出したいのですが、どのようなwhereを書けばいいのでしょうか?
>>600 日付データはvarcharですか?だったら
substring(日付,5,6) = '05'
でいけないかな。5,6のところは数え方違うかも。
>>599 > LIMIT使うより 日付 <= 現在の日付 AND 日付 > 現在の日付-(30分*100) 使ったほうが速いんですかね
わからん。試してみたら?
> > なんでSELECT句に日付がないの?
> これグラフ化のための数値取りなんで必要ないんです。
じゃあおっけ。
この場合絶対に30分おきであることを保障しないといけないわけね。
> > テーブル2にはほしい日付の範囲の100データぶち込んでおく
> とするとこのページを更新するたびに100データぶちこんでは消してってなりますよね。
> 遅くなりませんか。時間軸
いまテーブル2に何データあるの?
30分おきだから1日48データで2日分とちょっといるわけね。
3日おきにテーブル2を更新する仕掛けを作るのはどう?
常に6日分くらい用意しておく。
3日おきの更新は現在日付+3日分補充して古い3日分のデータを消すとか。
それかある日付を基準にそこから100データ分TABLE2に用意して
SELECT時は現在日付と各データの差を取得するようにすると
常にTABLE2には100データだけあればいいことになる。
>>600 いろいろ有るわな
where 日付 >= '20030501' and 日付 < '20030601' でもいいし
CONVERTしてMONTHで見るもよろしいし
↑正確なパラメータ覚えて無いのでこれで勘弁
>>596 > 一時テーブルは環境依存なのよ。
create table temporary は、SQL92 で規定されてるよ。
>>594 これってさ、「連番の歯抜けにインサートしたい」
ってのと、類似してると思うのね
論争するだけ無駄
>>596 サブクエリー使ってるくせに良く言うよ(俺は使ってないが)
607 :
デフォルトの名無しさん:03/05/16 00:12
↑言ってる意味がわからん
MYSQLについての質問です。
ある本に
>mysqladmin CREATE [データーベース名]
>mysql [データーベース名] < d:\database.txt
でdドライブにあるテキストファイルの中味をデーターベースに入れられる、とあったのですが、実行すると
「"\d"というコマンドはありません」
というメッセージが出てきてしまいます。
どうか、対策を教えてください。
>>611 インサートとセレクトって表現だけで
歯抜けの連番には、0にしたいってのなら
全く一緒っす
>>610 >普通に出来るんですが…
何故か私はできないんです。MYSQLの故障かも・・・。
>>613 database.txtの中身を晒して。
>>612 それは判るんだけど、何が無駄なの?
どうやれば出来るか(速いか)を聞いてるんでしょ?
>>615 設計次第でどうにでもなるから
例えばだけど、連番に拘るのなら論理削除しといて
抜けないようにすればいい とかね
こればかりは、いろんな状況(方法)があるから
何とも言えないんだけど
SQLで連番に拘ること自体が、自分にとっては不可思議だよ
617 :
デフォルトの名無しさん:03/05/18 19:37
SQLの参考書でお勧めがあったら教えていただけないでしょうか。
615にあらず...
あなたの言う連番ですが、そのキーには意味はありません。
一意を保つためだけのものです。
でも今回は時間であり、〜分毎のデータがほしいわけで
そのキーにははっきり意味があります。
なので議論の仕方は全然違います。
>設計次第でどうにでもなるから
>例えばだけど、連番に拘るのなら論理削除しといて
>抜けないようにすればいい とかね
論理削除分のレコードの要領や、件数が多いことのパフォーマンスが
気にならないならそれで良し。
>SQLで連番に拘ること自体が、自分にとっては不可思議だよ
この場合は明らかに30分おきのデータに縛られる。
データが無いことの意味の違いは明白。
「無いものは無い」なのか「無いときは0とみなす」なのか。
>>618 >論理削除分のレコードの要領や、件数が多いことのパフォーマンスが
>気にならないならそれで良し。
無理矢理なSQLで、空き番を見つけるなら
論理削除の最初を見つける方が速いと思うが?
0 2003/05/19 20:30:00
1 2003/05/19 20:00:00
2 2003/05/19 19:30:00
3 2003/05/19 19:00:00
4 2003/05/19 18:30:00
連番で代用できるやん
基本時間−(連番*30分)で
ようは、SQLを一回でやりたいが為の
ワークテーブルを必要としたり
無理矢理のSQLを実行するのは
本来あるべき姿ではない
それが連番関連の処理がおおい
って事が言いたいだけなんだが?
んで最後に、この例で言うと
(空き番=空き時間)に類似してないかい?
>無理矢理なSQLで、空き番を見つけるなら
>論理削除の最初を見つける方が速いと思うが?
論理削除ってこの場合結局レコード0のデータも作成しておくってことですよね。
これができるなら質問者の問題はこれで解決です。
>連番で代用できるやん
>基本時間−(連番*30分)で
なんかよくわかりません。根本的解決になってないんですが。
0 2003/05/19 20:30:00
1 2003/05/19 20:00:00
3 2003/05/19 19:00:00
4 2003/05/19 18:30:00
だったらどうするの?
>ようは、SQLを一回でやりたいが為の
>ワークテーブルを必要としたり
>無理矢理のSQLを実行するのは
>本来あるべき姿ではない
俺も今回の場合は存在するデータだけ取ってきてクライアント側で
無い時間に対してはデータ=0ってしてやるほうがいいように思う。
でも日付カラム取りたくないとか言ってるし。
データ取得後の処理がいまいち見えないからなんともいえない。
でもSQL側で苦労しておくとデータ取得後の処理が簡単になったりする、というのも事実でしょ。
そういうメリットを放棄してまで「本来あるべき姿」を求めるのはどうかと。
ちなみにあんたのいう「本来あるべき姿」ってどんなの?
>それが連番関連の処理がおおい
>って事が言いたいだけなんだが?
「無理矢理のSQL」と「連番関連」はさすがに結びつかないだろう。
おれは連番関連以外であんたの言うところの無理矢理のSQLをよく書くよ。
>んで最後に、この例で言うと
>(空き番=空き時間)に類似してないかい?
似てるけど違う。
俺にとっては似てすらいない。
何か難しい話になっちゃってて素人の私には何がなんだか・・・
>>622 これはグラフ化のための数値(Y軸)取りなんですが、時刻の座標は固定(X軸)で
数も100件と決まっているので日付をとる必要がないと考えました。
(歯抜けデータがないことが前提)
ですが、歯抜けデータが出来てしまうと、時刻の座標は決まっているので、
>>567のようなSQLだと、時刻と数値が対にならなくなってしまうので、何かよいSQLが
ないかなと思い、質問した次第であります。
現在は100回SQLを流す形を採っています。ここで考えて貰ったSQLで一番レスポンスが
よいもので…でも遅いですが…
>>621 >論理削除ってこの場合結局レコード0のデータも作成しておくってことですよね。
>これができるなら質問者の問題はこれで解決です。
そう言った覚えは無いが
ワークテーブルを作成する延長で、これも出来るはずですなぁ
>0 2003/05/19 20:30:00
>1 2003/05/19 20:00:00
>3 2003/05/19 19:00:00
>4 2003/05/19 18:30:00
歯抜けの時間を得るためのSQL
歯抜けの連番を得るためのSQL
等間隔で入っているデータの歯抜けを無くする為のSQLって
意味合いじゃ同じでしょ
自分の考えでは、この2を出力させるために、
ワークテーブルまで作るのは無理矢理だと思う
>俺も今回の場合は存在するデータだけ取ってきてクライアント側で
>無い時間に対してはデータ=0ってしてやるほうがいいように思う。
>データ取得後の処理がいまいち見えないからなんともいえない。
>でもSQL側で苦労しておくとデータ取得後の処理が簡単になったりする、というのも事実でしょ。
これは同意(最初から否定しているつもりはない)
>ちなみにあんたのいう「本来あるべき姿」ってどんなの?
パフォーマンスも重要だが、
この場合は、想定件数が100件程度なので
工数をかけないのと、コードと仕組みの解りやすさ(バグを誘発しない&改造しやすい)
だろうな
>おれは連番関連以外であんたの言うところの無理矢理のSQLをよく書くよ。
無理矢理って思うのは、感じ方は人それぞれだからなぁ
俺は複雑なSQLは書くけど、無理矢理なSQLは書かないようにしている
(初心者には難しくても、普通の中級者が すんなり理解できる程度)<これもまた微妙な表現
まぁ考えを押しつけるつもりは無いし
俺は似てると思うことを、違うって言うんだから
話は平行線なので終了!
このスレの惨状を見てもなお
平行線であることがわからないとは
アッパレ
そんなことより
「請求フラグ」 0:未請求 1:請求済 ってフラグがある。
明確なレコード仕様書がある。追加される予定もない
仕様書にゃ「未請求以外を抽出って書く奴がいる」
何故か、なんでも未請求が標準(デフォルト)になって話す
請求フラグ <> 0 仕様書の意味合い通り
請求フラグ = 1 一般的な書き方?
どう書けきゃ良いんだよ!
SQL関係ねーべ。
仕様変更妄想して雰囲気で選ぶべ。
>>625 了解。
おれもちょっと熱くなって話が平行線であることに気づかなかった。
>>625の時点で気づいたので
>>626の書き込みは誰にとってもどうでもいいものになっていましたとさ。
質問させてください。
すでにデータの入っているテーブルで、NULLを許可しないフィールドがあります。
データを消すことなくそのフィールドのNULLを許可に変更することは可能でしょうか。
もし可能であればどういうSQL文を発行すればよいのでしょうか。
よろしくお願いいたします。
Boracleなら出来るんじゃない
ALTER TABLE HOGE MODIFY(MOGE NULL)
/
632 :
デフォルトの名無しさん:03/05/20 16:39
>>627 当然
> 請求フラグ <> 0 仕様書の意味合い通り
だろ。
そのフィールドには NULL が入ってるかも知れんからな。
違うだろ。
・null は等号・不等号との比較演算では常に false を返す。
・null は「未請求(0)」ではない。
以上のことから、「未請求(0)」以外を抽出するには
請求フラグ <> 0 or 請求フラグ is null
と記述するのが、「未請求以外を抽出」という仕様に忠実だと思う。
>>633,634
NULLがあるかは確かめた方がよくない?
あと迷うくらいなら「請求フラグ <> 0」でいいですか?
と聞けばよい。
聞かずに決めるなら
請求フラグ = 1
より
請求フラグ <> 0
にする。
>追加される予定もない
ってのは当てにならない。
636 :
デフォルトの名無しさん:03/05/21 13:52
ここって香具師ばかりだな
こんなとこにいる漏れも香具師か・・・・
なんかエライ展開
どっちでも良いみたい
パフォーマンス的に、「請求フラグ = 1」に決定
ただ、その人の仕様書ってのが
「○○以外」ってのが多すぎなのよ
まだこれならマシで
「非○○以外」「未○○以外」とか
肯定系で書いて欲しいと願ったw
>>637 みんな「請求フラグ<>0」と言っていますが......
640 :
デフォルトの名無しさん:03/05/22 16:20
where句の条件を設定するところで、値が最大という条件は
つけられますでしょうか?
>>641 ふつう、HAVING句を使うんじゃないの?
<> 0
はパフォーマンス落ちるよ。
仕様は一応満たすかもしれないが、後々速度改善とかの時に問題になることは必至。
>>640 最大の値がほしいだけならMAX使うだけだけど、
その最大値をとるデータがほしいというなら
WHERE句でDATA=(SELECT MAX(DATA) FROM TBL)
でやったらいいかもよ。
644 :
デフォルトの名無しさん:03/05/22 16:53
すんません、一つSQL文で質問したいのですが
SQLファイルから直接DBに流し込む作業をしていたのですが
改行コードがうまくいれることができません。
connect '/data/TEST.GDB' user SYSDBA password masterkey;
UPDATE ADDRESS_TABLE SET ADDRESS='あぱむ\nあぱむ';
commit;
こんな具合でやると改行コードを文字としていれてしまうので
DBから取るときにうまくいきません・・・
DBはInterBase5.6を使用していますが
どのようにSQLファイルから流し込む際に改行コードをいれればいいのでしょうか?
>>645 > こんな具合でやると改行コードを文字としていれてしまうので
> DBから取るときにうまくいきません・・・
意味がわかんね。うまくいきません?
HTML表示なら取り出したときに「\n」→「<br>」に置き換えればいいんちゃう?
>645
クォーテーションで囲った範囲は文字として見なされる。
至極あたりまえの事だと思うが・・・
InterBaseは知らんが、大抵は文字コード<->文字の変換関数が用意されている。
そのへんを使って処理したまい。
648 :
デフォルトの名無しさん:03/05/22 18:23
PL/SQLで 8文字の文字列が 日付かそれ以外か調べるには どうしたらいいのでしょうか?
たとえば 20030401 なら TRUE。 20031431 なら FALSE とか。
>>642 俺なら、「仕様を満たしていないがパフォーマンスがいい奴」より「パフォーマンスが悪いけど仕様を満たしている奴」を採用するよ。
「仕様を満たしていないがパフォーマンスがいい奴」が駄目なのはあたりまえだっつーのw
652 :
デフォルトの名無しさん:03/05/23 15:20
仕様を満たすのは当然だ。
仕様も満たしてなかったら、それは欠陥品だ。
インサートして出ちゃったらbad
ゴムがあればsafe
>SELECT 持ち物 FROM 男,女 WHERE 持ち物 LIKE '%ゴム%';
┌───────────
|女.持ち物
├───────────
|先っちょに穴のあいたゴム
└───────────
>SELECT 年齢 FROM 女
┌───
|年齢
├───
|29
└───
>>656 俺だったら、
SELECT * FROM 女
です
662 :
デフォルトの名無しさん:03/05/25 19:48
INSERT INTO 女(アナル,マンコ) VALUES('チンポ','チンポ')
>>663 > GRANT INSERT,SELECT ON 女 TO "
>>662";
GRANT
> INSERT INTO 女(アナル,マンコ) VALUES('チンポ','チンポ')
INSERT 16545 1
> SELECT 年齢 FROM 女 WHERE oid = 16545;
年齢
-------
80
(1 row)
665 :
デフォルトの名無しさん:03/05/26 10:27
VARCHAR2(8)の日付の項目Aがあります。
この項目に NUMBERの年Bを足したのが、VARCHAR2(8)の日付の項目Cより
大きいのを抽出したいのですが、どうすればいいのでしょうか?
666 :
デフォルトの名無しさん:03/05/26 10:27
追記
日付の項目ってのは yyyymmddで 入ってるものです。
初心者もいいとこな質問なのですが、教えてください。
access violationというエラーが出るのですが、これはどういった場合に出るエラーなのでしょうか?
669 :
bloom:03/05/26 11:11
>>665 TO_NUMBERして、B*10000を足すか、
SUBSTRで年だけ抜いて、TO_NUMBERしてB足して、||で繋ぐか。
前者の方が楽だね。
>>670 説明がおかしい&足りんかった
前者は、TO_CHARしてからTO_NUMBERね。
具体的には
TO_NUMBER(TO_CHAR(ymd,'YYYYMMDD'))+b*10000
と比較してやれば良いかと。
>TO_NUMBER(TO_CHAR(ymd,'YYYYMMDD'))+b*10000
この ymd って 項目Aで いいのかな?
c < (TO_NUMBER(TO_CHAR(a,'YYYYMMDD'))+b*10000)
こういうふにしたらいいのかな?
674 :
デフォルトの名無しさん:03/05/26 16:26
>>673 間違ってるぞ。
TO_NUMBER(c) < (TO_NUMBER(a)+b*10000)
これでいいのだ。
バカボンのパパ
質問です。
postgreSQLをcygwin使って使おうと思ってるのですが、
初期化のinitdbの途中でエラーがでます。
creating template1 database in〜〜〜FATAL
File 〜〜〜\cygwin\usr\local\pgsql\data/PG_VERSION is missing. T
his is not a valid data directory.
って感じです。
調べたのですがユーザー名にスペースがあったのでそこを手動で
passwdのとこでスペースをなくしたりしましたが変りませんでした。
どなたかご指導お願いします。
677 :
デフォルトの名無しさん:03/05/27 16:03
SQLで 文字列の左から 4文字 取り出すってのは、どうするんでしようか?
678 :
デフォルトの名無しさん:03/05/27 16:11
SUBSTRB(文字列,1,4)
4文字といっているから
SUBSTR(文字列,1,4)
680 :
デフォルトの名無しさん:03/05/27 16:53
Aという項目は、VARCHAR2で定義してあります。
Bという項目によって Aに数値か 文字列かのどちらかが入るようになっています。
そこで Aが数値の場合のみとして条件を設定し、抽出した場合、
Aの合計を取得したいのですが、どうすればいいのでしょうか?
レコード数が多いのですが、簡単にできないでしょうか?
681 :
デフォルトの名無しさん:03/05/27 16:59
sum(A)でOK
682 :
デフォルトの名無しさん:03/05/27 21:22
都道府県テーブルに県コード(charで2バイト)、
市区町村テーブルに住所コード(charで5バイト)があります。
住所コードの先頭2バイトが県コードと等しいです。
2つのテーブルを県コードと住所コードで結合したいのですが
どうすればよいのでしょうか?
683 :
デフォルトの名無しさん:03/05/27 21:37
>>682 Oracleかい?SQLServerかい?
STRINGなりSUBSTRINGを使えば結合出来るんでない?
ごめん。OracleはSUBSTRだった.
何も書かずにすみませんでした。
SymfoWAREです。
おはずかしい話ですが、SQLのWHERE句にSUBSTRINGなどの関数は使用できる
という事なのでしょうか?
例を見ると、SELECT句のところにしか使用されていませんでしたので。
低レベルで申し訳ありません。
SELECT 市区町村テーブル.*,都道府県テーブル.*
FROM 市区町村テーブル,都道府県テーブル
WHERE 都道府県テーブル.県コード = SUBSTRING(市区町村テーブル.住所コード,1,2)
>>685 人に聞くより自分で試してみなよ。
CPUサイクル単位で金取られるようなシステム使ってるなら別だけどさ。
>>687 確かにそうだね。結局SQLなんてパズルだもんな。
SQL*PlusとかQueryAnalyzerでガリガリやったほうが覚えるね。
(まぁコストとかは別として)
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
691 :
デフォルトの名無しさん:03/05/28 20:33
最近、win2000sp2にMySQLをインストールしたものです。
やりたいことがあるので質問させてください。
2chのdatをsqlに変換したり、メールデータを添付ファイルも含めて
sql化させたりというのはできるのでしょうか?
もしできるとすれば、自分で調べた感じだと、perlなどの文章処理言語を
使うのだろうかと考えています。
もしよかったらアドバイスいただけたらうれしいです。
692 :
デフォルトの名無しさん:03/05/28 20:39
>2chのdatをsqlに変換したり、メールデータを添付ファイルも含めて
>sql化させたりというのはできるのでしょうか?
意味がよくわからん。
datやメール文書をデータベース化するってこと?
>>692 >datやメール文書をデータベース化するってこと?
変な用語を使ってしまったみたいです。
やりたいことは692さんのおっしゃる通りです。
2chの方に関しては、できればそのときに生きている板のdatを
読み込んで、idを検索したり、コテハンごとに発言を出したりできたら
いいな、と考えています。
>>693 まずSQLについて勉強してから質問した方が良いと思う。
SQLはプログラミング言語じゃない。単にデータベースを操作するだけのもんだぞ。
>>693 う〜ん。いまいちイメージが掴めないのですが。
2chの要件は多分ムリでしょう。サーバからデータをD/Lする
ようなものですから。
とりあえずwin2000でHTTPを勉強したいのであれば、
IIS+ASP+ODBC(MySQL)で適当なWebアプリを作ってみては?
>>695 誰もHTTPでなんていってないぞw
話をいきなり複雑にするな。
>>693 生のdatがあるならperlでもなんでも使ってINSERT文作ればいい。
メールの添付ファイルについては頭使わないときびしいね。
>>696 perlで生のdatをテーブルにロードするの?
>>698 生datからINSERT文への変換をperlでやればいい。
perlじゃなくてもいいけど。
あとはこのINSERT文を流してやればいいだけ。
クラスだの何だの使わなくたって単純でしょ?
生datの形式知らんけど、テキストであるなら難しくはないと思う。
700
702 :
デフォルトの名無しさん:03/05/30 09:39
PL/SQL やってるんですけど、グローバル変数みたいなのって あるんでしょうか?
生datがあるならInsert文へ変換しなくても
ユーティリティー使って簡単にDBへ落とし込めそうな予感
>>702 >グローバル変数みたいなの
ええとね…何を言ってるのか判らんのだけど。
複数のストアドから参照できる変数、が欲しいのだと予想して答えてみる。
パッケージ使ってるなら、仕様部に変数定義すれ。
パッケージ使わないならない。
おとなしくDBに項目でも追加しなさい。
705 :
デフォルトの名無しさん:03/05/30 17:07
ああ ボディじゃないほうね。
OK
706 :
動画直リン:03/05/30 17:13
707 :
デフォルトの名無しさん:03/05/31 00:18
>>702 それマジ?
その変数が有効な期間が激しく気になる。
通常なら、その変数を宣言したPL/SQL(パッケージなど)が
終わってしまえば変数も開放されるはずだけど、、、、、
何か開放する宣言みたいのあるん?
C/C++のfreeみたいに。
というか、ネタにつられた?
比較演算子の前後にはスペース入れたほうがいい?
>>709 好みで、ご自由に。
ちなみに俺は、入れる派。
規約にもよる
俺も入れる。
713 :
デフォルトの名無しさん:03/06/02 11:39
入れない場合が多い。
if a=1 then
if a = 1 then
上記では 入れないほうが 見やすいと思う。
IF ( a = 1 ) THEN
漏れはこうかな、面倒だけどね。
後の事を考えると。
でも、結局はプロジェクトルール優先だ罠。
715 :
デフォルトの名無しさん:03/06/02 12:10
おれも規約がなければ714でやる。後で見やすい。
716 :
デフォルトの名無しさん:03/06/02 17:21
半角の 1 を 全角の 1に 変換するには どうしたらいいのでしょうか?
ちなみに Number型の変数 a を Varchar2型の変数 bに変換したいのです。
a=1 → b='1'
717 :
デフォルトの名無しさん:03/06/02 17:35
b:=TO_MULTI_BYTE(a);
便乗質問
SQL鯖ではどうすれば良いのだろう?
CAST()かCONVERT()で文字列にしてから
REPLACE()で全角にすればいいんじゃない?
>>719 それじゃ、変換パターンを全て書かなきゃいけないのね?
数値ならパターンが少ないからいいけど
やっぱり、そんな感じでストアドかなぁ?
721 :
デフォルトの名無しさん:03/06/05 23:23
>>720 SQLServer2000ならマルチバイト変換の関数はサポートされてなかった?
BooksOnlineで調べてみたら?
>それじゃ、変換パターンを全て書かなきゃいけないのね?
そんなこと無いです。
VBとかは関数サポートされてるし
Cとかアセンブラなら論理演算で変換すればそんなに骨ではないでしょ。
723 :
デフォルトの名無しさん:03/06/06 00:59
MYSQLで200万件のデータをLIKEの中間一致で検索すると時間がかかって
しまうので茶筅を使って日本語全文検索を試みてみたのですが全文検索
だと例えば「日本国」などの言葉を検索した場合「日本」 「国」を含む全ての
行がセレクトされてしまいます。
これをLIKE検索みたいに「日本国」だけを含む行をセレクトするためには
どうしたらいいんでしょうか?
>>723 まずはどのようなTABLE構造になっているか教えれ。
そしてどのようにデータをつっこんでいるのか。
それがわからないと誰も答えようがない。
725 :
デフォルトの名無しさん:03/06/06 01:53
726 :
デフォルトの名無しさん:03/06/06 09:32
PL/SQLで 文字列の長さを取得する関数を教えてください。
>>726 ちょっとは調べるとか、マニュアル本買うとかしれ。
OTNからpdfマニュアル落としてもいいんだし。
>>726 select length('漏れ') from dual;
select lengthb('漏れ') from dual;
両方試して理解しる。
727がいうように、これくらいは
OTNでPL/SQLのマニュアルダウンロードしる。
>>725 データと、発行したSELECT文を晒してもらわないとはっきりしたことは
いえないけど、
それは茶筅の方の問題ではないのかい?
すげえ疲れた。
今日はじめてMysql触りました。
今日一日実働七時間ぐらいで、
windowsにMysqlをインストして
株の銘柄日付順データ四本値をためしに一銘柄取り込んで、
普通の日付をグレゴリオ暦に変換して、
あらたにカラムを追加して、
Mysqlでも日付による範囲指定をできるようにしました。
select * into outfile 'output.txt' from kabu;
として、タブ区切りファイルとして吐き出し成功。
つーか、教科書二冊買って、データの取り込みと
吐き出しをほとんどまったく説明してない教科書って、いったい。。。
ネット上を探しまくったよ。
mysqlでサブクエリの命令を使えないのも愕然としたし。
疲れて目チカチカします。おしまい。
731 :
デフォルトの名無しさん:03/06/09 10:42
PL/SQLで VARCHAR2を宣言するときは、
a VARCHAR2(10);
とかしてサイズを指定しますが、
NUMBER型は、特にサイズを指定しません。
NUMBER型もサイズを指定したほうがいいのでしょうか?
それとも、両方、サイズを指定しなくてもいいのでしょうか?
732 :
デフォルトの名無しさん:03/06/09 11:34
両方明示しる!
(NUMBER型は、サイズを指定しなくてもいいけど)
自信ない時は例外でトラップしる!
733 :
デフォルトの名無しさん:03/06/10 11:33
オブジェクト ブラウザを使って PL/SQLのエディットをしているですが、
ブロックコピー、カットなどありますでしょうか?
また、インデントって どうやって使うのでしょうか?
734 :
デフォルトの名無しさん:03/06/11 00:27
>>732 NUMBERならサイズ指定する必要なんてないでしょ。31ビット固定だし。
別にしてもいいけど。
>>733 秀丸で作成->オブジェクトブラウザへCOPYじゃ駄目れすか?
SQL2000のビューをAccess2000のクエリにまとめて変換することはできますか?
736 :
デフォルトの名無しさん:03/06/11 19:23
ORACLE8でselect句にサブクエリ使っているのですが、group byに別名が使用できないためcount(*)が取れません。
たすけて・・・
select
count(*)
a.AA,
b.BB,
(select c.CC from xxx c where 〜) cc
from 〜 where〜
group by
a.AA,
b.BB,
cc (←エラー ORA-00904: 列名が無効です?)
ccを「(select c.CC from xxx c where 〜)」と書き換えると ORA-00979: GROUP BYの式がありません。
>>736 列名の変わりに列番号書けなかったっけ?
ccの変わりに1ってやってみたら?
738 :
デフォルトの名無しさん:03/06/11 19:51
group by は数字使えないんですよー
order by は使えるんですけどね・・・
>>736 ・ccが複数レコードになるのならエラーになりそう。
・ccが単一レコードなら、count(*)をとるのにccは不要なのでは?
詳しく書いてる時間が無いのですが、
SQLの中で2度の外部結合(+)を避けるために、このようなSQLが必要になってしまいました。
DB設計が悪いとしかいいようが無いのですが今更仕方ないという事情です。
>>736 xxxテーブルをFROM句に書いたら?
xxxからは確実に1件取るんだろ?
select
count(*)
a.AA,
b.BB,
c.CC
from 〜
,xxx c
where〜
and 〜 ←xxxに対する条件
group by
a.AA,
b.BB,
c.CC
試してないけど...
>>736 group byした結果をselectして別名付けてるんだから、別名は使えん罠。
漏れなら、view使いそうだけど、viewも使っちゃ駄目なのか?
743 :
デフォルトの名無しさん:03/06/12 10:19
viewって 重いやん。
不可能なことに時間を浪費するよりはましかと。
743ではないが・・・
viewって基本的に重くなるもんじゃないのか?
なんでそう思うのか聞きたい
748 :
デフォルトの名無しさん:03/06/14 00:27
>>747 OracleはVIEWを用いるとディクショナリを参照したり余分な内部コールが発生します。
その他、
管理が煩雑になりがち。
パフォチューの邪魔。
などデメリットだらけ。。。
セキュリティのためVIEWを用いたりする人もいるけど、
そもそもVIEWでセキュリティ管理しようとする時点で
そのシステムはセキュリティが甘い。
何もしない のと VIEW を比べるとVIEWが遅くなるけど、
SELECT と VIEW を比べるとどっちも変わらない。
>>749 そんなわけないでしょ。ちゃんと実行計画採取して比べてみた?
少なくともVIEWは余分に内部コールしている筈だよ。
といいつつ体感速度はそんなには変わらないと思うけど。
T-SQLでハマる俺はアフォでつか?
カプセル化という意味ではviewは使える。
擬似的に1つの(少数の)
tableのI/Oになる為、
(INは更新可能なviewであれば)
プログラマにはビジネスロジック
を意識させなくても良くなる。
(プログラムはシンプルになるし、
その分UI等、PG本来の製造に専念できる。)
viewの変更により、APを変更させなくても
集計結果値の変更等も行うことができる。
viewを使う、使わないのと
体感速度が変わらないなら
使うメリットの方が大きい。
パフォーマンスもレスポンスだけでなく、
開発、メンテ工数も含めた
パフォーマンスUpを目指さないといけない。
セキュリティの話が出たが、viewを使うと
セキュリティが甘いということは全然ない。
素のtableは基本的に所有者(管理者)
のみ突ける様にしておき、viewにより
各ユーザに相応の必要な部分だけ解放すれば、
カプセル化の意味ではセキュリティが強く
なると言える。
金融系では良くやる技だよ。
(T-SQLではストアドも結果セットが返せるから
ストアドで解放するという手もあるけどね。)
以上
>>752 ビューを使えば、データ型さえ変更しなければ表示値などのデータを
変更させたい場合、それを使うアプリ全部を変更しなくても良いのは
使えるね。
Javaなんかだと、テーブルをクラスにマッピング化させる方法が良く
用いられるけど、テーブルをジョインさせないといけない場合、ビュ
ーでマッピングさせるよね。
SQL Server 2000 EE ではビューにインデックスを張ることができる。
まぁ、ビューなのに実体を持つというウルトラCが使えます。
たとえば、日別売上データを Group By したビュー 月別売上データを
作るとする。他のデータベースだと 月別売上データを参照するたびに
集計が行われるんだけど、インデックス付きビューでは 集計結果が
実ストレージに格納されている。だから、月別売上データも即座に出てくる。
まぁ、あれだね。日別売上データへの変更をトリガで見張って、
別テーブルの月別売上データに加算している、ようなケースを
置き換えることができる便利機能だね。
755 :
デフォルトの名無しさん:03/06/14 21:59
並び順を2種類同時に設定することはできるのでしょうか?
たとえば掲示板で、
投稿者の名前順で並び替えて、
同じ投稿者が数人レスしている場合は
そのレスを新しい順に並べる
といったことです。
>> 754
Oracleで言えば、マテアライズド・ビューのようなものですね。
ストアドとかトリガーを使って集計テーブルを用意しておくようなときに便利そうですね。
でも、OracleにしてもSQL Serverにしてもエンタープライズエディションでないと使えないのが残念ですね。
>>755 order by 投稿者, 投稿日時 desc
>755
ヘルプをきちんと読みましょうよ。
760 :
デフォルトの名無しさん:03/06/16 23:05
企業名 路線名 駅名
-------------------------
JR 東海道線 東京
営団 有楽町線 池袋
JR 山手線 池袋
こんなテーブルで検索します。キーワードは「路線名」と「駅名」の
2つが一致したものを抽出させたいと思っています。
今のところ考えたものを載せます。
アドバイスください(T0T)
select*
from電車テーブル
where(SELECT 路線名 FROM 電車テーブル GROUP BY 路線名 HAVING COUNT(*) > 1)
AND
(SELECT 駅名 FROM 電車テーブル GROUP BY 駅名 HAVING COUNT(*) > )
order by 路線名
設問の意味が不明
>>760 ほんとに意味不明だな。ただ
Select * From 電車テーブル
Where 路線名 = '東海道線' And 駅名 = '東京'
とかやりたいだけじゃないだろうな?
764 :
デフォルトの名無しさん:03/06/16 23:47
路線名 駅名
--------------------
有楽町線 有楽町
丸の内線 丸の内
銀座線 銀座
三田線 三田
という出力結果が欲しいんでしょ?
『「路線名」と「駅名」の2つが一致」』
(1)
select * from 電車テーブル where 路線名 = '東海道線' and 駅名 = '東京'
(2)
select * from 電車テーブル where 路線名 = 駅名
>>760 それって、おまえの欲しい結果がでないどころじゃなく
SQL文としてエラーになるんとちゃうか?
select * from 花電車テーブル
言いたい事が書けずに...
企業名 路線名 利用駅名 終点
--------------------------------------
JR 東海道線 東京 小田原
JR 山手線 池袋 東京
営団 丸の内線 有楽町 池袋
営団 丸の内線 霞ヶ関 池袋
JR 東海道新幹線 小田原 東京
JR 京浜東北線 東京 大宮
営団 日比谷線 霞ヶ関 中目黒
結果的には
企業名 路線名 利用駅名 終点
--------------------------------------
JR 東海道線 東京 小田原
JR 京浜東北線 東京 大宮
営団 丸の内 霞ヶ関 池袋
営団 日比谷線 霞ヶ関 中目黒
で、利用駅と企業名が完全一致するレコードだけを抽出したいんです。
分かりにくくてスミマセン・・・アドバイスお願いします
利用駅と企業名を関連づけてあるテーブルを用意しろ
ますますわからん。
要するに複数企業にまたがってない奴だけを抜き出すのか?
そんなのそのテーブル一つでどうにかなると思ってるのか?
一時テーブルにグループ化したデータ作れば?
760はここに書き込む前にやるべき事が山ほどあると思う
select * from 花電車テーブル
とりあえず
SELECT 企業名, 駅名, COUNT(*)
FROM 電車テーブル
GROUP BY 企業名, 駅名
して、
776 :
デフォルトの名無しさん:03/06/17 09:48
>利用駅と企業名が完全一致するレコード
利用駅=企業名
という意味では ないな。
777 :
デフォルトの名無しさん:03/06/17 09:50
オブジェクトブラウザなんですが、
テーブルの内容を表示させて エクセルに出力しようとすると
「Range クラスの ColumnWidth プロパティを設定できません。」
というエラーが出るのですが、何が原因か わかりますでしょうか?
エクセルには、ダメだったけど、クリップボードには転送できた。
仕方ないが これで我慢するか。
select a.*
from 電車テーブル a
,(
select 企業名,利用駅名
from 電車テーブル
group by 企業名,利用駅名
having count(*) >= 2
) b
where a.企業名 = b.企業名
and a.利用駅名 = b.利用駅名
order by 企業名,利用駅名
>>777 すげーあてずっぽうだけど、
LONGの列を出力していて、
カラムサイズを広げようとしたところ、
Excelの制限以上に長い文字列が
設定されていてアボーンとか。
もしLONGの列があるなら、その列を
非表示にして出力してみては?
>>780 VARCHAR2(448)っていう項目があるけど、これが原因?
782 :
デフォルトの名無しさん:03/06/18 10:42
おしえてください。
Oracleから、SQLServerへの移行をやっています。
SQLServerで、ユーザー定義のグローバル変数ってできますか?
Oracleの、パッケージ変数の代わりにしたいのですが。
やっぱり、テーブルに書き込むしかないでしょうか
783 :
デフォルトの名無しさん:03/06/18 14:24
DBMS_SQL.EXECUTE したあと
DBMS_SQL.FETCH_ROWS で フェッチしたとき、この ROWの値は、
何を意味しているのでしょうか?
SQLで抽出した件数でしょうか?
DBMS_SQL.EXECUTE した時に、抽出できた件数って わかりますでしょうか?
785 :
デフォルトの名無しさん:03/06/18 22:23
pl/sqlでテーブルの存在があるかどうか調べるには
どうすればいいでしょうか?
>782
BOLくらい見れ
>>785 dba_tablesをselectしたら
788 :
デフォルトの名無しさん:03/06/19 09:48
789 :
デフォルトの名無しさん:03/06/19 16:33
昨日からSQLを始めました。
重複しない値を持つ列の中から一番大きな数値を読み出すにはどうすればいいでしょうか。
例えば、野球チームの選手のリストの中から、一番大きな数値の背番号を抜き出すなどです。
簡単でいいのでよろしくおねがいします。
osqlで、sqlplusの「set linesize」に相当する環境設定はないのでしょうか?
Books On Lineを見たところ、無さそうですが・・・。
>>789 > 簡単でいいので
HAVING、MAX、GROUP BY
lt;3gt;
<3gt;
<3>
<3>
>>791 そんなにいらねぇ。
SELECT MAX(背番号) FROM 野球選手
つか重複してようとしてまいと最大値は最大値でしかない訳で。
みなさんありがとうございました。
これでオラクルに就職できます。
800 :
デフォルトの名無しさん:03/06/20 07:16
800
801 :
デフォルトの名無しさん:03/06/20 09:27
>>798 そんなんで就職できるんだったら おれも就職できるぜ(w
803 :
デフォルトの名無しさん:03/06/20 10:08
804 :
デフォルトの名無しさん:03/06/20 20:49
postgresqlでなんだけどさ、
insert into "test" ("key","value") values (select count(*) from test,'値') ;
こんな事がしたいんだけど、どうすりゃいいのさぁ〜
これじゃ動かなかったわけだが・・・
オナガイシマッス。
Insert Into test (key, value)
Select Count(*), '値'
From test
>>805 へぇ〜、そうやるですか!
勉強なるました。
感謝します!
807 :
デフォルトの名無しさん:03/06/20 23:13
PostgreSQL7.0を使ってるのですが。
以下の式以外にindexを使用可能な式はありますか?
これは遅いってのもあればお願いします。
・索引列=条件式
・索引列<条件式
・索引列>条件式
・索引列<=条件式
・索引列>=条件式
・索引列 between 条件式 and 条件式
・索引列 in(条件式, 条件式・・・)
・索引列 LIKE 'パターン%'
なお、PostgreSQLはin句が遅いようですね。
809 :
デフォルトの名無しさん:03/06/20 23:16
DataEmvilomentDisigner ではレコードセットのクローズはどうするんだ。
Openも、Closeもなしにアクセスできるんだが。
それと今、DBアクセスが異常に重たいので修正中なのですが
何かポイントあれば教えてください。
重いSQL文は
9個のテーブルを連結している文で
4個のテーブルに対してIN句で条件が書いてあり、
テーブル2個は3万件、テーブル2個は1万件、テーブル1個は1万件、
テーブル1個は5000件、テーブル3個は100件。
連結キー、IN句の対象列にはB-treeのindexをつけています。
EXPLAINでのコストは2000程度。
実行秒数は14秒程度
(time psql -f 'SQL実行ファイル' > '実行結果保存ファイル')
811 :
デフォルトの名無しさん:03/06/22 01:56
select a.a1, b.b2
from a, b
where a.a2 in(1, 3, 4)
and a.a1 = b.b1;
上のようなSQL文の内部処理は
一般的にin句の処理がされてから結合処理されるのでしょうか?
もし結合処理が先なら、in句を初めに処理するよう強制する方法はありますか?
もしin句の処理が先なら、結合処理を初めに処理するよう強制する方法はありますか?
以下の文はfrom文の中のサブクエリーが先に処理されると認識してもよいのでしょうか?
select a.a1, b.b2
from (select *
from a
where a2 in(1, 3, 4)) as a, b
where a.a1 = b.b1;
>>807 関数付きIndexってのもあったと思うが
>>811 >一般的にin句の処理がされてから結合処理されるのでしょうか?
DBMSの実装によると思うが、たぶんそうなる。
>以下の文はfrom文の中のサブクエリーが先に処理されると認識してもよいのでしょうか?
これは100%そうです。
814 :
デフォルトの名無しさん:03/06/22 11:38
>>813 なるほどありがとうございます。
in句が先に処理されないと無駄な処理が発生することになるから当然ですよね。
select 男.*
from キャリア系,独立系
while 収入>aaa,イケテル度>bbb
aaa と bbb に入れるべき適切な条件を教えてください。おながいします。
あのさ、ここ SQL のスレだから...
SQL の構文くらいはちゃんと覚えてから、つまんないジョーク書こうね。
えーーーーー
会社のSさんは「この書き方でいいからどんどん書いて」って言ってたよー
>>817 何の作業でどんどん書けなどと言ったのだろうか。
Sさんとやらを、小一時間(ry
くだらないジョークを書く仕事なんだろう
822 :
デフォルトの名無しさん:03/06/23 16:14
>>803 そうだろうな。 おれは、もっと出来るからな(w
824 :
デフォルトの名無しさん:03/06/24 09:31
ポスグレで、
update table set val=val+1 where key='ct' ;
こんな事したいんだけど・・・
オナガイできますか?
>>824 そんなこともできないの?>ポスグレ
ちょっと考えちゃうなあ・・・。
827 :
デフォルトの名無しさん:03/06/24 23:33
>>812 確かに関数付きIndexもありましたね。
ありがとうございます。
>>826 From句書くのって SQL Server くらいじゃね?
>>824 set val=val+1 は普通にできるぞ。
エラーが出るなら詳細書け
valが数値型じゃなかったとかいう落ちか?
830 :
デフォルトの名無しさん:03/06/25 14:58
>>823 別に 三日間 考えてたわけじゃない。
休みを満喫してただけだ。
ちなみに ここは たまにしか 覗かないからな。
832 :
デフォルトの名無しさん:03/06/26 09:12
SQL server2000関連のFAQ集みたいのはありませんか?
データソースおよび指定された既定のドライバが見つかりません。
みたいなエラーが出て困っています。。
>832
Google以上のFAQが何処にあるってんだ?
つか、そのエラーメッセージってまんまじゃん。
何がおかしいかくらい予想できないのか?
834 :
デフォルトの名無しさん:03/06/26 20:30
SQL Windows Serverシリーズって
SQL関数群をWindowsカーネルにいれてるんですか?
どこらへんがノーマルNTカーネルと違うのでしょうか?
SQL Windows Server って何?
Oracleなんですが、
例えば外部結合とUNIONのどちらでも同じ結果が得られるときじゃ
どちらがコストがいいのでしょう?
一概にはいえませんかね。
実行計画を採取しろ!と言われそうですが、ふと気になったので。
>>833 SQLを昨日から使い始めたもので知識不足ですみません。。
具体的にはどこらへんを見たら詳細がわかるんでしょうか?
>>836 一概にはいえないから、実行計画を採取しる!
>>837 そのエラーはデータソースおよび指定された既定のドライバが見つからないということを
言ってるんだと思うよ。
>>840 泣いてる暇があったらデータソースか指定された規定のドライバ探せよ。
842 :
デフォルトの名無しさん:03/06/27 09:31
A,Bというテーブルがあったとして、
AとBのテーブルを見比べてBに無いものをAから削除したいんです。
但し、AとBを比較する条件は2つ以上なのです。
条件が1つならば
DELETE FROM A WHERE A.X = (SELECT A.X FROM A, B, WHERE A.X = B.X(+) AND B.X IS NULL)
こんな感じで出来ると思うんですが。
どうすれば良いのでしょうか?
宜しくお願い致します。
>>842 こんな感じでどう?
DELETE FROM A
WHERE (X, Y) NOT IN
(SELECT X, Y FROM B)
>>843 出来た!!
サンキュです。恩に着ます。
>840
あのな、苛めてるわけじゃなくて、本当にそれだけの事なの。
書いている意味がわからないなら、まずどの単語が分からないのかを洗いだして
その意味を1つ1つ調べていくしかないの。
たぶん君は「データソース」と「規定のドライバ」ってのが何を指すのかわからない
んだろうから、ヘルプとかGoogleとかでそれが何であるかを調べる事から始めな。
遠回りかもしれないけど、これをやらなきゃ何時までたっても何も理解できないままだよ。
845は妙にいい奴だな。
847 :
デフォルトの名無しさん:03/06/28 03:26
すいません、質問が2つあります
9iから使える新しいUPDATEで
あったら更新なかったらインサート(またはその逆?)
ができる構文おしえてください・・・
それからpl/sqlになるのですが
select into文で変数に値をぶちこむ時にfor update句ってつかえますか?
849 :
デフォルトの名無しさん:03/06/28 12:17
>>848 いいからぐだぐだいわず俺さまにおしえやがれ
おねがいします。
>>849 いいからぐだぐたいわず手前で調べやがれ
そのほうが早いし勉強になる
素直にSelectして、無ければInsert、あったらUpdateってすれば〜?
どうせ内部もそうなってるんだろうし、コストは変わらねーだろ。
>>851 普通、その手の処理はselectしない。
updateして、影響行がなければinsertする。
853 :
デフォルトの名無しさん:03/06/28 17:11
しらないから言えないだけなんだな・・・
ていうかupdateしてエクセプションでインサートするって
荒技ですか?
普通にやってたんですが。
>>853 何で例外処理でinsertというロジックになる?
荒技でもなんでもないけど...
pl/sqlなら
SQL%NOTFOUNDや
SQL%ROWCOUNT
T-SQLなら@@ROWCOUNT
で判定するだけだけど。
例外(DBエラー)が走れば普通にエラー処理するよ。
updateだけで終わるならそれで終わりだし、
一番コストがかからない方法だけど。
ちなみにDMLではDBエラーではなく
ただ単に影響行が0の場合はエラーとみなさないから、
影響行で判定しなければならないという場合は
結構存在するはずだけど...
あと、知らないから・・・が
どこにかかっているかは知らないけど、
oracleならmerge文を調べて見れ。
うまく釣れなかったな。答えがでると思ったのに〜。
>>845 ヘルプやgoogle検索で調べてましたが、あまり抽象的すぎてよく理解できませんでした(´・ω・`)
>>857 キミの質問も抽象的すぎて答えられないのも真実。
何使ってるんよ?。
859 :
デフォルトの名無しさん:03/06/28 19:33
>>354 begin
update文
exception
insert文
end
を文中に入れるかローカルプロシにする。
SQL%ROWCOUNT っていったんセレクトせにゃならんのちゃうん?
違ったっけ?
ダメなん?
強引?
普通に使ってた。
860 :
デフォルトの名無しさん:03/06/28 19:35
>>854の間違いね。
いったんセレクトするなんてカッコわるくてやだなぁ
マージは知ってるけど文法しらない。
だれかおしえて。
てかマージじゃなくてuodate文の文法変わったってほんと?
UpdateじゃなくてInsertが変わったんだろ。
SQL99だったかなぁ・・・。
862 :
デフォルトの名無しさん:03/06/28 20:28
質問があります。
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
上記の場合 2003-06-28 となり
SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"') FROM DUAL;
これの場合は 2003年06月28日 となりますよね?(今日なら)
記号を年月日の間に挟む場合は「"」を使わなくて
年月日を文字型にする場合はセレクト文の中に文字が含まれているから
括弧内は「"」を使わなければいけない、という認識でいいのでしょうか?
>>859-860 だからそれじゃダメだっていってるじゃん。
影響行が0でもexception
に飛ばない。
plsqlなら
BEGIN
update文
IF SQL%NOTFOUND THEN
insert 文
END IF;
EXCEPTION
例外処理
END;
例外はは一意制約やnot nullエラー、ユーザ等の
エラーのみ発生する。
>SQL%ROWCOUNT っていったんセレクトせにゃならんのちゃうん?
そんなことはないっつか、普通DMLで使う。
>強引?
>普通に使ってた。
それガクブルもんだよ。もし使ってたなら
今までのコード全て直さないと...
>>858 SQl Server2000です。
ちなみに対象はサーバープログラムの流出した某ネットゲームです(汗
s/ユーザ等のエラー/ユーザ(チェック)制約のエラー
&はが多かった
誰か教えてください・・
867 :
デフォルトの名無しさん:03/06/28 23:13
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|DBの種類は? .|
|________|
∧∧ ||
( ゚д゚)||
∧∧Λ
ピュ.ー ( ゜∇゜ )つ <
>>862(゜∇゜)/
=〔~∪ ̄ ̄〕 「ウンマンコ」
= ◎――◎
869 :
デフォルトの名無しさん:03/06/28 23:34
∧∧Λ
ピュ.ー ( ゜∇゜ )つ <
>>862 オラクルでしたか
=〔~∪ ̄ ̄〕 僕は、PostgreとMySQLしか使ったことない若輩モノですが
= ◎――◎ たとえばMySQLでは「"」と「'」どっちでも良かったのが
PostgreSQLでは「'」じゃないとエラーになります
そういう具合に、機種によって特徴があるのではないかと思います
だから
>>862で言っていた認識でいいのではないかと思います
スイマセン力になれなくて (゜∇゜)/ 「ウンマンコ」
872 :
デフォルトの名無しさん:03/06/29 01:15
>>863 あーごめん逆だ
インサートして一意だったらエクセプション飛ばしてupdate。
insert文とupdate文逆だ。
これだといいんじゃないの?
この書き方って主流かと思って多。
(ある場合は更新、という仕様でokの場合ね。
もちろん更新がメインの処理にはいれられないけど。)
873 :
デフォルトの名無しさん:03/06/29 01:17
ついでにもういっこ利いて良い?
select into文で変数に値ぶちこむときに
for updateでロックかけることってできましたっけ?
>>872 普通SQL%NOTFOUNDか何か使うと思うが・・・
>>862 正直、その書き方は知らなかった。
いつもは
SELECT TO_CHAR(SYSDATE,'YYYY') || '年' || TO_CHAR(SYSDATE,'MM') || ・・・・・
などと書いていた(アホまるだし)
お礼といってはなんだが、ORAのマニュアル調べたら
以下のような記述があった。
言葉の使い方(意味合い)をきちんとわかっていれば
ほぼあんたの考え通りで問題ないね。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
日付書式モデルにおける句読点と文字リテラル日付書式モデルでは、次の文字も指定できます。
ハイフン、スラッシュ、カンマ、ピリオド、コロンなどの句読点
文字リテラル(二重引用符で囲みます)
これらの文字は、戻り値の中で書式モデルに指定された位置と同じ位置に現れます。
>>875 わざわざ調べていただいて
ありがとうございます。
他にも指定できる句読点があるのですね。
ん「'」のエスケープの問題なら
SELECT TO_CHAR(SYSDATE, 'YYYY''年''MM''月''DD''日''') FROM DUAL;
でいいのでは?
試してないから、できなかったらゴメソ。
!= <> ^= の中で使用頻度が高いのってありますか?
879 :
デフォルトの名無しさん:03/06/30 20:37
SELECT文でorder by **して上位20件を取り出すってこと出来ます?
一旦全部セレクトしてプログラムで20件を処理するのは簡単なのですが、
負荷がかかりそうなのでsqlの方で出来てしまえばベストなのですが・・・
>>879 このスレでもかなり既出だが、聞くなら聞くでDBMS名書こうな
DBはpostgresqlです
882 :
デフォルトの名無しさん:03/07/01 09:19
>>880 多分 DBを聞いても、フェッチするしかないという回答になりそうな予感。
883 :
デフォルトの名無しさん:03/07/01 09:21
>>878 ← 半角スペース
これが 一番、使用頻度が高いだろう。
二番目は != かもしれない。
886 :
デフォルトの名無しさん:03/07/01 14:34
年上女・・・いいなぁ・・・当方30歳(w
>>879 DBMSによっては SELECT TOP n が、使える。
pgsqlなら LIMIT だな。
ただし、6.5以降が対象だが、いまさらそんなに古くないよな?
890 :
デフォルトの名無しさん:03/07/02 14:15
(1) FROM 甲, 乙 WHERE 甲.コード = 乙.コード
(2) FROM 甲 LEFT JOIN 乙 ON 甲.コード = 乙.コード
(3) FROM 甲,乙,丙
(1)のようにテーブルが二つの場合は、(2)のように書けますが、
(3)のようにテーブルが三つの場合はLEFT JOINではどのように
かけばよいのでしょうか?
891 :
デフォルトの名無しさん:03/07/02 14:18
892 :
デフォルトの名無しさん:03/07/02 14:21
>>879 Oracleなら、8i 以降であれば、サブクエリーの中で ORDER BY 出来る。
サブクエリーの外で ROWNUM<=20 で取れ。
893 :
デフォルトの名無しさん:03/07/02 14:22
MS SQL Server もしくは、Sybase で、ログインIDに有効期限を設定する方法が
わかりません。
sp_configure だと、全ユーザーが対象だし、いくら検索をしてみても、これぞ、と
いうものが見つかりません。
すみませんが、どうぞ教えて下さいませ。
失礼いたしました
>>890 RIGIT JOINを使いましょう。
FROM 丙
RIGIT JOIN 甲 ON 丙.コード = 甲.コード
LEFT JOIN 乙 ON 甲.コード = 乙.コード
(1) FROM 甲, 乙 WHERE 甲.コード = 乙.コード
これを外結合(Left/Right/Full Outer)で書き直しちゃだめだよ。
これと同じ結果になるのは 内結合 だから、
(2) FROM 甲 INNER JOIN 乙 ON 甲.コード = 乙.コード
と書いてくんさい。
で、テーブルが 3つ以上あっても続けて書ける。
FROM 甲
INNER JOIN 乙 ON 甲.コード = 乙.コード
INNER JOIN 丙 ON 甲.コード = 丙.コード
先頭から順に評価(結合)されていくよ。結合順を変えたい場合は、
( ) で括ってくんさい。
Access2000(Jet)のヘルプを見ると
CREATE TEMPORARY TABLE hoge(foo autoincrement)
とかけばテンポラリテーブルが作れるように書いてあるのですが、実際に
実行すると構文エラーがでて、"TEMPORARY"の部分が選択された状態に
なってしまいます。
Access2000 では、テンポラリテーブルを利用できないのでしょうか。
文がおかしいようでしたら、正しい文を教えて頂けると有難いです。
900 :
デフォルトの名無しさん:03/07/03 01:23
テーブル S200306 (約480万件)
A_C int(1) / B_C varchar(60) / C_C varchar(60)
テーブル I200306 (約480万件)
X_C varchar(60) / D_C int(8) / E_C int(5) / F_C date
SELECT S.A_C,S.B_C,S.C_C,I.D_C,I.E_C,I.F_C FROM S200306 S,I200306 I WHERE
S.ID=I.ID AND I.X_C LIKE BINARY '%XXXXX%' ORDER BY I.YMD_C DESC;
30 rows in set (6.09 sec)
SELECT S.A_C,S.B_C,S.C_C,I.D_C,I.E_C,I.F_C FROM S200306 S,I200306 I WHERE
S.ID=I.ID AND I.X_C LIKE BINARY '%XXXXX%' ORDER BY I.YMD_C DESC LIMIT 0,50;
30 rows in set (16.90 sec)
以上のようにクエリの最後にLIMIT 0,50と付けた場合は表示結果が同じであるのに
10秒以上も時間がよけいにかかります。
検索結果が50件以上の場合は検索時間が短縮されますが検索結果50件以内の
場合は上記のようにかなり遅くなってしまうので困っているのですが何か改善策は
あるのでしょうか?
902 :
デフォルトの名無しさん:03/07/04 23:28
朝家の前を通る女子中学生にINSERTしたいんですが
命令の仕方教えて下さい
>>903-906 まずはログインできるのかが問題だろ?
テーブル領域とか、Grantとか、排他はその後だ。
>>907 それ以前に、本当に対象が存在するのか、が大事だと思うが。ログイン自体できんぞ。
物理レベルで非互換なネットワーク上にある可能性も。
903がウイルスとして排除されるに3オラクル
911 :
デフォルトの名無しさん:03/07/09 15:31
このたび中国語をMSSQLで扱うことになりました。で以下のことをしました。
翻訳家の指示によりサーバマシンに地域オプション(どうやらフォントのインストール)をしました。
サーバではワードに書かれた中国語が文字化けせず表示できるようになりました。(ワードはテスト用に翻訳家からもらったもの)
で、Webで調べて、MSSQLでデータ型をNvarcharにし、ASPに書いたSQLを「N'中国語'」という風にNをつけました。
ASPのキャラクターセットは、UTF-8 UTF-16 gb-2312と試してみました。が文字化けしました。
ただしASPの画面から中国語の入力テストはワードからのコピペでもしかしたらコピペ元がUnicodeじゃないのでまずいのかなと考えています。
一度URLを教えてその翻訳家に直接ブラウザから入力してもらおうと考えていますが、中国語などを扱った経験のあるかたアドバイスお願いします。
いつも使ってるメーリングリストの過去ログサーバが先日からぶっ飛んでる上に客先からせかされてしまってます。汗
データベース以前にASPサーバの時点で文字化けしてました。
>>911 サーバは日本語版なの?
SQL Serverは日本語版?
中国語使ったことあるわけじゃないけど、そういう使い方するにはどうしたらよいか
MSにでも聞いてみたら?
まさかそういう確認せずに仕事してるわけじゃないよね?
文字コードを自前で変換かけてUTF-16あたりにそろえておいて、
バイナリとしてSQL Serverに入れることにしておいて、ASPではバイナリを
出力の文字コードに変換するとかしてやれば、なんとなくできる気はするが
やれといわれてもやりたくないな。
>>911 それは、DBレベルではきちんと中国語を扱えているということなの?
ASPがどーしたよりも、まずはそこからきちんとしないとねぇ。
無責任発言スマソ
>>915 会社個人共に割れ厨ピーコ厨が多かったんだろうなぁ
ついでに市場独占も狙いか。開発用途のみとはいえ露骨過ぎ
え〜私903ですが
出来ました
はい、中学生に中田氏しますた
やらないか?
これだけでOKでした
すごいつまらないね
postgresで日付の演算をおこなっているのですが
timestamp型で宣言されているフィールドに20000秒を足すような
処理をおこないたいのです。SQLで表現可能?
920 :
デフォルトの名無しさん:03/07/11 15:20
webProg板から移動してきました。
行き詰っております、どうかご教授お願い致します…。
まず、以下のようなテーブルがあるとして
--TableA メンバー
id|name|
1 |山田|省略
2 |田中|…
3 |小泉|
--TableB 色テーブル
id|color|
1 |c001 |
1 |c002 |
2 |c001 |
3 |c003 |
色テーブルにメンバーの所持(?)している色が入っています。
色コードc001を持っているメンバーを検索した時、
1 |山田|c001|
2 |田中|c001|
がヒットしますが、この時各メンバーのそれ以外の色コードもどうにかして取得したいと思っています。
この場合、山田の残りの c002 です。
一回のSELECTでこれを取得する事は出来るでしょうか?一度のSELECTに拘る訳ではないです。
試行錯誤してみたものの、まるで的外れな方法しか出来ません…。
どうぞお願いします(T.T)
>>920 簡単すぎて鼻痔がでそう。
相関名使ってTableBを2回使え。
923 :
デフォルトの名無しさん:03/07/11 17:43
>>900 LIMITを使わない。
SELECT文のオプションはつければつけるほど検索速度が遅く
なります。当たり前ですけれども。
速度を優先するならばこれらのオプションはできるだけ使わず
に自分で処理するのが賢明です。
たとえば、Cの埋め込み型SQLでこのSELECT文を使っている場合
は、最初の50レコード分の(BULK)FETCHして処理をやめるという
ことで対応ができるはずです。
>>922 エイリアス(相関名)だけはできない。
>>920 SELECT B.id,A.name,B.color
FROM TableB B,TableA A
WHERE B.id = A.id AND
B.id in (
SELECT id FROM TableB
WHERE color = 'c001'
)
s/エイリアス(相関名)だけはできない。/エイリアス(相関名)だけではできない
>>922>>924 有難うございます!!
しかし、私の情報提供不足で本当に申し訳ないのですが…
MySQLを使用している為、サブクエリーは使えないようです。
…と言う場合、ヒットしたidで再検索するしかないでしょうか?
>>927 MySQL でできるかとわからんけど...
select TableA.id, TableA.name, TableB2.color
from TableA, TableB as TableB1, TableB as TableB2
where TableA.id = TableB1.id and TableB1.id = TableB2.id
and TableB1.color = 'c001';
id | name | color
-----------------
1 | 山田 | c002
1 | 山田 | c001
2 | 田中 | c001
PostgreSQL 7.2.3 on i386-portbld-freebsd4.7, compiled by GCC 2.95.4 では動作した。
>>928 ごめん、select の後に全角空白文字が入っちゃったからこぴぺするなら、気をつけてくれ。
あ〜なるへそ、多対多でjoinする方法ね。
サブクエリ使えなく、一発でもってくるなら
それしか方法はないね。
でも、テーブルのレコード数がカナーリ多くなったときに
2回に分ける、もしくはサブクエリと比べると
結構処理速度がきつくなるかもしれない。
>>928 有難うございます(>ω<)
ほぼ、希望通りの結果を得る事ができました。
これを参考に、他にも色々な事に応用できればいいと思います。
あとは、プログラムの方で弄くって行きたいと思います。
>>930 現在のところ、それほどデータ数が増える予定はありませんが
今後増える傾向にあれば、再考したいと思います。
MySQLも時期Verでは、サブクエリが使えるようになるらしいので、それまでの辛抱でしょうか。
私、実はつい最近(昨日)正規化について覚えたばかりなんですが
テーブルを結合した場合、これは一時的に全てのパターンのレコードを作成する
ような解釈で良いのかな…?
本当に、ご助言有難うございました。
検索の条件式について確認したい事項があります
条件の値が文字列のい場合はシングルコーテーションでくくり
数値型の場合はくくらいないで記述しています
ですが、列の型がわからない場合、数値型も文字列型も関係なく
値をシングルコーテーションでくくって記述するのはまずいでしょうか
Oracle8でNUMBER型に対してシングルコーテーションでくくった記述
のSQLで望むとおりの検索が行えたのですが、これはOracleだけの
機能なんでしょうか
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
>932
数値型に対してシングルクオートで括ったWhereを書くと、型の不一致が出るDBMSもある。
つか、事前に列の型が分からないってどういう状況やねん?
935 :
デフォルトの名無しさん:03/07/15 16:27
ある日付からある日付までの間に、日曜日が何回あるかを調べるには
SQL文ではどう書けば宜しいのでしょうか?
DBサーバ上でやるなら、
ある日付から1日づつDATEADDし、
ある日付の曜日に対して(DAYNAME=日曜)だったらカウントを
上げある日付までループさせ、カウント値を返すストアドプロシージャ
もしくはファンクションをつくる。
>>935 何週間経ったか、なら、
TRUNC( (ある日付 - ある日付) / 7 )
とかで行けるけどな。(for Oracle)
日曜日が何回、はSQL文だけでは無理ぽ。
FUNCTION作れば?
>936 >937
ありがとうございます。
やはりSQL文だけでは無理ですか、、、、、。
素直にPHPでスクリプト書きます。
「やはり」ってそんなこと臭わせてないかったじゃん。
TRUNC(終了日 - NEXT_DAY(開始日 - 1, '日') / 7)
('日' は、NLS_PARAMETER によっては 'Sun')
あ、最後に +1 忘れた。
>>940 TRUNC使ってるから、Oracleだな?
NEXT_DAYって何?
> 「やはり」ってそんなこと臭わせてないかったじゃん。
うっ、するどい。
>934
ありがとうございました。
やっぱり、DBMSによっては不一致になるものもあるんですね。
ちなみに、状況は汎用で使うDBアクセス系ツールの作成中です。
*そうそう手抜きはできないか……。
945 :
デフォルトの名無しさん:03/07/17 12:15
至急教えてください!
SQL SERVER 2000でTABLE1に
ユーザID 分類1 分類2 日付
M0010 AAA BBB 2003/07/17 15:00
M0010 BBB CCC 2003/07/17 15:50
M0020 AAA BBB 2003/07/18 08:00
M0020 BBB CCC 2003/07/17 10:50
M0050 FFF BBB 2003/07/18 08:00
M0050 WWW CCC 2003/07/17 10:50
M0050 WWW CCC 2003/07/17 12:50
となっていた場合
ユーザID 分類1 分類2 日付
M0010 AAA BBB 2003/07/17 15:00
M0020 AAA BBB 2003/07/18 08:00
M0050 WWW CCC 2003/07/17 12:50
と、データが出現する順番で各ユーザIDの先頭レコードを返すように
クエリを作りたいのですが、こんなことできますでしょうか?
OSはXPなんですが、
TTSSH、TeraTerm Pro をインストールして、接続までできたんですが、
文字が全く入力出来ないんです。
キーボードの設定が悪いのでしょうか?
どうすれば文字が打てるようになるのか教えて下さい。
948 :
デフォルトの名無しさん:03/07/17 14:14
>>946 そうです。日付時間の若い順です。
関数があればベストなのですが。できないですかね。
>>945 SELECT ユーザID,MIN(日付)
FROM hoge
GROUP BY ユーザID.
分類1と分類2も必要なら結合しる。
950 :
デフォルトの名無しさん:03/07/17 16:32
オラクルで言う ”Select A || B From C”のようにAとBをつなげて出力したいのですが、
SqlServerではどのように表現すればいいのか教えてください。
お願いします。
&っしょ
952 :
デフォルトの名無しさん:03/07/17 19:23
>>949 これではだめなのです。
SQL SERVER 2000でTABLE1に
ユーザID 分類1 分類2 日付
M0010 AAA BBB 2003/07/17 15:00
M0010 BBB CCC 2003/07/17 15:50
M0020 AAA BBB 2003/07/18 08:00
M0020 BBB CCC 2003/07/17 10:50
M0050 FFF BBB 2003/07/18 08:00
M0050 WWW CCC 2003/07/17 10:50
M0050 WWW CCC 2003/07/17 12:50
これ自体もSQLクエリの値でORDER BYしております。
分類1.2を含めたらGROUP BYできないのでは?
>>952 未検証。
同一ユーザに同じ日付が複数合ったら知らん。
SELECT h1.* FROM hoge h1
INNER JOIN(
SELECT ユーザID,MIN(日付) AS 日付
FROM hoge
GROUP BY ユーザID) AS h2
ON h1.ユーザID = h2.ユーザID AND h1.日付 = h2.日付
ORDER BY h1.ユーザID
954 :
デフォルトの名無しさん:03/07/18 14:00
select文だと複数のテーブルにアクセスできますが、
updateやinsertはどうですか?
一度の複数のテーブルのレコードを変更できたりしますか?
自分でやってみたらダメだったんですが。
956 :
デフォルトの名無しさん:03/07/18 15:02
なにがだめなんですか!
960 :
デフォルトの名無しさん:03/07/18 16:40
よくある30件づつってゆーのは
SQLで指定しているのが普通でつか_?
>>960 Postgresなら、LIMIT,OFFSETがあるから、SQLで指定するのって楽勝なんだけど、
オラクルとかって、どうするんだろうな。
963 :
デフォルトの名無しさん:03/07/18 20:24
Oracleです。下のSQL文、もっとシンプルに書けないでしょうか?
何がやりたいかと言えば、TBLからCD毎に件数の一番多いVLを取得、です。よろしくお願いします。
SELECT a.CD,a.VL FROM
(SELECT CD,VL,COUNT(VL) CNT FROM TBL GROUP BY CD,VL) a,
(SELECT CD,MAX(CNT) MCNT FROM
(SELECT CD,VL,COUNT(VL) CNT FROM TBL GROUP BY CD,VL)
GROUP BY CD) b
WHERE a.CD = b.CD AND a.CNT = b.MCNT
データベースの中にファイルの中味をそのまま入れる方法はないでしょうか?
#SQLでなければ、できるようなフリーソフトを教えていただいても
#ありがたいのですが
>>964 ある。
が、DBMSにより方法は異なる。
おまいさんの使ってるDBはなんじゃらほい。
Oracle(8以降)とSQL server です。
BLOB、ぐぐってみましたが、うまくヒットしません。
#うー、キーワードの組み合わせが悪いのだろうか。溺れそうだ。
SQL Server 使ってんなら、BooksOnLine で
「BLOB」か「image データ型」で調べてみなよ。
っていうか google でも、ちゃんと該当するよ。
あんた調べる気ないんだろ?
>>964 もうサポートに聞け
サンプルコードぐらい出るだろ(w
質問です。
レシートに記載されてる項目を表にした。
<表1>
レシート 日付 時間 商品名 単価 数量 小計 税金 預かり金 お釣
番号
1 2003.6.17 11:30 ホットケーキ 300 1 600 30 1000 270
チーズケーキ 300 1
2 2003.6.17 12:01 アイスコーヒー 300 1 1400 70 2000 530
ホットコーヒー 300 1
ハムトースト 400 1
シフォンケーキ 400 1
●各レシートは、レシート番号と日付により一意に決まるので、{レシート番号、日付}は
候補キーである。他に候補キーはないので、これを主キーとした。
●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
●関数従属は他にもある。
あ、失敗しました。
質問です。
レシートに記載されてる項目を表にした。
<表1>
レシート 日付 時間 商品名 単価 数量 小計 税金 預かり金 お釣
番号
1 2003.6.17 11:30 ホットコーヒー 300 1 600 30 1000 270
チーズケーキ 300 1
2 2003.6.17 12:01 アイスティー 300 1 1400 70 2000 530
ホットコーヒー 300 1
ハムトースト 400 1
シフォンケーキ 400 1
●各レシートは、レシート番号と日付により一意に決まるので、{レシート番号、日付}は
候補キーである。他に候補キーはないので、これを主キーとした。
●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
●関数従属は他にもある。
質問です。
レシートに記載されてる項目を表にした。
<表1>
レシート 日付 時間 商品名 単価 数量 小計 税金 預かり金 お釣
番号
1 2003.6.17 11:30 ホットコーヒー 300 1 600 30 1000 270
チーズケーキ 300 1
2 2003.6.17 12:01 アイスティー 300 1 1400 70 2000 530
ホットコーヒー 300 1
ハムトースト 400 1
シフォンケーキ 400 1
●各レシートは、レシート番号と日付により一意に決まるので、{レシート番号、日付}は
候補キーである。他に候補キーはないので、これを主キーとした。
●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
●関数従属は他にもある。
何度もすみません。
位置がずれていますが、スペースで何とかわかってもらえますでしょうか・・・。
レシート番号、日付、時間、小計、税金、預かり金、お釣りのデータが入ってるのは、
1行目と三行目だけです。
上の続きなのですが、
「問題1」
表1を以下の表2と表3に分解した。
(1)表2、3の主キーを示せ。
(2)この分解は、無損欠結合分解か?
(3)表2、表3は第一正規形か?
<表2>
レシート番号 日付 商品名 単価 数量
1 2003-6-17 ホットコーヒー 300 1
1 2003-6-17 チーズケーキ 300 1
2 2003-6-17 ジンジャエール 300 1
2 2003-6-17 ホットコーヒー 300 1
2 2003-6-17 ハムトースト 400 1
2 2003-6-17 シフォンケーキ 400 1
<表3>
レシート番号 日付 時間 小計 税金 預かり金 お釣り
1 2003.6.17 11:30 600 30 1000 270
2 2003.6.17 12:01 1400 70 2000 530
<問題2>表3は、第三正規形でない。その理由を示せ。
この問題の答えを教えて下さい。お願いします。
(上の二つの表もずれていたらすみません)
質問です。
レシートに記載されてる項目を表にした。
<表1>
レシート 日付 時間 商品名 単価 数量 小計 税金 預かり金 お釣
番号
1 2003.6.17 11:30 ホットコーヒー 300 1 600 30 1000 270
チーズケーキ 300 1
2 2003.6.17 12:01 アイスティー 300 1 1400 70 2000 530
ホットコーヒー 300 1
ハムトースト 400 1
シフォンケーキ 400 1
●各レシートは、レシート番号と日付により一意に決まるので、{レシート番号、日付}は
候補キーである。他に候補キーはないので、これを主キーとした。
●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
●関数従属は他にもある。
976 :
デフォルトの名無しさん:03/07/25 01:28
上げておく
もうちょっとで次スレっすね。
977 :
デフォルトの名無しさん:03/07/25 05:40
>>974 問題1
(1)
表2 レシート番号 日付 商品名
表3 レシート番号 日付
(2)
情報無損失分解である。
(3)
表2 第一正規形(繰り返し項目はないが部分キーである「商品名」に「単価」が部分関数従属しているため)
表3 第二正規形(繰り返し項目はない。部分関数従属していない。「お釣」が「小計、税金、預かり金」に対して推移関数従属しているため)
問題2
問題1(2)表3の解説によるため
978 :
デフォルトの名無しさん:03/07/25 05:44
>>977 やべ間違えた。思いっきり
> ●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
てかいてあるじゃん。
問題1
(3)
表3 第二正規形(繰り返し項目はない。部分関数従属していない。「税金」が「小計」に対して推移関数従属しているため)
内税/非課税商品には対応しなくていいの?
>>979 いいのよ〜。
●税金は、小計*0.05で計算する。言い換えると、税金は小計に関数従属する。
これ↑が仕様だ。
早く、次スレ立てろよ?
だめ。