はじめまして。
現在、画面上で検索条件を選択し、検索ボタンを押すと結果を返すアプリケーションを作成しておりますが、
画面上の検索の条件に「空白」を加えると、検索前に空白で表示されていた件数に比べて少ない結果になる、という現象が起こっています。
原因は、テーブルAとテーブルBを外部結合させてデータを取得して表示していますが、
検索前はBにレコードを持たないデータも表示しており、対象項目に検索条件「空白」を設定すると、テーブルBにレコードを持ち、
かつ該当項目が空白(null)であるデータのみ検索して、テーブルBにレコードがないデータは検索されないため、検索前より件数が少なく表示されるためだと判明しました。
画面上空白が選択されたら、テーブルAの該当項目は空白、テーブルBにはデータを持たないレコードも表示したいのですが、
どのようにすればよいかご教示いただければ有難いです。
(検索条件は複数あり、空白を指定できる項目も複数あるという前提です。)
以上、よろしくお願い致します。

A 回答 (5件)

なんとなく誤解があるんだろうなぁと思っていましたが。



LEFT OUTER JOINの結果のNULLとレコード自体のNULLには何の違いもありません。NULLはNULLです。
以下で確認してください。質問者さんの考え方では、以下でもKEYID=2のレコードが抽出されることに
なりますが、実際には抽出されません。

DECLARE @TBLA TABLE ([KEYID][int],[F1][varchar](5))
DECLARE @TBLB TABLE ([KEYID][int],[F2][varchar](5))
INSERT INTO @TBLA VALUES (1,'X')
INSERT INTO @TBLA VALUES (2,'Y')
INSERT INTO @TBLA VALUES (3,'Z')
INSERT INTO @TBLB VALUES (1,'ABC')
INSERT INTO @TBLB VALUES (3,'BCD')

SELECT a.KEYID,a.F1,b.F2
FROM @TBLA a
LEFT OUTER JOIN @TBLB b ON b.KEYID=a.KEYID
WHERE b.F2='ABC'
    • good
    • 0
この回答へのお礼

回答が遅くなり、申し訳ありません。
実際に試したところ、LEFT JOINのWHERE句の検索内容に沿ったデータのみ抽出されました。

私自身の混乱の原因としては
(1)「*=」を使用していた際、where句の条件に「項目=Null」を入れていたところ全件ヒットしていた
(2)(1)により、外部結合では、結合される側をwhere句の条件で指定しても全件ヒットしてしまうものと思ってしまった

というところにあるようです。
(1)に関してはSQLserverのバージョンの問題で、曖昧な条件になってしまっているところに原因があるようですが、(2)に関しては外部結合が根本的に分かっていない(結合した後に抽出していることが理解できていない)ところに原因があるように思います。SQLをもっと勉強する必要がありますね。
この度はありがとうございました。

お礼日時:2009/06/17 14:47

#2,#3です。


>ご提示いただいたSQLですと、検索の際、Bのnull以外の検索値を指定した場合、Bのテーブルに値を持っていないデータもヒットしてしまうかと思います。
そんなことはないですよ。

例えば、BのF4というカラムに"ABC"という条件を指定すると、条件にはb.F4='ABC'が追加されます。
ということはBに値のない(NULLの)レコードはヒットしないです。

一方、BのF4というカラムに""(空白)という条件を指定すると、条件には(b.F4='' OR b.F4 IS NULL)が追加されます。
したがって、この場合はBに値のない(NULLの)レコードもヒットします。

まあ、あくまで代案として載せたサンプルコードなので、理解できてもできなくても別にかまわないですが。。。

この回答への補足

分かりづらい表現ですみません。
「Bのテーブルに値を持っていないデータ」というのは、
テーブルAにはデータがあるが、Bには対応するデータがないレコード、という意味です。
LEFT OUTER JOIN の構造でBのF4というカラムに"ABC"という条件を指定すると、
 ・BにAと対応するデータを持っていて、かつb.F4='ABCであるレコード
 ・BにAと対応するデータを持っていないレコード
がヒットしてしまうのではないかと思います。

補足日時:2009/05/15 18:29
    • good
    • 0

#2です。



結局検索条件に合わせてASPかVBScriptでSELECT文を組み上げているわけですよね?
書かれた案でもいいのでしょうけど、素朴な疑問として、AのフィールドとBのフィールドで検索条件の追加方法を変えるだけではだめなんでしょうか。
ざっくりこんな感じで。。
Dim sSQL,sWhere
sSQL = "SELECT a.KEY,a.F1,a.F2,a.F3,b.F4,b.F5,b.F6" & _
    " FROM TABLEA a" & _
    " LEFT OUTER JOIN TABLEB b ON b.KEY=a.KEY"
