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

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

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

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

SQL

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

Q&A

解決済

5回答

46371閲覧

【SQL】特定の項目が同一かつ、別の項目が異なるデータの取得について

programer

総合スコア31

Oracle

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

SQL

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

0グッド

0クリップ

投稿2016/10/17 01:39

編集2016/10/17 02:07

ORACLE SQLについての質問なのですが、例えば、下記のようなレコードがあったとします。

TBL1

「1」 「2」
AAA (NULL)
AAA hhhh
AAA kkkk
BBB (NULL)
CCC (NULL)
DDD ssss

この場合、
「1」 「2」
AAA (NULL)
AAA hhhh
AAA kkkk
DDD ssss

のような結果を取得したいのですが、SQLでやるのは可能でしょうか。
「1」が同じで、「2」がNULLだとしても「1」が同一のものに、
「2」の値が含まれているのものがあれば、NULLのデータも含めて
「1」が同一のものをすべて取得するということがしたいのです。

「1」のデータが同一のものの中で、「2」がNULLでないものがあるなら、
その同一のデータをすべて抽出したいということです。

方法をご存知の方いらっしゃいましたら、よろしくお願いいたします。

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

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

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

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

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

sk_3122

2016/10/17 01:58

ちょっと条件がわからないです。一番最初のデータ例に対して、どういう条件で抽出して「この場合…」のような結果が取りたいのでしょうか。「1 が同じ(2がNULLだろうが何だろうが1が同じ)」までは分かりましたが、それ以降の条件が少し分かり辛いです。
guest

回答5

0

図でイメージするOracleのSQL全集 第3回 分析関数
https://blogs.oracle.com/otnjp/oracle-sql-image-003
を見ながらOracle12cで作ってみました :-)

sql

1with t(ColA,ColB) as( 2select 'AAA',NULL from dual union 3select 'AAA','hhhh' from dual union 4select 'AAA','kkkk' from dual union 5select 'BBB',NULL from dual union 6select 'CCC',NULL from dual union 7select 'DDD','ssss' from dual), 8tmp as ( 9select ColA,ColB, 10count(ColB) over(partition by ColA) as NonNullCnt 11 from t) 12select ColA,ColB 13 from tmp 14 where NonNullCnt > 0 15order by ColA,ColB; 16 17ColA ColB 18---- ---- 19AAA hhhh 20AAA kkkk 21AAA null 22DDD ssss 23

投稿2016/10/17 19:33

編集2020/07/26 08:33
AketiJyuuzou

総合スコア1147

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

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

0

カラム「1」でグルーピングしたとき、カラム「2」に null 以外の要素がある行を全て抽出したいってことですね?

SELECT c1, c2 FROM table t1 WHERE EXISTS ( SELECT 0 FROM table t2 WHERE t2.c1 = t1.c1 GROUP BY c1 HAVING COUNT(c2) <> 0 )

カラム名に数字のみはリテラルと混同するので拙いです。
ここでは c1, c2 としました。

投稿2016/10/17 03:18

編集2016/10/17 03:20
hihijiji

総合スコア4150

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

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

0

EXISTS句もIN句も出てきているので、
あえてCTEを用いたやり方を提示してみる・・・

SQL

1WITH cte_tbl1 AS ( 2 SELECT 3 t.col1 4 , COUNT(t.col2) AS cnt 5 FROM 6 tbl1 t 7 GROUP BY 8 t.col1 9) 10SELECT 11 t1.* 12FROM 13 tbl1 t1 14 INNER JOIN cte_tbl1 t2 15 ON t1.col1 = t2.col1 16 AND t2.cnt > 0

投稿2016/10/17 13:56

Panzer_vor

総合スコア1636

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

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

0

■まず、「2 が NULL でないもの」は抽出対象。
■2 が NULL だとしても、他レコードに「1 が同じで、2 がNULLでないもの」があればそれも抽出。

ということで良いでしょうか?

「1」 「2」
AAA (NULL) ← 「2」がNULLだが、2,3行目と「1」が同じな為抽出
AAA hhhh ← 「2」がNULLじゃないので抽出
AAA kkkk ← 「2」がNULLじゃないので抽出
BBB (NULL)
CCC (NULL)
DDD ssss ← 「2」がNULLじゃないので抽出

Oracle 環境がないので、以下は SQL Server で試したものですが、参考までに
# SELECT ここから~ より前の部分はテスト用のテーブルのようなものです。
# SELECT ここから~ 以降が SQL サンプル

WITH REC AS ( SELECT 'AAA' AS col1, NULL AS col2 UNION ALL SELECT 'AAA' AS col1, 'hhhh' AS col2 UNION ALL SELECT 'AAA' AS col1, 'kkkk' AS col2 UNION ALL SELECT 'BBB' AS col1, NULL AS col2 UNION ALL SELECT 'CCC' AS col1, NULL AS col2 UNION ALL SELECT 'DDD' AS col1, 'ssss' AS col2 ) -- ★SELECT ここから SELECT * FROM REC r -- col2 が NULL ではないものを抽出 WHERE col2 IS NOT NULL -- あるいは、以下のSELECTでレコードが返るものを抽出 OR EXISTS ( SELECT col1 FROM REC x WHERE x.col1 = r.col1 AND x.col2 IS NOT NULL -- col1 が同じで、col2がNULLではないもの )

投稿2016/10/17 02:46

編集2016/10/17 02:51
sk_3122

総合スコア1126

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

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

0

ベストアンサー

いまいち抽出したいモノがつかめてませんが、こういう事でしょうか。

SQL

1SELECT 1, 2 FROM table 2WHERE 1 in ( 3 SELECT 1 FROM table 4 WHERE 2 is not null);

投稿2016/10/17 01:46

kunai

総合スコア5405

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

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

programer

2016/10/17 03:05

回答ありがとうございます。 これは、「1」が同一で、「2」にデータがあるものがある場合、「1」がNULLものは取得できるのでしょうか。例で挙げさせていただいたところでいうと、AAA NULL のレコードは取得できるのでしょうか。
kunai

2016/10/17 04:30

出来ますよ。 まず、in ( の後のサブクエリで、「2がnullじゃないレコードの1」をすべて抜き出しています。 ですので、ここで出てくる1は「AAA」「DDD」の2つです。 次にメインのクエリで、「1がサブクエリで抽出した1と同じモノ」となっています。 つまり、「1がAAAかDDDのレコード」となりますので、2の値に関係なくすべて取得できます。 この程度のSQLの調査であれば、実際に手持ちの環境で動かしてみた方が質問を待つより早くて練習にもなりますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問