none
sql sorgusu - ilişkili 4 tablo RRS feed

  • 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

    22 Temmuz 2019 Pazartesi 11:51

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
    2 Ağustos 2019 Cuma 15:06

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
    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

    22 Temmuz 2019 Pazartesi 14:10
  • 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.

    22 Temmuz 2019 Pazartesi 14:25
  • 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

    22 Temmuz 2019 Pazartesi 15:35
  • 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
    22 Temmuz 2019 Pazartesi 15:55
  • mantığı yada data tasarımını görmezden gelirsek tablodaki bir veriyi ve birbirleriyle ilişkili diğer tablolardaki verileri başka bir id ile tekrar nasıl oluşturabiliriz? (Sorunun çözümü olarak sql de olabilir c# da olabilir)

    nigDELI

    25 Temmuz 2019 Perşembe 08:24
  • 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.

    25 Temmuz 2019 Perşembe 12:55
  • problemi tablo yapısını değiştirerek farklı bir şekilde halletmeye bakıyorum. ancak fuzuli bir konu oldu. yer işgal etmemesi için silinemiyor mu konular?

    nigDELI

    1 Ağustos 2019 Perşembe 14:29
  • 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.

    1 Ağustos 2019 Perşembe 19:42
  • triggerlarımı gören var mı? :)

    yazılmış triggerlara bakabilseydik (bulabilseydik) ufkumuzu genişletmesi açısından  iyi olurdu...


    nigDELI

    2 Ağustos 2019 Cuma 07:07
  • 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
    2 Ağustos 2019 Cuma 15:06