If bUseF1=True Then sWhere=sWhere & " AND a.F1='" & sF1 & "'"
If bUseF2=True Then sWhere=sWhere & " AND a.F2='" & sF2 & "'"
If bUseF3=True Then sWhere=sWhere & " AND a.F3='" & sF3 & "'"
If bUseF4=True AND sF4="" Then sWhere=sWhere & " AND (b.F4='' OR b.F4 IS NULL)"
If bUseF4=True AND sF4<>"" Then sWhere=sWhere & " AND b.F4='" & sF4 & "'"
If bUseF5=True AND sF5="" Then sWhere=sWhere & " AND (b.F5='' OR b.F5 IS NULL)"
If bUseF5=True AND sF5<>"" Then sWhere=sWhere & " AND b.F5='" & sF5 & "'"
If bUseF6=True AND sF6="" Then sWhere=sWhere & " AND (b.F6='' OR b.F6 IS NULL)"
If bUseF6=True AND sF6<>"" Then sWhere=sWhere & " AND b.F6='" & sF6 & "'"
If LEFT(sWhere,4)=" AND" Then sWhere = " WHERE" & RIGHT(sWhere,LEN(sWhere)-4)
sSQL=sSQL & sWhere

あとは、外部結合の書式ですが「*=」はSQL Server 2005からはサポートされませんから、「LEFT OUTER JOIN」に慣れておいた方がいいですよ。

この回答への補足

ご返答ありがとうございます。
ご提示いただいたSQLですと、検索の際、Bのnull以外の検索値を指定した場合、Bのテーブルに値を持っていないデータもヒットしてしまうかと思います。
(Bの検索値に空白以外の値を入力した場合、検索結果はBにデータも持たないレコードを含まず、Bに検索値を持っているデータのみ表示させたい)
なお、空白が指定できる項目は、Bにある項目のみになります。

外部結合に関しては、ご教示いただきましたように、今回の修正でLEFT OUT JOINに変更する予定でおります。

補足日時:2009/05/14 19:03
    • good
    • 0

画面がVBなのか、Accessなのか、それ以外なのか。

検索条件入力後のクエリはどのように構築しているか。
・・が分からないので、純粋にSQL Serverに関する質問と考えて書きますが、

空白を指定できる検索条件が複数あったとしても、「空白またはNULL」の両方を満たすように条件を指定してあげるしかないと思います。

SELECT * FROM TABLEA a
LEFT OUTER JOIN TABLEB b ON b.KEY=a.KEY
WHERE a.FIELD1=@PARM1
AND ISNULL(a.FIELD2,'')=@PARM2
AND ISNULL(b.FIELD1,'')=@PARM3
AND ISNULL(b.FIELD2,'')=@PARM4 ...

テーブルAのうち、NULLの入らない項目についてはISNULLはかぶせないようにし、条件はできるだけ最初の方に持ってくるのがいいでしょう。

検索条件をできる限り触りたくない場合、結合しているテーブルの方をビューにして、ビューの中でテーブルB側の
項目に全部ISNULLをかぶせてしまう手もあるかと思います。

CREATE VIEW VIEWA
AS
SELECT
a.KEY1 KEY,
a.FIELD1 AFIELD1,
ISNULL(a.FIELD2,'') AFIELD2,
........
ISNULL(b.FIELD1,'') BFIELD1,
ISNULL(b.FIELD2,'') BFIELD2
FROM TABLEA a
LEFT OUTER JOIN TABLEB b ON b.KEY=a.KEY

で、検索するときには

SELECT * FROM VIEWA
WHERE AFIELD1=@PARM1
AND AFIELD2=@PARM2
AND BFIELD1=@PARM3
AND BFIELD2=@PARM4 ...

この回答への補足

状況に関する記述が不足していまして、申し訳ありません。

環境
開発言語:ASP DB:SQLserver
問題の箇所は検索ボタンを押してからの動作で、SQLを投げているのはVBScriptです。
Bの項目に含まれる検索項目に入力があるとフラグをオンにし、
フラグがオンの場合:AND A.KEY = B.KEY
フラグがオンでない場合:AND A.KEY *= B.KEY
という条件にしています。
検索条件にnullの入らない項目はSQL上前に集結させております。

