2016-04-12 18 views
3

varsayalım SQL Server Aşağıdaki tabloda (2012) vardır:SQL Server - Verimli yolu verilerim bir haritalama/topaklanmaya oluşturmak için

MyTable: 
Col1: Col2: Col3: Col4: Val1: ... Valn: 
a  b  c  d  123   1234 
.... 

Ve map edecek bir eşleme tablosu oluşturmak için arıyorum Belirli bir etikete Col1 - Col4 spesifik değerleri için. aşağıdaki gibi Yani, örneğin, bu görünebilir: örneğin, ilk satır olarak okunabilir,

MyMaps: 
Col1: Col2: Col3: Col4: Label: 
a  <null> <null> d  Label1 
<null> b  <null> d  Label2  

: nerede Col1 = MyTable herhangi satıra etiketi 'Label1' ver 'a' ve Col4 = 'd'.

SELECT 
    MyMaps.Label 
    ,MyTable.Val1 
    ... 
    ,MyTable.Valn 
FROM 
    MyTable 
    INNER JOIN MyMaps 
    ON ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '') 
    AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '') 
    AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '') 
    AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '') 

Ve çalışır, ancak bir varsa bu Bunu gerçekleştirmek için iyi bir yoldur, eğer merak ediyorum ya:

Yani, bu eşleme için izin edebilirsiniz oluşturduğum sorgu MyTable oldukça büyük bir tablo olduğundan, harita oluşturmanın daha iyi/daha verimli bir yolu.

Herhangi bir düşünce/öneri?

+1

yapmadan katılabilirsiniz, MyMaps'ler içeriyorsa ne olur (null, b, c, null) Label3? Bir eşleşme ve bu yüzden Label1. Doğru etiketi nasıl seçersiniz? Ayrıca, birleştirme koşulunuza bağlı olarak, COALESCE ve ISNULL kullandığınızdan büyük bir tabloda iyi performans göstermez. – dfdsfdsfsdf

+1

Bir sayfanın 'MyTable' tablosu için 2 harita bulunduğunda ne olur? –

+0

@KMC & Siyavash, iyi nokta. Bunun nasıl yapılacağına dair bir fikrim yok ve verdiğim verilerden dolayı böyle olmayacağımı farz ediyorum. Bu tür bir eşleştirmeyi nasıl gerçekleştirecek konusunda hiçbir fikrim yok. –

cevap

3

ilk maçı seçerek veya birleşimler kompleksi kullanılarak veya ex döngüler ve vb)

SELECT 

      t.*, 
      Label = ( 
        --since there can be multiple matches, this is where you apply your rules 
        select top 1 label 
        from MyMaps 
        where ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '') 
         AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '') 
         AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '') 
         AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '') 
        ) 

    FROM MyTable t 

küçük bir tablo için ise karmaşık TSQL yazma olarak böyle yapmak için birden çok yolu vardır, o zaman sorun yok . Büyük tablo için, MyTable'ın MyMaps ile nasıl eşleştiğini tanımlayan bir eşleme tablosuna sahip olmak isteyebilirsiniz (MyTableLabel'a yeniden adlandırın). Ekleme veya güncelleştirme işlemi gerçekleştirdiğinizde eşleştirmeyi hesaplayabilirsiniz. Alternatif olarak, eğer bir zaman çizelgesi yani buluşma tablosu olarak MyMaps biliniyorsa alternatif olarak, (a, b, c, d, label 1), (null, b, c, null, label2) gibi tüm birleşimleri tanımlayabilirsiniz, (null, null, null, d, label3). Bu yolla, MyTable'ın ABCD kodlaması olduğundan, Cookies ve ISNULL

+0

İSTİYORUM Haritalamayı zamanın ötesinde yapabilirim - Bu kesinlikle en fazla anlam ifade eder! - Maalesef, işletme kullanıcıları kuralları neredeyse dinamik olarak Haritalar tablosunu kullanarak tanımlayabilmek istemiyor. Sadece kullanabildiğimden daha iyi bir haritalama şeması/uygulaması olabileceğini umuyorum ... Bunun üzerine bir fikrin var mı? Şu an için –

+1

, sadece örneğimde olduğu gibi bir alt sorgu kullanın. 1. maçı kullanacak. İşletme kullanıcılarınıza birden çok eşleşmeyi nasıl ele alabileceklerini sormalısınız. Ex) için en çok sütun eşleşen maç ilk olarak kullanılmalı mı? İş kullanıcılarınızdan daha fazla gereksinim duyduğunuzda kodu optimize edersiniz.Ex) için onlar, sorgu 2 saniye – dfdsfdsfsdf

+0

altında sonuç döndürmesi gerektiğini bir işlevsel olmayan gereksinimi verebilir Ben insanlar senin çözümün en iyisi olduğunu kabul ediyorum - Ben burada tutuyordum ve bir dolu Meryem burada umut umuyoruz, ama çok teşekkür ederim Bu soruya dikkatiniz ve cevabınız için çok teşekkürler! –