Pastki so'rov va holatlar bayonotidan foydalanib yangilang

I was writing a update query with some case statements. when case doesn't satisfy it will update the column with NULL.
Following is the query :

 UPDATE TGT
 SET C1 = CASE WHEN TGT.c2 = SRC.c2 AND SRC.C3 = 'P' THEN SRC.C1 ELSE NULL END,
     C4 = CASE WHEN TGT.c5 = SRC.c5 AND SRC.C3 = 'D' THEN SRC.C4 ELSE NULL END
    FROM SRC;

Har doim NULLni to'ldiradi, hatto ma'lumotlar manba jadvalida mavjud.

Yordam uchun rahmat.

0
Voqealar ifodalari, bayonotlar emas ...
qo'shib qo'ydi muallif jarlh, manba
Voqealar ifodalari, bayonotlar emas ...
qo'shib qo'ydi muallif jarlh, manba
Voqealar ifodalari, bayonotlar emas ...
qo'shib qo'ydi muallif jarlh, manba
Voqealar ifodalari, bayonotlar emas ...
qo'shib qo'ydi muallif jarlh, manba
Bu so'rov hech narsa yangilamasdan ishlaydi yoki xato qiladimi?
qo'shib qo'ydi muallif Aleksej, manba
Va bu Oracle?
qo'shib qo'ydi muallif Aleksej, manba
Bu so'rov hech narsa yangilamasdan ishlaydi yoki xato qiladimi?
qo'shib qo'ydi muallif Aleksej, manba
Bu so'rov hech narsa yangilamasdan ishlaydi yoki xato qiladimi?
qo'shib qo'ydi muallif Aleksej, manba
Va bu Oracle?
qo'shib qo'ydi muallif Aleksej, manba
Va bu Oracle?
qo'shib qo'ydi muallif Aleksej, manba
@Gororan: Bu yangilanishda "pastki so'rov" kabi. O'ylaymanki, bu muammo emas. Hech qanday kompilyatsiya xatosi yo'q edi.
qo'shib qo'ydi muallif Biswabid, manba
@Gororan: Bu yangilanishda "pastki so'rov" kabi. O'ylaymanki, bu muammo emas. Hech qanday kompilyatsiya xatosi yo'q edi.
qo'shib qo'ydi muallif Biswabid, manba
Oracle va Vetica ham.
qo'shib qo'ydi muallif Biswabid, manba
Oracle va Vetica ham.
qo'shib qo'ydi muallif Biswabid, manba
Yo'q, bu bitta so'rov. Jadvaldagi barcha yozuvlarni yangilaydi, ammo faqat NULL qiymati bilan.
qo'shib qo'ydi muallif Biswabid, manba
Yo'q, bu bitta so'rov. Jadvaldagi barcha yozuvlarni yangilaydi, ammo faqat NULL qiymati bilan.
qo'shib qo'ydi muallif Biswabid, manba
Oracle va Vetica ham.
qo'shib qo'ydi muallif Biswabid, manba
Qoidalar qoniqtirilmasa, faqat C1 ustunini nolga almashtiradigan buyruq fayliga o'xshaydi. Agar qoidalar qoniqarsa, siz hech narsa qilmaysiz - ustun qiymati bir xil bo'ladi. Bu shundaymi?
qo'shib qo'ydi muallif Goran Stefanović, manba
Qoidalar qoniqtirilmasa, faqat C1 ustunini nolga almashtiradigan buyruq fayliga o'xshaydi. Agar qoidalar qoniqarsa, siz hech narsa qilmaysiz - ustun qiymati bir xil bo'ladi. Bu shundaymi?
qo'shib qo'ydi muallif Goran Stefanović, manba
Bu noto'g'ri sintaksisi. Ehtimol, bu subkerak ichida CASE mavjudmi? MODE C1 = (SELECT CASE ...) da bo'lgani kabi?
qo'shib qo'ydi muallif Goran Stefanović, manba
Bu noto'g'ri sintaksisi. Ehtimol, bu subkerak ichida CASE mavjudmi? MODE C1 = (SELECT CASE ...) da bo'lgani kabi?
qo'shib qo'ydi muallif Goran Stefanović, manba
Bu noto'g'ri sintaksisi. Ehtimol, bu subkerak ichida CASE mavjudmi? MODE C1 = (SELECT CASE ...) da bo'lgani kabi?
qo'shib qo'ydi muallif Goran Stefanović, manba

7 javoblar

update iborasida Oracle dan yoki join ni qo'llab-quvvatlamaydi. Biroq, pastki so'rovdan foydalanishingiz mumkin:

UPDATE TGT
    SET C1 = (CASE WHEN EXISTS (SELECT 1
                                FROM SRC
                                WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                   THEN TGT.C1 ELSE NULL
              END);

Eslatma: Yuqoridagi barcha satrlarni yangilaydi. Agar siz mos kelmaydigan satrlarni yangilashni istasangiz da mavjud emas dan foydalaning :

UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );
2
qo'shib qo'ydi
@Biswabid: Agar siz yana bir narsani yangilashingiz kerak bo'lsa, unda bitta ustun to'siq (c1, c2, c3) = (x1, x2, x3 ni tanlang ...)
qo'shib qo'ydi muallif a_horse_with_no_name, manba
Buni faqat bitta ustunni yangilaganimizda sinab ko'rish mumkin. Agar 1dan ortiq ustun yangilanishi kerak bo'lsa, u yordam bermaydi. Guess, men ham ishlash muammolari berishi mumkin. Har qanday fikr?
qo'shib qo'ydi muallif Biswabid, manba

