お世話になります。

SQLについての質問です。

RDBMSはSymfowareです。

IN句に副問い合わせを指定するSQLと
その副問い合わせの結果を直接IN句に記載したSQLで
結果が異なってしまいます。

こういうことってありますでしょうか。

以下のようなSQLです。

(1)
SELECT
*
FROM
T1
WHERE
T1.column_A IN (
SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX'
)

上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。

(2)
SELECT
*
FROM
T1
WHERE
T1.column_A IN ('A','B','C','D')

この(1)、(2)のSQLの結果が異なってしまいます。

私の環境では(1)では0件、(2)では2件ヒットします。

なぜこのようになるのかわかる方がいらっしゃいましたら
ご教授ください。

ちなみに、DBを操作して、副問い合わせのSELECT文の結果を
'A'、'B'とすると同じ結果が得られます。

副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの
結果は0件になってしまいます。

RDBMSの障害でしょうか・・・?

それとも、IN句に副問い合わせを使用する場合、
その副問い合わせの結果は2件以下にする必要がある
なんてルールがあったりするのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。



他に、NULL値が返ってきていませんか?

この回答への補足

質問者です。

すみません、追加でわかったことがありますので、補足欄使わせてください。

-------------------------
お世話になります。

本現象に関してさらに切り分けをすすめて、
新たなことがわかりました。

>上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。

