كيف يمكنني تحويل هذا PL/SQL update بحيث يعمل في SQL SERVER?
-
22-07-2019 - |
سؤال
أنا طلبت تحويل هذا البيان من PL/SQL على ملقم SQL:
UPDATE pdi_nb_process_complete pdi_end1
SET (pdi_end1.adp_issue_date_time, pdi_end1.adp_print_date_time) =
(SELECT DISTINCT pdi_end1.completion_date + 2
,pdi_end1.completion_date
FROM cl100 cl
WHERE cl.polref = pdi_end1.policy_reference
AND cl.doctyp = 'PSP')
WHERE pdi_end1.adp_print_date_time IS NULL
مستقيم نسخ/لصق لا يعمل - تحصل على خطأ ترجمة.أقرب تمكنت هو هذا:
UPDATE pdi_end1
SET pdi_end1.adp_issue_date_time = pdi_end1.completion_date + 2,
pdi_end1.adp_print_date_time = pdi_end1.completion_date
from pdi_nb_process pdi_end1
INNER JOIN cl100 cl ON cl.polref = pdi_end1.policy_reference
AND cl.doctyp = 'PSP'
WHERE pdi_end1.adp_print_date_time IS NULL
ولكن هذا يترك لي قصيرة من متميزة.هل من أحد لديه أي اقتراحات ؟
يمكنك أن تفترض Oracle و SQL Server قواعد البيانات لها نفس الجداول والحقول.
شكرا
المحلول
أود أن نقل و cl.doctyp='PSP' الشرط فيها ، لأنه ليس من الانضمام إلى الشرط.
جرب هذا:
UPDATE pdi_end1
SET pdi_end1.adp_issue_date_time=pdi_end1.completion_date + 2
,pdi_end1.adp_print_date_time)=pdi_end1.completion_date
FROM pdi_nb_process_complete pdi_endl
INNER JOIN cl100 cl ON cl.polref=pdi_end1.policy_reference
WHERE pdi_end1.adp_print_date_time IS NULL
AND cl.doctyp='PSP'
وأود أن لا تقلق حول متميزة, SQL Server فقط تحديث الصفوف مرة واحدة ، انظر هذا المثال:
SET NOCOUNT ON
DECLARE @Test table (RowID int, RowValue int, OtherRowValue int)
INSERT INTO @Test VALUES ( 1, 1, 10)
INSERT INTO @Test VALUES ( 2, 2, 20)
INSERT INTO @Test VALUES ( 3, 3, 30)
INSERT INTO @Test VALUES ( 4, 4, 40)
INSERT INTO @Test VALUES ( 5, 5, 50)
INSERT INTO @Test VALUES ( 6, 6, 60)
INSERT INTO @Test VALUES ( 7, 7, 70)
INSERT INTO @Test VALUES ( 8, 8, 80)
INSERT INTO @Test VALUES ( 9, 9, 90)
INSERT INTO @Test VALUES (10,10,100)
DECLARE @TestJoin table (RowID int, RowValue int)
INSERT INTO @TestJoin VALUES (1,10)
INSERT INTO @TestJoin VALUES (1,10)
INSERT INTO @TestJoin VALUES (1,10)
INSERT INTO @TestJoin VALUES (2,20)
INSERT INTO @TestJoin VALUES (2,20)
INSERT INTO @TestJoin VALUES (2,20)
INSERT INTO @TestJoin VALUES (2,20)
INSERT INTO @TestJoin VALUES (2,20)
INSERT INTO @TestJoin VALUES (3,30)
INSERT INTO @TestJoin VALUES (3,30)
SET NOCOUNT OFF
SELECT ---------------------------returns 5 rows, DISTINCT would only return 1
t.OtherRowValue+2
FROM @Test t
INNER JOIN @TestJoin j ON t.RowID=j.RowID
WHERE t.OtherRowValue=20
AND j.RowValue=20
UPDATE t--------------------------updates only 1 row
SET t.RowValue=t.OtherRowValue+2
FROM @Test t
INNER JOIN @TestJoin j ON t.RowID=j.RowID
WHERE t.OtherRowValue=20
AND j.RowValue=20
الإخراج:
-----------
22
22
22
22
22
(5 row(s) affected)
(1 row(s) affected)
تحديد عوائد 5 الصفوف ، ومع ذلك عند نفس حدد في التحديث فقط 1 الصف يتأثر.
نصائح أخرى
يمكنك تغيير الداخلية الانضمام إلى فرعي:
inner join (
select distinct policy_reference
from cl100
where doctyp = 'PSP'
) cl on cl.polref = pdi_end1.policy_reference
أو ربما أكثر قابلية للقراءة ، وإزالة inner join تماما واستبدالها حيث البيان:
WHERE pdi_end1.adp_print_date_time IS NULL
AND EXISTS (
select *
from cl100 cl
where cl.polref = pdi_end1.policy_reference
and cl.doctyp = 'PSP'
)
لا تنتمي إلى StackOverflow