データベースに 3 つのテーブルがあります。
- PARENT_Aには「ID」主キー列があります。
- PARENT_Bには「ID」主キー列があります。
- CHILDには、「PARENT_A_ID」および「PARENT_B_ID」の外部キー列があります。また、VARCHAR である「START_DATE」列もあります (残念ながら、これを変更することはできません)。
さて、次のクエリがあります。
更新- サブクエリを更新して、実際のコードにもう少し似たものにしました。c2 には、START_DATE が有効な日付であることを保証する追加の制限があります。
SELECT *
FROM PARENT_B pb
LEFT OUTER JOIN CHILD c1 ON c1.PARENT_B_ID = pb.ID
WHERE pb.ID IN
(
SELECT c2.PARENT_B_ID
FROM PARENT_A pa
LEFT OUTER JOIN CHILD c2 ON c2.PARENT_A_ID = pa.ID
WHERE TO_DATE(c2.START_DATE, 'mm/dd/yyyy') BETWEEN
ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -12) AND
(TRUNC(SYSDATE, 'MONTH') - 1)
AND c2.HAS_VALID_DATE = 1
);
このクエリは失敗します。ORA-01843: not a valid month
例外があります。ただし、最初の結合 (クエリの 3 行目) を削除すると、クエリは正常に実行されます。
何が起こっているのかわかりません。サブクエリはそれ自体で正常に実行され、すべての値が正しい日付形式になっています。
何が起こっているのか誰にも分かりませんか?