と書いた部分ですが、これは質問のため私が作ったものでして、
実機で動かした結果ではありませんでした(´Д`;)

現象発生時の副問い合わせの結果は、
実際はこのような簡易なものではありませんでした。

そこで、本当に実機で動かして得られた結果を以下に記載します。

・副問い合わせの結果→結果
という形式で書きます。

・'A'、'AA'→発生
・'A'、'B'→発生せず
・'A'、'B'、'C'→発生せず
・'AB'、'ABC'→発生
・'AB'、'ABC'、'B'→発生
・'B'、'BA'→発生

という感じで副問い合わせの結果間で文字列が
前方一致しているものが存在する場合に発生するようです。

SQLってこういうものなのでしょうか?

副問い合わせの結果の件数とは関係なかったようです。
申し訳ありません。

補足日時:2011/04/28 11:11
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

副問い合わせで検索している項目はNOT NULL制約があり、NULL値は返ってきていません。

困りました。。。

お礼日時:2011/04/28 08:49

> IN句に副問い合わせを使用する場合、


> その副問い合わせの結果は2件以下にする必要がある
> なんてルールがあったりするのでしょうか。

ありません。
即値でIN句を使う場合は、指定できる即値について制限
がある場合はありますが。(Oracleなら1000個まで)
本当におっしゃっている現象が起きているならsymfoware
の問題である可能性があるので富士通に相談されたほうが
いいと思います。

この回答への補足

お世話になります。

上の補足をアップしたあと、さらに調査を進めたところ、発生条件がよくわからなくなってきましたので、申し訳ないですが、質問は一旦閉めます。

もっと情報をまとめてから再度ご質問させていただきます。

ありがとうございました。

補足日時:2011/04/28 16:37
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

そうですよね。
私の理解が間違っているのかと思いました。

nora1962さんのおっしゃるとおり、一度開発元に問い合わせてみようと思います。

お礼日時:2011/04/28 08:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「不快な思いをさせてしまい、申し訳ありません。」と言っておきながら…

gooの運営サポート側に、有るお問い合わせをした時の事なんですが、
「不快な思いをさせてしまい、申し訳ありません。」と
一応の謝罪をする回答を頂きました。

しかし、その後に不快な思いをする、させるような対応をするのは、
一体、どういった事なんでしょうかね?
嫌がらせなんでしょうかね?

「不快な思いをさせてしまい、申し訳ありませんが、
 不快な思いする、させるような対応をさせて頂きますので、
 ご了承下さい。」という意味が含まれているのでしょうか?

そうった状況やケースを想定しての事なんですが、
このような時に、
「そちらは、謝罪する回答をしておきながら、
 利用者に不快な対応をするのは、一体どういった事なんですか?
 利用者が不快になるような対応をされているのでしょうか?
 或いは、不快にならないような対応能力が無いのですか?
 各担当者達に、利用者が不快になるような指導をしているのですか?
 そういった、無能で馬鹿の担当者は辞めた方が(或いは辞めさせた方が)
 良いと思いますよ。」

というような、苦情やクレームのお問い合わせをした場合は、
運営サポート側は、対応の改善をすると思いますか?

それとも、聞く耳持たぬの無視するような対応を取り続けて、
対応の改善をしようとはしませんか?

または、更に不快で不愉快になるような対応を意図的、故意的に
してくると思いますか?

それでは回答、ご意見をよろしくお願いします。

gooの運営サポート側に、有るお問い合わせをした時の事なんですが、
「不快な思いをさせてしまい、申し訳ありません。」と
一応の謝罪をする回答を頂きました。

しかし、その後に不快な思いをする、させるような対応をするのは、
一体、どういった事なんでしょうかね?
嫌がらせなんでしょうかね?

「不快な思いをさせてしまい、申し訳ありませんが、
 不快な思いする、させるような対応をさせて頂きますので、
 ご了承下さい。」という意味が含まれているのでしょうか?

そうった状況やケースを...続きを読む

Aベストアンサー

「カスタマーサービスのマニュアル」に沿って謝罪はしているけれども、改善する気がない時の対応ですね。

消費者の要望や意見が会社の利益に繋がる場合は、即意見要望が改善に反映されますが、利益に繋がらない場合、「不快な思いをさせて申し訳ありませんが、(改善する気は無いので)ご了承ください。」という対応になると思います。

Q複数の副問合わせにて、一つだけデータがない場合の対処法は?

テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。
そして以下のようなSQLを作りました。

SELECT
TBLA.SURYO_1 ,TBLB.SURYO_2 ,
TBLC.SURYO_3 ,TBLD.SURYO_4
FROM
(SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA,
(SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB,
(SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC,
(SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD

しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は
データがないことにより、SQLを実行すると、対象データがないという結果となります。

当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、
出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ
を取得する方法はありますでしょうか?


よろしくお願いします。

テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。
そして以下のようなSQLを作りました。

SELECT
TBLA.SURYO_1 ,TBLB.SURYO_2 ,
TBLC.SURYO_3 ,TBLD.SURYO_4
FROM
(SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA,
(SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB,
(SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC,
(SELECT SUM(SURY...続きを読む

Aベストアンサー

>「GROUP BY SURYO」は年月(YYMM)とするつもりでした。

それでもおかしいんですが・・・
where TEST_KUBUN = '1' and YYMM='0308'
とかならわかりますが。

group byの場合、複数の年月のレコードが存在する場合は、結果は当然ながら集計されて出てきます。
ひとつのselect文(インラインビュー)から複数行が返された場合、結合条件がないこのSQLでは直積が返されます。


で、Oracleということなんで次の方法で出来ます。

1.selectのフィールドにインラインビューを使用する。

SELECT
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY NENGETSU ) SURYO_1,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY NENGETSU ) SURYO_2,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY NENGETSU ) SURYO_3,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY NENGETSU ) SURYO_4
FROM DUAL;

dual表を使うのがポイントです。
ただし、1つの区分で年月が複数あったら元のSQLと同様、すごいことになりますよ。


2.decodeを使用する。

select
sum(decode(TEST_KUBUN, '1', SURYO, 0)) SURYO_1,
sum(decode(TEST_KUBUN, '2', SURYO, 0)) SURYO_2,
sum(decode(TEST_KUBUN, '3', SURYO, 0)) SURYO_3,
sum(decode(TEST_KUBUN, '4', SURYO, 0)) SURYO_4
from TEST_TABLE
group by YYMM;

これなら、複数の年月があっても正しく表示されます。

効率も、走査が1回だけのこのSQLが一番いいはずです。
SURYOの合計が0のときに0ではなくNULLがいいのであれば、
さらにdecodeで包めばNULLに出来ます。

>「GROUP BY SURYO」は年月(YYMM)とするつもりでした。

それでもおかしいんですが・・・
where TEST_KUBUN = '1' and YYMM='0308'
とかならわかりますが。

group byの場合、複数の年月のレコードが存在する場合は、結果は当然ながら集計されて出てきます。
ひとつのselect文(インラインビュー)から複数行が返された場合、結合条件がないこのSQLでは直積が返されます。


で、Oracleということなんで次の方法で出来ます。

1.selectのフィールドにインラインビューを使用する。

SELECT
(SE...続きを読む

Q「送らさせて頂きます」という言い方

「送らさせて頂きます」や「送らさせて頂きました」という言い方はおかしいのでしょうか。
「お送りさせて頂きます」や「お送りさせて頂きました」が普通使う言い方なのでしょうか。

「送らさせて頂きます」で検索をかけると結構な数がヒットしますがいかがな物なのでしょうか。

Aベストアンサー

文法的には、「送らさせて頂きます」は「サ入れ現象」と言われ、「ラ抜き」と同様によくある誤りです。「送らせて頂きます」とするべきです。

「~させて頂く」という言葉は、丁寧なクセに恩着せがましいところがあり、よい印象を懐かない方も多くいらっしゃるようなので、「お送り致します(致しました)」を用いる方が妥当です。

多くの人がうっかり使ってしまうあまり綺麗ではない日本語、というところでしょうか。

QPL/SQLでFROM句に変数を使いたい

PL/SQL初心者なので方法があるかないかもわかりません。
SELECT TABLE_NAME
FROM USER_TABLES
で取得したテーブルを
PQL文に使用したいのですが可能ですか?
一応動的(DBMS_SQLを使用した方法)にSQLを作成することはできたのですが
パフォーマンスを考えると静的に使用したいのです。
動的、静的の表現でいいのかわかりませんが普通に
PL/SQL中にSQL文を使いたいんですがいかがでしょうか?

Aベストアンサー

再びです。
はっきり結論付けなくてすみません。

完全に否定したわけではありませんが、以前サポートに似た質問をしたところできないといわれました。

あとパフォーマンス的にとおっしゃっていますが、作り方によりますが、SQL文のアクセスパスパスが決まらないのは、PL/SQL内の固定SQL文も、動的SQL文も同じだと思います。差が出るのは、SQL文自身の解析が、固定SQL文と動的SQL文の違いになると思いますが、以前テストしてみたら、その部分は大きな差はなかったと思いますが・・・。

いずれにしても、たいした力になれなくて申し訳ありません。

Q「扱う」の"させていただきます"表現

「扱う」を"させていただく"という表現にした場合、正しいのはどれでしょか?

 ・扱わせていただく  (33,600)
 ・扱いさせていただく (831)
 ・扱わさせていただく (674)
 ・扱させていただく  (9)
 ・扱せていただく   (1)
            括弧内はWEB(google)検索数

私は、"扱させて"を使用していたのですが、WEBで検索したところ"扱わせて"が圧倒的に多かったことに驚きました。

そもそも、謙譲語で"~させていただく"という表現は正しくないという意見もありますので、どれも正しくないが正解かもしれません。

Aベストアンサー

・扱わせていただく  (33,600) 一般的に使用されます。
・扱いさせていただく (831)「取扱い」させていただくなら正しい。
・扱わさせていただく (674)「さ入れ言葉」の誤り
・扱させていただく  (9)明確な誤り
・扱せていただく   (1)明確な誤り

わたしは「扱わせていただく」もへりくだりすぎて好きではありません。
「お取扱いいたします。」くらいでしょうか。

QSQL研修で使うSQLツール

会社からSQLを新人たちに教えるように言われておりまして、教育環境の構築に悩んでおります。10人、2日間くらいの研修です。

ポイントは、
・低コストであること。(無料が望ましい)
・SQL方言をなるべく使用しないで行う。
・グラフィカルなSQL実行ツールは使わず、SQLをガリガリ書かせる。

とりあえず、こんな感じです。
皆それぞれの現場でそれぞれのRDBMSを使っておりますので、なるべく標準(標準ってなんだ?)で行きたいと思っています。

現在は、
・PostgreSQLを私のマシンにインストールする。
・各クライアントにPostgreSQLのODBCドライバをインストール

かなぁと思っていますが、その先のSQLをガリガリ書くSQLツールは何がいいか迷ってます。ValueSQLというツールが良さそうなんで検討していますが、皆さんなら上記環境をどのように構築しますか?

Aベストアンサー

>・PostgreSQLを私のマシンにインストールする。
>・各クライアントにPostgreSQLのODBCドライバをインストール
自分だったらこんなことせずに各PCに個々にPostgreSQLをインストールさせる。
後はコマンドプロンプトから直接やらせる。
って感じですかね。
そのPostgreSQLのインストールと初期設定も新人にやらせて覚えさせる。

Qどっちの読み方がいいですか、「出(で)させて」と「出(だ)させて」

どっちの読み方がいいですか、「出(で)させて」と「出(だ)させて」

A.先生のご厚意で懇親会に出(で)させていただきました。
B.先生のご厚意で懇親会に出(だ)させていただきました。

(で)か(だ)かです。よろしくお願いします。

Aベストアンサー

#12です。

使役の助動詞「させる」の働きを考えましょう。
「(私が)懇親会に出る」・・・これを先生が「させる」のです。
だから「出(で)させる」がよろしい(*^^*)。

QInformixのSQL文Where句で

マイナーなRDBS(?)なので回答をいただけるか不安ですが…

InformixのSQL文(単純なSELECT文)で、以下のような
文の場合、検索条件はどのような解釈になるのでしょうか?

select
 count(*)
from
 テーブル名
where
 カラム名 = ?

です。

要は「?」が何を示すのかが分からないのです。

matches(Oracleでいうlike)の場合、Oracleの%が*に、
_(アンダースコア)が?になるらしいのですが、
= で完全一致で繋いださいにどうなるのかが分かりません。

ちょっとした情報でもよいので、ご教授お願い致します。

Aベストアンサー

Informixのことは知りませんが。。。

prepareやexecute immediateで前処理して実行する(動的実行)なら、「?」を使う方法は標準SQL準拠だと思いますが?
そういうことであれば、あくまでも「列名=?」は、「=」条件であり、値を可変にしているだけです。

【例】
prepare sql識別子 from 'select count(*) from t1 where c1=? and c2=?'

変数1←値1
変数2←値2
execute sql識別子 using 変数1,変数2
(変数1が一番目の?、変数2が2番目の?に対応し、値を設定)

Qさせてあげる、させてもらうの区別は?

授受動詞「させてあげる」、「させてくれる」、「させてもらう」はいつも見つかれます、でも、この三つの区別は困っています。使う場合を詳細にご説明お願いします。
ありがとうございます。

Aベストアンサー

No.2の回答者です。お礼のお言葉をありがとうございました。

>>>
この質問について、再質問いたします。
これは2000年能力試験の過去問題です:
A:誰かポスターを書いてくれる人を知りませんか。来月、会社オーケストラのコンサートを開くんです。
B:ああ、それなら弟に書かせてやってくださいませんか。美術学校の学生なんです。
ここで「させてやる」と「くださる」がすべてありそうです。これはパターン1(させてやる)ですか、パターン2(させてくれる)ですか。
ちょっと分析していただけませんか。



「誰かポスターを書いてくれる人を知りませんか」
から
「ポスターを書いてくれる人」
の部分だけ取り出します。
これを、「人」を「鈴木さん」に取り替えて、「佐藤さんは」を主語とした文に書き換えると、
「鈴木さんはポスターを書いてくれる」(2のパターン)
となります。



まず、
・「~せてやって」は、「~せてあげて」と同じ意味・用法です。
・「くださいませんか」は「くれないか」の丁寧語です。

ですから、
「弟に(ポスターを)書かせてやってくださいませんか。」
  = 「弟に(ポスターを)書かせてあげてくれないか。」
となります。
肯定文にすれば、
「弟に(ポスターを)書かせてあげてくれる。」
です。

話す相手の名前が佐藤さんだとすれば、
「佐藤さんが弟にポスターを書かせてあげてくれる。」
となります。

ここで注意しなくてはいけないのが、
文末にある「くれる」は、「~せてくれる」の用法ではないということです。
「~せてくれる」の用法ならば、「書かせてあげさせてくれる」になります(かなり不自然な日本語ですが)。
(たぶん、このことについては、日本人でも、ちゃんと分析できる人は少ないと思います。)

書くことを許可する人は佐藤さんです。
書くことを許可される人は弟です。

そういうわけで、
「佐藤さんが弟にポスターを書かせてあげてくれる。」
から「くれる」を取り去って、
「佐藤さんが弟にポスターを書かせてあげる。」
という文として考えることができます。

ですから、
「弟に書かせてやってくださいませんか。」
は、1のパターンです。


なお、
>>>「~せてやって」は、「~せてあげて」と同じ意味・用法です。
と書きましたが、
「やる」は「あげる」よりもぞんざいな表現です。

「金はやるから、秘密はばらすな。」 ・・・ぞんざい
「お金はあげるから、秘密は守ってくれ。」 ・・・普通
「お金は差し上げますから、秘密は守ってください。」 ・・・丁寧

「今年は自由にやらせてやるから、来年はちゃんと勉強しろ。」 ・・・ぞんざい
「今年は自由にさせてあげるから、来年はちゃんと勉強してね。」 ・・・普通
「今年は自由にさせてあげますから、来年はちゃんと勉強してください。」 ・・・丁寧


以上、ご参考になりましたら。

No.2の回答者です。お礼のお言葉をありがとうございました。

>>>
この質問について、再質問いたします。
これは2000年能力試験の過去問題です:
A:誰かポスターを書いてくれる人を知りませんか。来月、会社オーケストラのコンサートを開くんです。
B:ああ、それなら弟に書かせてやってくださいませんか。美術学校の学生なんです。
ここで「させてやる」と「くださる」がすべてありそうです。これはパターン1(させてやる)ですか、パターン2(させてくれる)ですか。
ちょっと分析していただけ...続きを読む

QSQLのWHERE句について

初級シスアドを勉強しています。
テキストに、

SELECT 顧客ID,顧客名 FROM 顧客,注文
WEHRE 注文.顧客ID = 顧客.顧客ID
AND 商品ID =’S01’ OR 商品ID =’S02’

の説明として「顧客」表と「注文」表を「顧客ID」をキーとして
結合し、「商品ID」がS01かS02である行が選択されると
あります。
結合条件と「=01」がANDでむすばれている
と考えると、ORに続く「=S02」は、結合句とは別に
計算されてしまうのではないかと思うのです。
OR のあとにも結合条件の句は有効なのでしょうか?

Aベストアンサー

>ANDでつないだ条件は、ORより先に計算されるべきだと思うのですが、
それで間違いないですって、試しましたから(笑)

それとですね、
>WHERE句に結合条件を入れた場合は、選択の条件とは(システム側が)
>区別してくれるということでしょうか?

という事はありません。結合条件と選択条件は同じものです。区別はありません。私も初級アドミニ受験のときにここにつまずいたのですが、表結合の仕組みを説明すると、次のようになります。
まず、テーブルSとTがあって、レコードが下のようだったとします。

テーブル:S
No|CD
-----
1 |A
2 |B
3 |B


テーブル:T
CD|Name
--------
A |X
B |Y

この時、Select * From S,T というクエリーを実行すると結果は次のようになります。

No|S.CD|T.CD|Name
------------------
1 |A  |A  |X
2 |B  |A  |X
3 |B  |A  |X
1 |A  |B  |Y
2 |B  |B  |Y
3 |B  |B  |Y

これがテーブルの積で、テーブルSとTのレコード全部の組み合わせを表にするわけです。よってレコード数mの表とnの表の積は、レコード数m×nになります。
これをWhere S.CD=T.CD という条件で抽出すると、

No|S.CD|T.CD|Name
------------------
1 |A  |A  |X
2 |B  |B  |Y
3 |B  |B  |Y


こうなって結果的に表が連結されるわけです。

>ANDでつないだ条件は、ORより先に計算されるべきだと思うのですが、
それで間違いないですって、試しましたから(笑)

それとですね、
>WHERE句に結合条件を入れた場合は、選択の条件とは(システム側が)
>区別してくれるということでしょうか?

という事はありません。結合条件と選択条件は同じものです。区別はありません。私も初級アドミニ受験のときにここにつまずいたのですが、表結合の仕組みを説明すると、次のようになります。
まず、テーブルSとTがあって、レコードが下のよう...続きを読む


人気Q&Aランキング

おすすめ情報