- PR -

SQL文について質問です

1
投稿者投稿内容
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2008-02-18 05:13
いつもお世話になっております。
VIEWを使用したSELECT文について質問させてください。

以下が現在のテーブル二つです。

T_STAFFテーブル
 STAFF_ID

T_DATA
 STAFF_ID
 TARGET_DT
 OPE_ID

取得したいデータ条件は以下です。

T_STAFFのSTAFF_IDの中から
T_DATAのTARGET_DT=20080101、OPE_ID=00000001のSTAFF_IDを省いたSTAFF_IDを取得したいです。

現在のVIEWは以下です。

CREATE OR REPLACE VIEW V_STAFF AS
SELECT
A.STAFF_ID AS STAFF_ID
FROM
T_STAFF A,
T_DATA B
WHERE
A.STAFF_ID = B.STAFF_ID
AND NOT EXISTS (SELECT * FROM T_DATA WHERE A.STAFF_ID = T_DATA.STAFF_ID AND TARGET_DT = 20080101 AND OPE_ID = 00000001)

上記のVIEWで希望のデータを取得できるのですが、
TARGET_DT = 20080101
と、
OPE_ID = 00000001
は、JSPの画面から渡したいです。

VIEWを
CREATE OR REPLACE VIEW V_STAFF AS
SELECT
A.STAFF_ID AS STAFF_ID
FROM
T_STAFF A,
T_DATA B
WHERE
A.STAFF_ID = B.STAFF_ID
に変更し、JAVAから
"AND NOT EXISTS (SELECT * FROM T_DATA A, T_STAFF B WHERE B.STAFF_ID = A.STAFF_ID AND A.TARGET_DT = '" + target_dt + "' AND A.OPE_ID = '" + ope_id + "')"
を追記して実行しました。
target_dtとope_idはJAVAの変数です。それぞれ20080101と00000001が代入されています。

このSELECT文を実行すると、
T_DATAテーブルのTARGET_DTが20080101以外で登録されているSTAFF_IDも取得出来なくなってしまいました。
恐らくJAVAから追記している条件文が間違えていると思うのですが、
どこが悪いのでしょうか?

分かりづらい文章で申し訳ありません。
よろしくお願い致します。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-02-18 07:11
質問する場合は、RDBMS名とバージョンを明記してください。
今回は大きな違いはないかも知れませんが、DDLはRDBMSによる方言が多い箇所
です。

表のデータは、1:1なのかなど不明点が多いので、質問で書かれている範囲の情報で
分かる部分のみ回答します。

まず、NOT EXISTSの使い方が正しくありません。RDBMSにより「相関サブクエリ」と
呼んだり、「外への参照」といった呼び方をする場合もありますが、サブクエリ内と
外側のクエリの関連付けがないと、EXISTSは結果を返しません。

コード:
select * from t1 as x
 where not exists(select * from t2
                         where x.c1=c1                   -- 関連付けの条件が必須
                            [and 必要なら他の条件]
                       )




また、質問内容を見る限り、

コード:
SELECT 〜  FROM T_STAFF A,T_DATA B 



というジョインは必要ありません。

質問内容通りなら、次のようなSQLになると思います。

コード:
SELECT X.STAFF_ID
 FROM T_STAFF AS X
 WHERE NOT EXISTS
        (SELECT *
          FROM T_DATA
          WHERE X.STAFF_ID=STAFF_ID
            AND TARGET_DT='20080101'
            AND OPE_ID='00000001')

1

スキルアップ/キャリアアップ(JOB@IT)