Bir SQL Server "birleştirme" sürekli olarak herhangi bir sıra sırasını korur mu (yani, sol tablodaki veya sağdaki tablo)?İç tablo başka bir masala birleştirildiğinde geçici tablo satırlarının sırasını nasıl koruruz?
Psuedocode:
create table #p (personid bigint);
foreach (id in personid_list)
insert into #p (personid) values (id)
select id from users inner join #p on users.personid = #p.id
varsayalım ben kişi girişine karşılık gelir kimlikleri listesi var. Bu kimliklerin her biri sıfır veya daha fazla kullanıcı hesabına karşılık gelebilir (her bir kişi birden fazla hesaba sahip olabileceğinden).
Kullanıcı tablosundan sütunları hızlı bir şekilde seçmek için, geçici bir tabloyu kullanıcı kimlikleriyle doldurur, ardından iç kısım kullanıcı tablosuyla birleştirir.
Birleştirmedeki sonuçların sırasının, temp tablosuna eklendikçe ids sırasına uygun olduğundan emin olmak için etkili bir yol arıyorum, böylece döndürülen kullanıcı listesi aynı sıradadır girildiği gibi kişi listesi olarak. "İç kullanıcıları katılmak #p" kullanılarak
- sol tablonun sipariş kimliği boş değil kullanıcılara nerede katılmak sol #p" kullanılarak
- korunur durumda:
aşağıdaki alternatifleri kabul ettik ", bir sol birleştirmenin düzeni koruduğu ve iç birleştirmenin" oluşturma tablosu (rownum int, personid bigint) "kullanılarak
- olmadığı durumlarda, temp tablosu doldurulduğunda artan bir satır numarası eklenmesi, sonuçların sipariş edilmesi tarafından bir "SQL Server eşdeğeri" kullanılarak
- birleştirmesinde DB2
Şu anda seçeneği 3 kullanıyorum ve o inşaat ... ama zaten sipariş etti şey maddesi tarafından sipariş kullanma fikrini nefret mevcuttur "maddesi [tabloadı] emriyle sırası. Geçici tablo satırları sokulmuş sırayı koruyan ya da nasıl katılmak çalışır ve hangi sırayla sonuçları çıkıp mı diye bilmiyorum
DÜZENLEME:.
Ben seçeneğiyle 3 ile gitmek varsayarsak, Sipariş vermek için bir alan var ... SQL Server'ın siparişi korumada en az miktarda işi yapmasına yardımcı olacak birleştirme formu var mı? Demek istediğim, örneğin, tablodaki alanların cetvelle hangi sırada olduğuna bakmak ve bu tabloyu birleştirirken ilk önce bu tablodan çıkar, böylece sonuç kümesinin sırası kabaca ya da tamamen o tablonun siparişiyle çakışır. zaten istenilen sırada olması durumunda?
Binlerce kimlik var. Bu işlem (arama sonuçları dahil), bu yüzden bahsettiğiniz formun bir seçim dizesini birleştiremiyorum. Ayrıca, erken optimizasyon diye bir şey yoktur. Ya kodları daha hızlı çalıştırıyorsun ya da yapmıyorsun, ya da bunu geliştirmek için çok tembelsin ya da bunu yapacak kadar akıllısın. Geçici tabloyu, önbelleğe alınabilen ve yeniden kullanılabilen yeniden kullanılabilir parametreli bir ekleme ifadesiyle doldurmakla iyiyim. – Triynko
Diğer bir şey ise ... ID'lerin eklendiğinde (kişinin ad bileşenlerine göre sıralanması) AN SİPARİŞİ vardır, ancak böyle bir emrin sayısal kimlikleriyle hiçbir ilgisi yoktur ve bu nedenle SQL Server için açık bir sırada değildir. bu yüzden "fazladan fazla çalışma" ile sipariş veremezler (tekrar insan masalarına katılmalı ve isim bileşenlerine yeniden sıralamak zorunda kalacaklar). Hala üçüncü bir seçeneğimi bir rownum sütunu kullanarak düşünüyorum ve sipariş vermek, görünüşte keyfi bir düzeni (en azından SQL Server'ın bakış açısıyla) korumanın en iyi yoludur. – Triynko
Başka bir şey ... bir büyük sorgu dizesi yerine temp tablosunu doldurmak için bir döngü kullanma kararı, performanstan daha fazla doğruluk derecesidir (basit önbelleğe alınmış sorgu en iyi performansı gösterse ve ekleri birer birer yürütürse bile), çünkü Tek bir dize, yeterince büyük bir kümede, komut metni veya toplu iş için bazı sınırlara erişilebileceği (örneğin, 65536 * paket boyutu (4096 byte)?) bir risk vardır; silmeden önce temp tablosunda deyim ekleyin. – Triynko