Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Firebird'de Join'li Update nasıl yapılır?
#1
Merhaba,

Firebird konusunda yeniyim, o nedenle absürt sorularımla karşılaşırsanız hoş görün.

A ve B adlı iki tablom var. A tablosundaki bir alanı B tablosundaki başka bir alandan hesaplayıp UPDATE edeceğim. Mesela şunun gibi "sözde" bir kod olsun;

UPDATE  A 
SET     A.FALAN = SUM(B.Filan)
FROM    TABLO1   A
JOIN    TABLO2   B on A.ID = B.FilanID
WHERE   A.BilmemNe = 33

Bunun Firebird'cesi nedir veya bu kodun yaptığını Firebird 2.5 alemindeki karşılığı nedir?

YouTube Delphi Tips

"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" P.Safa
WWW
Cevapla
#2
https://stackoverflow.com/questions/2480...es#tab-top

Yukarıdaki linkte mümkün olmadığı yazılmış. Sub Query mantığında yapılmış. Dolayısıyla sizin kodunuz aşağıdaki şekilde yapılırsa çözülmüş olur.
UPDATE TABLO1 A SET A.FALAN = (SELECT SUM(B.Filan) TABLO2 B WHERE B.FilanID = A.ID) WHERE   A.BilmemNe = 33

Ayırca aşağıdaki kendi dokümanında da ben join yapılmış bir işlem bulamadım.
http://www.firebirdsql.org/file/document...pdate.html
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#3
MERGE ile aşağıdaki şekilde yapabilirsiniz;

MERGE INTO C1 AS T1
     USING C2 AS T2
       ON T1.KOD = T2.C1KOD
       WHEN MATCHED THEN
            UPDATE SET T1.BORC = T1.BORC + T2.TUTAR

yada EXECUTE BLOCK ile aşağıdaki şekilde;

EXECUTE BLOCK
AS
DECLARE VARIABLE TOPLAM decimal(15,2);
DECLARE VARIABLE C1KOD integer;
BEGIN
  for
  select C1KOD, SUM(TUTAR) FROM C2 GROUP BY C1KOD
  into :C1KOD, :TOPLAM
  do
  update C1 SET BORC = :TOPLAM
  where KOD = :C1KOD;
END
WWW
Cevapla
#4
(11-02-2020, Saat: 13:32)uparlayan Adlı Kullanıcıdan Alıntı: Merhaba,

Firebird konusunda yeniyim, o nedenle absürt sorularımla karşılaşırsanız hoş görün.

A ve B adlı iki tablom var. A tablosundaki bir alanı B tablosundaki başka bir alandan hesaplayıp UPDATE edeceğim. Mesela şunun gibi "sözde" bir kod olsun;

UPDATE  A 
SET     A.FALAN = SUM(B.Filan)
FROM    TABLO1   A
JOIN    TABLO2   B on A.ID = B.FilanID
WHERE   A.BilmemNe = 33

Bunun Firebird'cesi nedir veya bu kodun yaptığını Firebird 2.5 alemindeki karşılığı nedir?

verdiğin örnekte SUM(B.Filan) olmasaydı, işin çok basitti, yani;

UPDATE A
SET A.FALAN = B.Filan
FROM TABLO1 A, TABLO2 B
WHERE A.ID = B.FilanID and A.BilmemNe = 33

ama işin içinde SUM olunca, GROUP BY da oluyor. bu da geçici bir tablo demek

Firebird 2.1 ve üstü kullanıyorsan (aşağısını zaten kullanma artık)
"Global Temporary Tables" (yani genel kullanıma açık geçici tablolar) kullanman lazım.

Yani SUM(B.Filan) kısmını geçici bir tabloya atman, sonra geçici tablo ile UPDATE - JOIN yapman lazım...

Syntax'ı şu şekilde;
(AŞAĞIDAKİLERİ STORED PROCEDURE ŞEKLİNDE VERİTABANINA UYGUN YERLEŞTİRMEN LAZIM)

CREATE GLOBAL TEMPORARY TABLE B_TABLOSU
(
FilanID,
veasire,
filan
)
ON COMMIT PRESERVE ROWS;
COMMIT;

ikinci adım;

INSERT INTO B_TABLOSU
SELECT DISTINCT falan, SUM(filan) AS filan_TOPLAMI
FROM B_TABLOSU
WHERE falan>fismekan
GROUP BY falan

son adım;

UPDATE A
SET A.FALAN = B.filan_TOPLAMI (burası senin SUM kısmın)
FROM TABLO1 A, filan_TOPLAMI B
WHERE A.ID = B.FilanID and A.BilmemNe = 33
Cevapla
#5
FireBird kısmına biraz yabancıyım ama update .. set komutu from desteği sunuyorsa bütün hesaplama işlemlerini burada alt sorgu (subquery) olarak sorgulayıp buradan değerleri getirmek de denenebilir. 
update A set A.FALAN=TBL.FILAN
FROM (
 select A.ID, sum(B.Filan) as FILAN FROM TABLO1   A
 JOIN    TABLO2   B on A.ID = B.FilanID
) TBL
WHERE A.ID=TBL.ID and A.BilmemNe=33
gibi.
Cevapla
#6
Size Firebird' de olan ve başka hiç bir veritabanında rastlamadığım muhteşem bir özelliği aktarayım, bilen vardır mutlaka ama ben sınırsız kullanıyorum. Hatta çoğunlukla view yazmaya bile gerek kalmıyor;
IbExpertte A tablosundaki bir alanı B tablosuna çekme ve anlık değişimi B tablosunda da izlemek için
COMPUTED BY alan kullanımı;

B tablosunu açıp NEW FIELD i seçin. Alan adı verin. Örneğin A_DAN_GELEN_BILGI
Computed By sekmesine geçip şunu yazın:

(SELECT ALAN1 FROM TABLOA WHERE TABLOA.ANAHTAR_ALAN=TABLOB.ANAHTAR_ALAN)
Anahtar alan ortak bilgi olmalı ve iki tabloda da aynı değeri taşımalı.

Bu özelliği matematiksel işlemlerde de kullanabilirsiniz, ancak veri miktarı arttıkça tablo yavaşlar. Detay tablodan Ana tabloya SUM(...) ile toplam çekmek gibi mesela
Bir diğer yöntem de trigger ile update yapabilirsiniz. Tablo A after Post olayına;

(UPDATE TABLOB SET ALAN1=NEW.GÖNDERİLECEK_BİLGİ WHERE TABLOB.ANAHTAR_ALAN=NEW.TABLOA.ANAHTAR_ALAN)

Bu kadar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firebird Ağ Yavaşlığı Nedenleri baloglurecep 14 1.430 08-07-2020, Saat: 20:53
Son Yorum: mrmarman
  Firebird Request synchronization error uparlayan 6 425 30-05-2020, Saat: 10:58
Son Yorum: klavye
  post_event roolback nasıl tetiklenir info@guzelceker.com 0 134 27-05-2020, Saat: 18:14
Son Yorum: info@guzelceker.com
  Firebird 2.0 dan 3.0'a geçiş nasıl yapılmalı? baloglurecep 15 1.301 18-05-2020, Saat: 01:31
Son Yorum: Ahmet İPEKÇİ
  Firebird Monitor Yazılımı arıyorum boreas 3 475 08-05-2020, Saat: 13:32
Son Yorum: esistem



Konuyu Okuyanlar: 1 Ziyaretçi