現状、いただいた回答により以下のような案を考えました。
(1)Aにデータを持ち、Bにデータを持たないレコードをserectしたビュー(Vα)を事前に作成しておく
(2)検索時にnullが入る項目にすべてnullを指定された場合、
 AとBにデータを持ち、かつ検索項目を満たすデータ(=内部結合で検索条件に一致するデータ)と、
 Vαで検索条件に一致するデータをunionさせる
 nullが入る項目に1つでもnull以外を指定された場合、Bにデータがあることが前提になるため、
 Vαはunionさせない

上記の方法に矛盾がある、またはほかに方法がある場合、
ご教示いただければありがたいです。

補足日時:2009/05/13 16:36
    • good
    • 0

こんばんは



データベースについては人様にアドバイスできるほどの経験はなく、自分自身が勉強しながら使ってる者です。

一番に思いつくのは外部結合のRIGHTとLEFTを間違っていませんか?ということです。

テーブルA、テーブルBのフィールドと問題のあるSQL文を提示してもらえれば、もう少しアドバイスできるかもしれません。
    • good
    • 0

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

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

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

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

Qテーブル構造を支える脚の材料と太さの計算方法

テーブル構造を支える脚の材料と太さの計算方法

こんにちは。テーブル構造を支える脚の材料と太さの計算方法と材料を教えて頂きたいです。

条件は:
条件1中央の脚一本でテーブル板を支える
条件2テーブル板の重量は決定済み、M=6kg
条件3脚の下の固定は別途設計するので、倒れることは考えなくても良い
条件4脚とテーブル板の固定は別途設計するので、倒れることは考えなくても良い
条件5テーブルは携帯式なので、脚を出来るだけ細くできればよい
と考えています。

質問1十分な強度を得られ、しかも軽量な材質は何でしょうか?
質問2そのときの脚の太さの計算方法は?

条件3と4で述べたとおり固定方法も考える必要もあるのですが、とりあえず脚が決まってからの方が良いと思いましたので、質問させていただいている次第です。

ご教授ありがとうございます。

Aベストアンサー

計算式
(耐荷重+固定荷重)÷木材の許容圧縮応力度÷脚本数=必要断面積(cm2)
上記計算式でテーブル脚をルート断面積で正方形の脚の寸法が求められます。
耐荷重とは、貴方がテーブルに上げる最大重量です。(kg又はN)
木材の許容圧縮応力度は、材料強度です。
建築基準法同施行令に参考になる材料強度表が書かれています。
材種を決めて計算する事が大事です。
ご参考まで

Qあるテーブルの項目を持つ別のテーブルの検索

お世話になります。
マスタのcodeという項目と同じ名前で使用されているテーブルを
検索するにはどのようにしたらいいでしょうか?

よろしくお願いします。

Aベストアンサー

select sysobjects.name
from dbo.syscolumns
inner join dbo.sysobjects
on sysobjects.id = syscolumns.id
where syscolumns.xtype = '175'
and syscolumns.name = 'name'

あ~、xtypeの値(175)は違う取得の方法があるはず。

QDIYテーブルの折りたたみ脚について

天版を蝶番で付けて真ん中を繰り抜き、七輪テーブルを作成しました。
現状は、余っているキャンプ用テーブルの脚をガムテープで固定しています。
ユニフレームの焚き火テーブルと同じ高さの折りたたみ脚を付けたいと思ってますが良いアイデアもしくは脚の販売先はありますでしょうか?
焚き火テーブルの高さは37cm、七輪テーブルの天版の厚さは約1.5cmなので、最低でも35cmの脚が必要になるかと思います。30cmの脚は結構見かけるのですが・・・。

Aベストアンサー

市販品にこだわらず、木などで作れば高さ自由ですよ。

1)別板を2枚クロスさせて天板を置く
2)蝶番つけて折りたたみ足にする
3)ナット埋めてねじ込みにする
4)テーブルを箱型にして、七輪+火種のケースとしてもそのまま使う

↑これらは高さの微調整にはアジャスタフットなりが必要ですが、
こういうの↓はアジャスタ機能もってますね

5)パイプの入れ子構造にして、内パイプは外パイプとねじ止めする。
 または外側の先端に割りをいれておいてクランプやホースバンドなどで締めて内パイプを固定する
6)天板の下にハの字形に広がるように左右脚をつけて、間をロープでつないで開き具合を調節する


ま、私なら4か6にしますね。
6のみ、簡単に絵にしておきます。

QSQL:テーブル結合で該当レコードがない場合

