En iyi yanıtlayıcılar
sql sorgusu - ilişkili 4 tablo

Soru
-
bölge,il,ilçe,mahalle isminde ilişkili 4 tablom var. bölge içerisinde bir veriyi düzenlediğim zaman (bölge ismi veya bölge görevlisi) hali hazırdaki bölge ve ilgili il,ilçe,mahalle durumu pasif olacak, ancak yeni bir bölge olarak düzenlediğim bölgede eklenecek.(böylece önceki bölge ismi ve bölge görevlisi istatistik için kalacak, bölgeye ilişkili olan bütün illeri, ilçeleri ve mahalleleride tekrar tanımlamamış olacağım.) bunu nasıl yapabilirim? sql ile mi yoksa başka bir yolu var mı?
create table bolge (b_id int primary key, b_isim varchar (50),b_gorevlisi varchar(50), durum varchar(5));
create table il (il_id int primary key,b_id int, il_isim varchar (50), durum varchar(5));
create table ilce (ilce_id int primary key,il_id int, ilce_isim varchar (50), durum varchar(5));
create table mahalle (mahalle_id int primary key,ilce_id int, mahalle_isim varchar (50), durum varchar(5));
insert into bolge (b_id,b_isim,durum) values
('1','a bölgesi','mehmet bey','aktif'),
('2','b bölgesi','ali bey','aktif'),
('3','c bölgesi','ahmet bey','aktif');
insert into il (il_id,b_id,il_isim,durum) values
('1','1','kayseri','aktif'),
('2','1','adana','aktif'),
('3','1','konya','aktif'),
('4','2','izmir','aktif'),
('5','3','trabzon','aktif'),
('6','3','rize','aktif');
insert into ilce (ilce_id,il_id,ilce_isim,durum) values
('1','1','yahyalı','aktif'),
('2','1','melikgazi','aktif'),
('3','3','meram','aktif'),
('4','5','of','aktif'),
('5','4','torbalı','aktif'),
('6','6','çayeli','aktif'),
('7','2','ceyhan','aktif');
insert into mahalle (mahalle_id,ilce_id,mahalle_isim,durum) values
('1','1','cumhuriyet mahallesi','aktif'),
('2','5','fatih mahallesi','aktif'),
('3','2','merkez mahallesi','aktif'),
('4','7','hürriyet mahallesi','aktif');
b_id 1'in bölge ismini 'aa' ve bölge görevlisini 'ismet bey' yaptım. güncelle butonuna bastığım zaman şöyle bir sonuç gelmeli;
a bölgesi, mehmet bey,pasif | kayseri,pasif | yahyalı,pasif | cumhuriyet mahallesi,pasif
| melikgazi,pasif | merkez mahllesi,pasif
| adana,pasif | ceyhan,pasif | hürriyet mahallesi,pasif
| konya,pasif | meram,pasif |
aa bölgesi, ismet bey,aktif | kayseri,aktif | yahyalı,aktif | cumhuriyet mahallesi,aktif
| melikgazi,aktif | merkez mahllesi,aktif
| adana,aktif | ceyhan,aktif | hürriyet mahallesi,aktif
| konya,aktif | meram,aktif |
biraz uzun oldu ama anlatabilmenin başka yolu yoktu galiba :)
yine yeniden şimdiden teşekkürler (özellikle Çetin Bey)
nigDELI
Yanıtlar
-
CREATE TRIGGER [bolgeGuncelle] ON [bolge] INSTEAD OF UPDATE AS BEGIN DECLARE @minB INT, @minI INT, @minIc INT, @minM INT; SELECT @minB=MIN(b_id)FROM bolge; SELECT @minI=MIN(il_id)FROM il; SELECT @minIc=MIN(ilce_id)FROM ilce; SELECT @minM=MIN(mahalle_id)FROM mahalle; IF @minB>0 SET @minB=0; IF @minI>0 SET @minI=0; IF @minIc>0 SET @minIc=0; IF @minM>0 SET @minM=0; DECLARE @newData TABLE(b_id INT, b_isim VARCHAR(50), b_gorevlisi VARCHAR(50), oldB INT, il_id INT, il_isim VARCHAR(50), oldI INT, ilce_id INT, ilce_isim VARCHAR(50), oldIC INT, mahalle_id INT, mahalle_isim VARCHAR(50), oldM INT); INSERT @newData(b_id, b_isim, b_gorevlisi, oldB, il_id, il_isim, oldI, ilce_id, ilce_isim, oldIC, mahalle_id, mahalle_isim, oldM) SELECT @minB-DENSE_RANK() OVER (ORDER BY b.b_id), b.b_isim, b.b_gorevlisi, b.b_id AS oldB, @minI-DENSE_RANK() OVER (ORDER BY i.il_id), i.il_isim, i.il_id AS oldI, @minIc-DENSE_RANK() OVER (ORDER BY ic.ilce_id), ic.ilce_isim, ic.ilce_id AS oldIC, @minM-DENSE_RANK() OVER (ORDER BY m.mahalle_id), m.mahalle_isim, m.mahalle_id AS oldM FROM Deleted b LEFT JOIN il i ON i.b_id=b.b_id LEFT JOIN ilce ic ON ic.il_id=i.il_id LEFT JOIN mahalle m ON m.ilce_id=ic.ilce_id ORDER BY b.b_id, i.il_id, ic.ilce_id; INSERT INTO bolge(b_id, b_isim, b_gorevlisi, durum) SELECT DISTINCT b_id, b_isim, b_gorevlisi, 'Pasif' FROM @newData WHERE oldB IS NOT NULL; INSERT INTO il(il_id, b_id, il_isim, durum) SELECT DISTINCT il_id, b_id, il_isim, 'Pasif' FROM @newData WHERE oldI IS NOT NULL; INSERT INTO ilce(ilce_id, il_id, ilce_isim, durum) SELECT DISTINCT ilce_id, il_id, ilce_isim, 'Pasif' FROM @newData WHERE oldIC IS NOT NULL; INSERT INTO mahalle(mahalle_id, ilce_id, mahalle_isim, durum) SELECT DISTINCT mahalle_id, ilce_id, mahalle_isim, 'Pasif' FROM @newData WHERE oldM IS NOT NULL; UPDATE bolge SET b_isim=Inserted.b_isim, b_gorevlisi=Inserted.b_gorevlisi FROM dbo.bolge INNER JOIN Inserted ON Inserted.b_id=bolge.b_id; END;
Not: Ben bunun son derece kotu bir tasarım olduğu konusunda bir kez daha uyarıyorum.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.- Yanıt Olarak İşaretleyen Emin DOĞU 3 Ağustos 2019 Cumartesi 11:11
Tüm Yanıtlar
-
Guncelle butonu ile yapılan islem anlasilmiyor.
a bölgesi, mehmet bey, aktif
orijinal deger.
Bu:
aa bölgesi, ismet bey, aktif mi oluyor? Yoksa durum da girilen bir deger mi?
Durum ne olursa olsun digerlerinde aynisi oluyor gibi. Eğer öyleyse, diger tablolarda durum tutmanın ne amaci var?
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
- Düzenleyen CetinBasoz 22 Temmuz 2019 Pazartesi 12:49
-
a bölgesi,mehmet bey otomatik pasif olarak değiştirilecek, bütün ilgili tablolarla birlikte (il,ilçe,mahalle). burada diğer tabloların ilgili değerlerinin pasif olması datagridview de cellformatta kırmızı gösterebilmek için. yoksa 'durum' görüntülenmeyecek.
aa bölgesi, ismet bey,aktif verisi yeni oluşturulacak. bütün ilgili tablolarla birlikte (il,ilçe,mahalle).
yani güncelle butonuyla ilk orjinal kayıt düzenlenecek (a verisi), diğer kayıt eklenecek (aa verisi).
nigDELI
-
Yani pratikte:
UPDATE dbo.bolge SET b_isim='aa', b_gorevlisi='ismet bey' WHERE b_id=1; INSERT INTO bolge ( b_id, b_isim, b_gorevlisi, durum ) VALUES ( -1, 'a bölgesi', 'mehmet bey', 'pasif' );
gibi mi olacak? Butun o mahalle, il ... pasif olarak kopyalanmasinin da bir amaci var mi?
Not: Sanirim data tasarimlarini biraz netlestirmen lazim once. Hepsinde neden durum var mesela.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop. -
geriye yönelik bütün verileride tutmamız gerektiği için bolge,il,ilçe,mahalle silinmeden pasif olarak update edilecek. bölge,il,ilçe mahalle bilgileri (aa bölgesi ve ismet bey, durum:aktif) yeni oluşturulacak ki, ilk a verisiyle bağlantılı illeri,ilçeleri,mahalleleri tek tek form arayüzünden girmek zorunda kalmayalım.
kısacası a verisi aa olarak tekrar kaydedilecek ve a verisi durum:pasif olarak update edilecek. Ve bu işlem bütün iller, ilçeler ve mahalleler içinde gerçekleştirilecek.
nigDELI
-
Kusura bakma ama bence bu çok kotu bir data tasarımı. Neden, bir isim değişecek diye, bir ton veri kopyalansın ki.
Hersey ayni, durum orijinaldeki durum (durum neden hepsinde var hala anlamış degilim).
(Devlet dairesinde arşivlemek gibi olmuş:)
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
- Düzenleyen CetinBasoz 22 Temmuz 2019 Pazartesi 15:56
-
-
Trigger ile yazabilirsin. Tam olarak yapılacak islemi bir turlu anlayamıyorum (belki de anlamsız geldigi icin). Ben yine de bir sure sonra elim boş oldugunda sana bir trigger yazayım, sen bakarsın öyle mi degil mi diye.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop. -
-
triggerlari yazmistim ben, nereye gitti acaba.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop. -
-
CREATE TRIGGER [bolgeGuncelle] ON [bolge] INSTEAD OF UPDATE AS BEGIN DECLARE @minB INT, @minI INT, @minIc INT, @minM INT; SELECT @minB=MIN(b_id)FROM bolge; SELECT @minI=MIN(il_id)FROM il; SELECT @minIc=MIN(ilce_id)FROM ilce; SELECT @minM=MIN(mahalle_id)FROM mahalle; IF @minB>0 SET @minB=0; IF @minI>0 SET @minI=0; IF @minIc>0 SET @minIc=0; IF @minM>0 SET @minM=0; DECLARE @newData TABLE(b_id INT, b_isim VARCHAR(50), b_gorevlisi VARCHAR(50), oldB INT, il_id INT, il_isim VARCHAR(50), oldI INT, ilce_id INT, ilce_isim VARCHAR(50), oldIC INT, mahalle_id INT, mahalle_isim VARCHAR(50), oldM INT); INSERT @newData(b_id, b_isim, b_gorevlisi, oldB, il_id, il_isim, oldI, ilce_id, ilce_isim, oldIC, mahalle_id, mahalle_isim, oldM) SELECT @minB-DENSE_RANK() OVER (ORDER BY b.b_id), b.b_isim, b.b_gorevlisi, b.b_id AS oldB, @minI-DENSE_RANK() OVER (ORDER BY i.il_id), i.il_isim, i.il_id AS oldI, @minIc-DENSE_RANK() OVER (ORDER BY ic.ilce_id), ic.ilce_isim, ic.ilce_id AS oldIC, @minM-DENSE_RANK() OVER (ORDER BY m.mahalle_id), m.mahalle_isim, m.mahalle_id AS oldM FROM Deleted b LEFT JOIN il i ON i.b_id=b.b_id LEFT JOIN ilce ic ON ic.il_id=i.il_id LEFT JOIN mahalle m ON m.ilce_id=ic.ilce_id ORDER BY b.b_id, i.il_id, ic.ilce_id; INSERT INTO bolge(b_id, b_isim, b_gorevlisi, durum) SELECT DISTINCT b_id, b_isim, b_gorevlisi, 'Pasif' FROM @newData WHERE oldB IS NOT NULL; INSERT INTO il(il_id, b_id, il_isim, durum) SELECT DISTINCT il_id, b_id, il_isim, 'Pasif' FROM @newData WHERE oldI IS NOT NULL; INSERT INTO ilce(ilce_id, il_id, ilce_isim, durum) SELECT DISTINCT ilce_id, il_id, ilce_isim, 'Pasif' FROM @newData WHERE oldIC IS NOT NULL; INSERT INTO mahalle(mahalle_id, ilce_id, mahalle_isim, durum) SELECT DISTINCT mahalle_id, ilce_id, mahalle_isim, 'Pasif' FROM @newData WHERE oldM IS NOT NULL; UPDATE bolge SET b_isim=Inserted.b_isim, b_gorevlisi=Inserted.b_gorevlisi FROM dbo.bolge INNER JOIN Inserted ON Inserted.b_id=bolge.b_id; END;
Not: Ben bunun son derece kotu bir tasarım olduğu konusunda bir kez daha uyarıyorum.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.- Yanıt Olarak İşaretleyen Emin DOĞU 3 Ağustos 2019 Cumartesi 11:11