質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

8615閲覧

SQL副問合せのFROM句で複数テーブルを使用したい

chanrina0920

総合スコア18

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/12/11 05:00

###前提・実現したいこと
SQLで親テーブルに存在しないCLIENT_CDが他テーブルに存在する件数を取得するSQLを作成したいです。
各SQLのブロックで親テーブルに存在しないCLIENT_CDが他テーブルに存在するかどうかが確認できるため
全てつなげて対象テーブル内に親テーブルに存在しないCLIENT_CDが存在する件数がいくつあるのか確認したいと思いました。

###発生している問題・エラ-
・UNION ALLやLEFT JOINでテーブル結合をしてみましたが
うまくいきませんでした。

###該当のソースコード
SELECT COUNT(*) FROM
(
--1.CLIENT_ACCNT_POSTINGS
SELECT *
FROM CLIENT_ACCNT_POSTINGS
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)

--2.DEPOSIT_DETAIL_INFO
SELECT *
FROM DEPOSIT_DETAIL_INFO
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)

--3.EXECUTION_HISTORY
SELECT *
FROM EXECUTION_HISTORY
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)
);

###補足情報(言語/FW/ツール等のバージョンなど)
oracle

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

UNION ALLで解決済
⇒UNION ALLで結合するSQLはSELECT COUNT(*)より

SELECT COUNT(*) FROM
(

--1.CLIENT_ACCNT_POSTINGS
SELECT *
FROM CLIENT_ACCNT_POSTINGS
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)

)
UNION ALL SELECT COUNT(*) FROM
(

--2.DEPOSIT_DETAIL_INFO
SELECT *
FROM DEPOSIT_DETAIL_INFO
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)
)
UNION ALL SELECT COUNT(*) FROM
(

--3.EXECUTION_HISTORY
SELECT *
FROM EXECUTION_HISTORY
WHERE CLIENT_CD NOT IN
(SELECT BEFORE_CLIENT_CD FROM W_CLIENT_CD_TBL
WHERE BEFORE_CLIENT_CD IS NOT NULL)
);

投稿2017/12/11 11:30

chanrina0920

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

具体的なサンプルが無いので微妙ですがこんな感じでしょうか?

SQL

1create table oya(pid int primary key,cd int); 2insert into oya values(1,100),(2,101),(3,101),(4,102),(5,102); 3 4create table ko(cid int primary key,cd int); 5insert into ko values(1,100),(2,101),(3,101),(4,103),(5,103),(6,104);

上記、子テーブルのデータの内親テーブルのcdが存在しないのはcid=4,5,6の3件

SQL

1select count(*) from ko as t1 2left join (select distinct cd from oya) as t2 on t1.cd=t2.cd 3where t2.cd is null;

投稿2017/12/11 07:50

編集2017/12/11 07:51
yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chanrina0920

2017/12/11 11:03

複数の子テーブルへの検索を1つにまとめられないか質問させて頂いています。
yambejp

2017/12/11 11:27

複数子テーブルの場合unionすればイケルと思いますが できればサンプルをつけてください 検証ができません
guest

0

以下で、対象テーブルごとに、W_CLIENT_CD_TBLに存在しないCLIENT_CDの件数をカウントしています。

SQL

1SELECT * FROM ( 2 --1.CLIENT_ACCNT_POSTINGS 3 SELECT 'CLIENT_ACCNT_POSTINGS' as target_name, count(*) as cnt FROM CLIENT_ACCNT_POSTINGS tgt 4 WHERE NOT exists(SELECT 1 FROM W_CLIENT_CD_TBL WHERE BEFORE_CLIENT_CD=tgt.BEFORE_CLIENT_CD) 5 union all 6 --2.DEPOSIT_DETAIL_INFO 7 SELECT 'DEPOSIT_DETAIL_INFO', count(*) FROM DEPOSIT_DETAIL_INFO tgt 8 WHERE NOT exists(SELECT 1 FROM W_CLIENT_CD_TBL WHERE BEFORE_CLIENT_CD=tgt.CLIENT_CD) 9 union all 10 --3.EXECUTION_HISTORY 11 SELECT 'EXECUTION_HISTORY', count(*) FROM EXECUTION_HISTORY tgt 12 WHERE NOT exists(SELECT 1 FROM W_CLIENT_CD_TBL WHERE BEFORE_CLIENT_CD=tgt.CLIENT_CD) 13) as info

投稿2017/12/11 06:17

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chanrina0920

2017/12/11 09:23

回答ありがとうございます。試に作成いただいたSQLを流しているのですが、エラーになってしまいます。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問