update iborasida Oracle dan yoki join ni qo'llab-quvvatlamaydi. Biroq, pastki so'rovdan foydalanishingiz mumkin:

UPDATE TGT
    SET C1 = (CASE WHEN EXISTS (SELECT 1
                                FROM SRC
                                WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                   THEN TGT.C1 ELSE NULL
              END);

Eslatma: Yuqoridagi barcha satrlarni yangilaydi. Agar siz mos kelmaydigan satrlarni yangilashni istasangiz da mavjud emas dan foydalaning :

UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );
2
qo'shib qo'ydi
@Biswabid: Agar siz yana bir narsani yangilashingiz kerak bo'lsa, unda bitta ustun to'siq (c1, c2, c3) = (x1, x2, x3 ni tanlang ...)
qo'shib qo'ydi muallif a_horse_with_no_name, manba
Buni faqat bitta ustunni yangilaganimizda sinab ko'rish mumkin. Agar 1dan ortiq ustun yangilanishi kerak bo'lsa, u yordam bermaydi. Guess, men ham ishlash muammolari berishi mumkin. Har qanday fikr?
qo'shib qo'ydi muallif Biswabid, manba

update iborasida Oracle dan yoki join ni qo'llab-quvvatlamaydi. Biroq, pastki so'rovdan foydalanishingiz mumkin:

UPDATE TGT
    SET C1 = (CASE WHEN EXISTS (SELECT 1
                                FROM SRC
                                WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                   THEN TGT.C1 ELSE NULL
              END);

Eslatma: Yuqoridagi barcha satrlarni yangilaydi. Agar siz mos kelmaydigan satrlarni yangilashni istasangiz da mavjud emas dan foydalaning :

UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );
2
qo'shib qo'ydi
@Biswabid: Agar siz yana bir narsani yangilashingiz kerak bo'lsa, unda bitta ustun to'siq (c1, c2, c3) = (x1, x2, x3 ni tanlang ...)
qo'shib qo'ydi muallif a_horse_with_no_name, manba
Buni faqat bitta ustunni yangilaganimizda sinab ko'rish mumkin. Agar 1dan ortiq ustun yangilanishi kerak bo'lsa, u yordam bermaydi. Guess, men ham ishlash muammolari berishi mumkin. Har qanday fikr?
qo'shib qo'ydi muallif Biswabid, manba

update iborasida Oracle dan yoki join ni qo'llab-quvvatlamaydi. Biroq, pastki so'rovdan foydalanishingiz mumkin:

UPDATE TGT
    SET C1 = (CASE WHEN EXISTS (SELECT 1
                                FROM SRC
                                WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                   THEN TGT.C1 ELSE NULL
              END);

Eslatma: Yuqoridagi barcha satrlarni yangilaydi. Agar siz mos kelmaydigan satrlarni yangilashni istasangiz da mavjud emas dan foydalaning :

UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );
2
qo'shib qo'ydi
@Biswabid: Agar siz yana bir narsani yangilashingiz kerak bo'lsa, unda bitta ustun to'siq (c1, c2, c3) = (x1, x2, x3 ni tanlang ...)
qo'shib qo'ydi muallif a_horse_with_no_name, manba
Buni faqat bitta ustunni yangilaganimizda sinab ko'rish mumkin. Agar 1dan ortiq ustun yangilanishi kerak bo'lsa, u yordam bermaydi. Guess, men ham ishlash muammolari berishi mumkin. Har qanday fikr?
qo'shib qo'ydi muallif Biswabid, manba

src -ga tegishli "P" yozuvi mavjud bo'lmagan joyda c1 ni o'rnatishni xohlaysiz. Shu sababdan NOT EXISTS dan foydalaning:

UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
  SELECT *
  FROM src
  WHERE src.c2 = tgt.c2 =  AND src.c3 = 'P'
);

UPDATE: You have just changed your question and it is now two different fields that you want to set null in two different circumstances. I suggest you simply use two statements then: The above for c1 and a similar for c4. No need to make things more complicated than they really are.

0
qo'shib qo'ydi

src -ga tegishli "P" yozuvi mavjud bo'lmagan joyda c1 ni o'rnatishni xohlaysiz. Shu sababdan NOT EXISTS dan foydalaning:

UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
  SELECT *
  FROM src
  WHERE src.c2 = tgt.c2 =  AND src.c3 = 'P'
);

UPDATE: You have just changed your question and it is now two different fields that you want to set null in two different circumstances. I suggest you simply use two statements then: The above for c1 and a similar for c4. No need to make things more complicated than they really are.

0
qo'shib qo'ydi

src -ga tegishli "P" yozuvi mavjud bo'lmagan joyda c1 ni o'rnatishni xohlaysiz. Shu sababdan NOT EXISTS dan foydalaning:

UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
  SELECT *
  FROM src
  WHERE src.c2 = tgt.c2 =  AND src.c3 = 'P'
);

UPDATE: You have just changed your question and it is now two different fields that you want to set null in two different circumstances. I suggest you simply use two statements then: The above for c1 and a similar for c4. No need to make things more complicated than they really are.

0
qo'shib qo'ydi