CTE और केवल CTE :-)
सिर्फ अतिरिक्त सामान बाहर फेंक देते हैं। जीवन के सभी मामलों के लिए यहां लगभग पूर्ण और क्रियात्मक रूप है। और आप किसी भी संक्षिप्त रूप का उपयोग कर सकते हैं।
INSERT INTO reports r
(r.id, r.name, r.key, r.param)
-
-- Invoke this script from "WITH" to the end (";")
-- to debug and see prepared values.
WITH
-- Some new data to add.
newData AS(
SELECT 'Name 1' name, 'key_new_1' key FROM DUAL
UNION SELECT 'Name 2' NAME, 'key_new_2' key FROM DUAL
UNION SELECT 'Name 3' NAME, 'key_new_3' key FROM DUAL
),
-- Any single row for copying with each new row from "newData",
-- if you will of course.
copyData AS(
SELECT r.*
FROM reports r
WHERE r.key = 'key_existing'
-- ! Prevent more than one row to return.
AND FALSE -- do something here for than!
),
-- Last used ID from the "reports" table (it depends on your case).
-- (not going to work with concurrent transactions)
maxId AS (SELECT MAX(id) AS id FROM reports),
-
-- Some construction of all data for insertion.
SELECT maxId.id + ROWNUM, newData.name, newData.key, copyData.param
FROM copyData
-- matrix multiplication :)
-- (or a recursion if you're imperative coder)
CROSS JOIN newData
CROSS JOIN maxId
-
-- Let's prevent re-insertion.
WHERE NOT EXISTS (
SELECT 1 FROM reports rs
WHERE rs.name IN(
SELECT name FROM newData
));
मैं इसे "यदि मौजूद नहीं" स्टेरॉयड पर कहते हैं। तो, यह मेरी मदद करता है और मैं ज्यादातर ऐसा करता हूं।
क्या आप उम्मीद कर रहे हैं कि INSERT कथन आम तौर पर आवश्यक होगा (यानी आम तौर पर पंक्ति मौजूद नहीं होगी)? या वह पंक्ति आम तौर पर मौजूद होगी? –
@justin: आम तौर पर पंक्ति मौजूद नहीं होगी। – Topera
कूल। फिर यहां तीनों विकल्पों में से कोई भी आपके लिए काम करना चाहिए। –