SELECT TableA.ID,SUM(TableA.量),TableB.金額
FROM TableA,TableB
WHERE TableA.ID = TableB.ID
GROUP BY TableA.ID,TableA.量,TableB.金額

こんな感じのSQLなんですが
TableAをメインテーブルとして
↓のような結果を得るように作り変えれないか考えています
■TableBとの結合レコードあり(金額登録あり)
1,50,1500
■TableBとの結合レコードあり(金額登録なし)
1,50,(NULLかスペース)

考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

Aベストアンサー

ヒント:外部結合

Qテーブルの脚を取り換えたい

ローテーブルの脚を取り換えて、脚の長いダイニングテーブルにしたいです。
幕板付きなので幕板はそのままで、脚だけを取り換えようと思ってます。

テーブルの画像を添付しました。
左画像はテーブルの正面から右側の脚にかけて、右画像は同じ部分をテーブル裏側から撮影してます。

1本の脚付近には、3本のネジがあります。
そのうち2本(銀色のネジ)は、幕板を天板にとりつける為のものだと思います。
あとの1本が脚と幕板を固定してるものだと思います。

このテーブルを組み立てた時の様子は忘れたのですが
ホゾ(?)みたいに凹凸で組まれていてネジは補強なのだと思います。
でも私にはそんな技術はありませんので
ネジで幕板と脚を固定するつもりです。

幕板は飾りとして
脚と天板の接する部分にそれぞれ金物をつけて取り付ける。

これで大丈夫でしょうか?
結構な重量のあるテーブルですので
高さのある脚にした時の強度が心配です。
他に何かよい方法はありますか?

また、家具のリメイクをしてるお店に頼む場合、
今ある幕板の凹凸に合わせて脚をつくってもらってホゾ組にしてもらうとしたら
どれくらいの値段がするのでしょう?
1万円で済むなら頼んだ方が良いと思ってますが
そんなお安くないですよね?
運送費だけでも相当な事になりそうで、現実的ではない気はしてるのですが・・・

ローテーブルの脚を取り換えて、脚の長いダイニングテーブルにしたいです。
幕板付きなので幕板はそのままで、脚だけを取り換えようと思ってます。

テーブルの画像を添付しました。
左画像はテーブルの正面から右側の脚にかけて、右画像は同じ部分をテーブル裏側から撮影してます。

1本の脚付近には、3本のネジがあります。
そのうち2本(銀色のネジ)は、幕板を天板にとりつける為のものだと思います。
あとの1本が脚と幕板を固定してるものだと思います。

このテーブルを組み立てた時の様子は忘れたので...続きを読む

Aベストアンサー

プロに依頼は 費用的に 全く無理ですから

ご自身で ホ-ムセンタ-で角脚も 丸い脚も

座金も 販売されていますので

取り付けられれば 1万で済むでしょう。

写真の幕板は無視することに成ります。

幕板を利用して脚を固定する方法は 様々ありますが

隅木 又は 隅金具でボルト締めが簡単です。

プロに依頼は其れなりの費用が掛かります。

Q同一テーブルのデータを検索条件に使いたい

SQLServer2008を使用しています。

下記のように一つの売上データが伝票番号をキーとして一つのテーブルに複数レコードに分けて登録されています。


伝票番号 分類 区分 データ
1       1   1   2500
1       2   1     0
1       3   1   A123
2       1   1   9800
2       2   2     0
2       3   1     0

分類が1だと売上金額、2だと区分が1なら現金、2ならカード支払いなどとフィールド内の値によって意味分けされています。

上記例ですと伝票番号1は顧客ID A123の客が現金で2500円、
伝票番号2は顧客ID 0(フリー客)客がカードで9800円支払ったデータということになります。

上記のようなデータ構造で現金の売上のみ、カード売上のみの集計などを行いたいのですが、
同一テーブル内の別レコードの値を条件に検索集計をSQL文だけで行うことは可能でしょうか?

可能でしたらどのようなSQLを使用すれば良いのか教えていただけると幸いです。
よろしくお願い致します。

SQLServer2008を使用しています。

下記のように一つの売上データが伝票番号をキーとして一つのテーブルに複数レコードに分けて登録されています。


伝票番号 分類 区分 データ
1       1   1   2500
1       2   1     0
1       3   1   A123
2       1   1   9800
2       2   2     0
2       3   1     0

分類が1だと売上金額、2だと区分が1なら現金、2ならカード支払いなどとフィールド内の値によって意味分けさ...続きを読む

Aベストアンサー

