![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いま、同一商品番号の最新日付を利用した条件が
うまく作れず悩みながら色々試していますが、
うまくいきません。
やりたいことは、
1,AテーブルとBテーブルの
商品番号が同じ場合は除外します。
2,残されたデータから次はCテーブルの中にある
同一商品番号で、最新の日付が当月の場合はデータを残す。
つまり、前月以前のデータは除外となります。
1まではできています。
Select * from aテーブル where
not exists (select 'X' from bテーブル where
a.商品番号 = b.商品番号)
この先上記sqlにつなげてmax関数くくった最新日付と
システム日付を年月のみで比較する等試みましたが、
求めた結果になりません。
上記sqlでビューを作成してといったことは、
今回やらずに一つのsqlのみでできないかと
試行錯誤です。
よきアドバイスございましたら、
宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
>最新の日付が当月の場合はデータを残す。
>つまり、前月以前のデータは除外となります。
別に最新にこだわる必要はなく(当月のデータが1件でもあれば最新じゃなくても条件成立のため)
補足の
Select * from aテーブル a where
not exists (select 'X' from bテーブル b where
a.商品番号 = b.商品番号)
and
not exists (select 'X' from cテーブル where
(a.商品番号 = c.商品番号)
and /* ここから */
(select to_char(to_date(max(c.日付),'YYYYMM'),'YYYYMM')
,'YYYYMM')
< to_char(to_date(to_char(sysdate,'YYYYMM'),'YYYYMM')-1
,'YYYYMM')
の /* ここから */以下を、
to_char(to_date(c.日付,'YYYYMM'),'YYYYMM')
< to_char(to_date(to_char(sysdate,'YYYYMM'),'YYYYMM')-1,'YYYYMM')
)
としても取得できます。但し、負荷が高い、レスポンスが悪いかな。
and a.商品番号
not in
(select distinct 商品番号 from cテーブル
where trunc(日付,'MM')>=trunc(sysdate,'MM')
)
か
and
not exists
(select 'X' from cテーブル
where c.商品番号 = a.商品番号
and c.日付 = (select max(c2.日付) from cテーブル c2
where c2.商品番号 = c.商品番号)
and trunc(c.日付,'MM')>=trunc(sysdate,'MM')
)
あるいは
and
not exists
(select 'X' from cテーブル
where c.商品番号 = a.商品番号
and c.日付 = (select max(c2.日付) from cテーブル c2
where c2.商品番号 = c.商品番号
and trunc(c2.日付,'MM')>=trunc(sysdate,'MM')
)
か。
どれが早いかは、抽出された結果の商品番号の件数やaテーブルの件数等に依存しますので
良く分かりませんが。
レスポンスの例まで示していただきまして、ありがとうございました。
既に通常の抽出としてはうまくいっていたのですが、
レスポンスで問題がおきていました。
参考にさせていただきます。ありがとうございましたm(_ _)m
No.3
- 回答日時:
A,B,Cの3テーブルがあるということですよね?
最終的に取得したい項目が不明ですが、
select a.商品番号, max(c.日付) 最新日付
from (
select a.商品番号
from aテーブル a
where not exists (
select *
from bテーブル b
where a.商品番号 = b.商品番号)) a
inner join cテーブル c on (a.商品番号 = c.商品番号)
group by a.商品番号
having trunc(max(c.日付) , 'MM') = trunc(sysdate, 'MM');
みたいな感じでどうでしょうか。
inner joinでの結合はどうもテーブルの関係上
マテリアルビュー等を使用しているため非常に重いのが難点でした。
ありがとうございました。
No.2
- 回答日時:
> 1まではできています。
> 上記sqlでビューを作成してといったことは、今回やらずに
fromにselect文を書けます。1をfromに書けばSQLは1文。
ただし*で書かずに列を列挙、さらに全体を()で囲む。
select 商品番号, 最新日付
from (
Select a.商品番号, max(c.日付) as 最新日付, from aテーブル where
not exists (select 'X' from bテーブル where
a.商品番号 = b.商品番号)
group by a.商品番号
) c
where
<dualから取得した日付とc.最新日付とをごにょごにょする>
No.1
- 回答日時:
> システム日付を年月のみで比較する等試みましたが、
比較部分をどのように記述してますか?日付はDate型じゃなのかな?
Date型なら文字列にしてしまうのが簡単かも。
select to_char( sysdate, 'YYYY/MM' ) from dual;
この回答への補足
目的は、削除リストを作成するためにSQLで削除対象となるデータを
抽出します。
SQLですとAテーブルとBテーブルに一致する場合は削除対象外としています。
Cは履歴のテーブルで同じ商品番号が複数存在します。
そこから一番新しい日付のものを取得したいです。
ブランクのものもあり、ブランクのものは当月のデータと
同一で削除対象外とします。
Select * from aテーブル where
not exists (select 'X' from bテーブル where
a.商品番号 = b.商品番号)
and
not exists (select 'X' from cテーブル where
(a.商品番号 = c.商品番号)
and
(select to_char(to_date(max(c.日付),'YYYYMM'),'YYYYMM')
,'YYYYMM')
< to_char(to_date(to_char(sysdate,'YYYYMM'),'YYYYMM')-1
,'YYYYMM')
確か上記だったと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle SQL update方法 2 2022/06/22 14:07
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- MySQL 三科目合計点のクラス別平均点求めるクエリ式を教えてください 1 2023/07/04 09:44
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するIDのデータを1行にま...
-
Excelの並び替え(先頭の文字以...
-
日付書式に変換でこまっています!
-
SQLで部分的にGROUP BYしたいとき
-
SQLite3のtext→date変換について
-
エクセルの日付に時差を加算 #V...
-
Oracle10gのsql分についての質...
-
見たことのない形式で日付が表...
-
今日の日付が入った行のデータ...
-
エクセル 日付による並べ替え...
-
日数算出SQL
-
日付型なら変数の先頭になん...
-
Accessの数値から時間に変換す...
-
関数IFで、指定日付範囲のデー...
-
Excelグラフの日付軸の日付がず...
-
SQL/Loaderでの年月日時分秒の...
-
特定の日付が第何週目にあるか...
-
DB2のSQL(日付)について
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
今日の日付が入った行のデータ...
-
エクセルの日付に時差を加算 #V...
-
Accessの数値から時間に変換す...
-
エクセル 日付による並べ替え...
-
SQLサーバで和暦から西暦に変換...
-
SQLで部分的にGROUP BYしたいとき
-
重複するIDのデータを1行にま...
-
テーブルの主キーをdate型...
-
ExcelのSUMPRODUCTで日付の範囲...
-
WHERE句にて「30日前から今日ま...
-
yyyy/M/dをyyyy/MM/ddに変換
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
日付書式に変換でこまっています!
-
SQLite3のtext→date変換について
-
エクセルVBA 今日の日付行...
-
特定の日付が第何週目にあるか...
-
oracle 文字列 01:45 を時間に...
-
日付型なら変数の先頭になん...
-
Oracle10gのsql分についての質...
-
Excelグラフの日付軸の日付がず...
おすすめ情報