2016-04-01 9 views
3

Tek bir tablo TempImport'um var ve seçili sorgu sonucu görüntüdür. Ama SQL Server kullanarak tempImport tabloda mevcut sipariş olarak kodla sırayla sonuç almak isteyensql sunucusunda sıralama yapmadan kayıtları seçin

seçme sorgusu geçerli:

SELECT DISTINCT Code, 
    (dd.dd_receipt_no) 
FROM TempImport tm WITH(NOLOCK) 
    INNER JOIN depositor_mast dm WITH(NOLOCK) 
      ON tm.Code = dm.dm_code 
    INNER JOIN deposit_detl dd WITH(NOLOCK) 
      ON dm.dm_srno = dd.dd_dm_srno 
WHERE dd.dd_dt_code IN ('PDFP', 'PDFD', 'PDFE') 
    AND tm.Remark = 'OK' 
    AND dm.dm_dep_ind = 'PDEP' 
    AND dd.dd_delind = 'L' 
    AND dd.dd_exit_date = 0 
    AND (dd.Certificate_No = '' OR dd.Certificate_No IS NULL) 

Image shows TempImport , Selected Result and Required Result

+0

Tempimport tablo yapısını değiştirir misiniz? Eğer evet ise, orada bir miktar alan ekleyin, onların kayıt sırasını belirleyiniz (SQL sunucusunda sıralı bir şey yoktur) - basit bir kimlik alanı bile olabilir. – Arvo

+0

no, tablo tempImport değiştiremiyorum. –

+0

Öyleyse neredeyse seçeneklerin dışındasınız. Sonraki konudan ilk çözümü (satır fiziksel konumunu kullanarak) kullanabilirsiniz: http://stackoverflow.com/questions/909155/equivalent-of-oracles-rowid-in-sql-server – Arvo

cevap

1

Etkili bir özel sıralama sipariş için soruyorsun . Bu konuda gitmenin birkaç yolu vardır, hiçbiri güzel IMHO değildir. 1. Orijinal tablonuzu değiştiremediğiniz için, sıralamak istediğiniz bir sütun ve sıralama düzeni sütunuyla bir ikincil tablo (normal veya geçici tablo) oluşturabilirsiniz. Bu, Arvo'nun önerdiği şeylere alternatif bir yaklaşımdır, ancak tempImport'u değiştirmediğinizde kısıtlama etrafında çalışır. Ancak, fazladan boşluk, bakım vb. Anlamına gelir.

  1. Özel sıralama düzeninizin değerleri arasında yinelenen bir RBAR sorgusu yazabilirsiniz, bu durumda Kod sütunu olur. tempImport tablosunda. Çok az sayıda satır ile iyi çalışır, tablonuz çok büyük olduğunda sorgunun kullanılamaz olduğu noktaya kadar ağrı artar. Esasen, sorgu Bunu daha sağlam hale getirmek için parametreleri kullanarak bu ince ayar yapabilirsiniz

SELECT a,b,c FROM ......<your stuff here>.... ...<more of your stuff>... ORDER BY CASE a WHEN 'G05198' THEN 1 WHEN 'K10739' THEN 2 WHEN 'B11737' THEN 3 ELSE a END

gibi bir şey olacaktır ama temel dayanak noktası değişmez: Eğer satır-by-ıstırap verici satır uğraşıyoruz Veri kümeniz büyüdükçe mükemmel ağrıları bekliyorsunuz. Belki de şemayı değiştirecek güçleri elde etmek için size biraz zaman ayırmanız yeterlidir, böylece bundan kurtulabilirsiniz.

+0

Bu sorguyu kullanamazsınız tempImport –

+1

içinde 1000'den fazla kayıt var Benim yazımda belirtildiği gibi, durum değerlendirmelerini parametrelendirmek için sorguyu ayarlayabilir, böylece örneklemde onları kodlamak yerine tempImport içinde sıralama sırasını takip etmek istediğiniz sütundan verileri çeker . Daha sonra zamanım varsa bu örneği yazacağım, ancak çevrimiçi olarak mevcut örnekleri bulabilmelisiniz. Ne olursa olsun, bu tür RBAR sorguları sürdürülebilir değildir. Perf, sonunda kullanılamaz duruma gelecektir ve yine de alternatif bir çözüme ihtiyacınız olacaktır. # 1'i keşfetmeyi, orijinal tabloyu veya tamamen başka bir şeyi değiştirmeyi öner. – SQLmojoe

+0

teşekkürler. Sorun çözüldü. :) –