環境が無いので不明ですが、以下のような理論で
実行すればよいのでは?
(1)売り上げだけのクエリを作る。
(2)支払い方法だけのクエリを作る。
(3)上記を結合して、支払い方法別の集計をとる。
SELECT
MAX(A.ダミー) AS 架空,
SUM(CASE B.区分 WHEN 1 THEN A.データ ELSE 0 END) AS 現金,
SUM(CASE B.区分 WHEN 2 THEN A.データ ELSE 0 END) AS カード
FROM
(SELECT 1 AS ダミー,伝票番号,データ FROM テーブル WHERE 分類=1) AS A
INNER JOIN
(SELECT 伝票番号,区分 FROM テーブル WHERE 分類=2) AS B
ON A.伝票番号=B.伝票番号
GROUP BY A.ダミー

SQLを考える時は先ず理論を組み立てから実施しないと
何時までも使えるようになりませんよ。

Q無垢テーブル固定のねじが使用半年で折れ落ちたり、脚がとれたりするものですか?

無垢のダイニングテーブルを半年前に購入しました。素材はナラだったと思います。3日前にいすの上に折れたねじがあり、よく見るとテーブルのねじが折れて落ちたものでした。購入店に連絡すると、このようにねじが折れ落ちることはよくあるといわれました。修理にこられ、折れた場所の斜めにねじ固定されました。よく見るとほかのねじも数本抜けていました。修理のときにテーブルの脚も緩んでいたのでしめてもらいましたが、翌日テーブルと脚に隙間がある事に気づき再度締めようとしたら脚がとれました。再度修理してもらいましたが、このように半年でねじが折れたり、ぬけおちたり、脚が取れたりするものでしょうか?

Aベストアンサー

購入から半年では ねじが折れ落ちることは通常ありません。

よくあるなんていうのは 言い逃れです。

欠陥品ですね。商品の取替え交渉です。

Qselect条件で文字列項目のあいまい検索

SQLServerにてselect文のあいまい検索についての質問です。

char型項目を以下のようにあいまい検索したいのですが、どのように条件を書けばいいのでしょうか?

 A項目
 -----
(1) 21234
(2) 256
(3) 27890
(4) 2
(5) 2378

とデータがあるとします。
結果、(1)と(3)のみ対象としたいのです。
先頭1桁が'2'のものを対象にしたいのですが、
LIKE '2____'とすると、全てselectされてしまいます。

他に方法ありますか?

Aベストアンサー

もう少し、簡潔に書けます。

A LIKE '2___[0123456789]'
A LIKE '2___[0-9]'

% 0個以上の文字に対応します。
_ 任意の1文字に対応します。
[...] 各カッコ内に指定した文字に対応します。
[^...] 各カッコ内に指定した文字以外に対応します。

Qテーブルの別売りの脚について

もうじき引っ越す予定です。
現在は脚の短いテーブルで座布団での生活ですが、
新しい場所がフローリングのLDKのためダイニング
のセット(椅子とテーブル)にしようかな、と
考えました。

しかし、現在のテーブルも捨てがたく、できれば
このテーブルの脚だけ長いものに交換できないか
と考えています。(脚にはネジが、テーブルには
ネジ穴があるタイプです。)

どこかで、テーブルの脚を別売りしてくれるお店
などありませんでしょうか?

ネットでもリアルでもかまいませんが、リアルの
場合、首都圏で紹介していただけると助かります。

よろしくお願いします。

Aベストアンサー

東急ハンズ渋谷店、
http://shibuya.tokyu-hands.co.jp/guideonfloor_back.html

4Aの家具 組立家具で各種取り揃えていますよ。

QSQLServerで2つの項目からデータを検索。

SQL Server(バージョン不明)について、2つのフィールドからデータを検索したいのですが、できません。
1つのフィールドならできるのですが、どのような構文にすればいいのでしょうか?
自分が実際に、SQL Serverを使う事ができず、現在どのような構文になっているか、バージョンは何か、申し訳ないのですがわかりません。
ご回答の程、どうぞよろしくお願い致します。

Aベストアンサー

それだけの情報だとよくわかりません。1つのテーブルから取得するのか、データとは文字列なのか他のテーブルの項目とJOINしたいのかなど詳細がわからないと答えようがないと思います。

■完全一致

select * from (テーブル名)
  where (項目A) = '(検索したい文字列)' or (項目B) = '(検索したい文字列)'

■部分一致

select * from (テーブル名)
  where (項目A) like '%(検索したい文字列)%' or (項目B) like '%(検索したい文字列)%'

これではダメでしょうか?


人気Q&Aランキング

おすすめ情報