2015-06-18 24 views
7

SQL ile deneyimlenmiyor, bu konuda bana yardımcı olabileceğini umuyordum.SQL SELECT Sorgu İLE INSERT INTIRING

Boş bir geçici tablonun yanı sıra içinde bilgi içeren bir tablo var.

şöyle bu haliyle benim sorgunun Benim özet aşağıda verilmiştir: Kimlik Other_table bir kimliğe karşılık gelen yerlerde, o olmalı yüzden sorguya kimlikleri bir sürü geçiyorum

CREATE TABLE [#Temp] (ID Int, Field1 Varchar) 

INSERT INTO [#Temp] 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 

ve Temp tablosunu bu bilgilerle doldurun.

Aynı sorgu içinde başka bir yerde eşleşmeyen kimlikler (başka bir temp tablosu) kaydedilebilir mi? Ya da aynı geçici masaya, sadece bu durumda Field1 = NULL ile?

Eşleşmeyen kimlikler üzerinde fazladan çalışma yapmam gerekiyor, bu yüzden onlara bir yerden erişime ihtiyacım var. En hızlı yol buysa, bunu tek bir sorguda yapmayı umuyordum.

Düzenleme: tüm yardım için

teşekkürler.

Özür dilerim, şimdi sorumun tamamen açık olmadığını görüyorum.

Other_table 1 - 1000 kimlikleri içeriyorsa ve 999, 1000 ve 1001 kimliklerini geçirirseniz, temp tablosunun 999 ve 1000 bilgilerini içermesini istiyorum ve sonra da Field1 = NULL ile = 1001 kimliğine sahip bir giriş istiyorum . Kimlik istemiyorum 1 - 998 Field1 = NULL ile döndü.

+0

SEÇ kimliği, alan1 dahil etmektir? –

+0

Tamam, belki bir şeyleri özlüyorum, ama bu benim mevcut sorgunun tam tersini yapacak; Her ikisini de aynı sorguda yapmak isterim? Ya da her iki sonuca ulaşmanın en hızlı yolu. – Alex

cevap

4

Yalnızca her insert ifadesi için bir hedef tabloyu kullanabilirsiniz deneyin. Dolayısıyla, boş olarak field1 tutarak gitmek kolay bir yolu gibi görünüyor:

INSERT INTO [#Temp] 
SELECT ID, CASE WHEN ID IN (ID1, ID2, ID3...) THEN Field1 END 
FROM [Other_table] 

vaka bildirimi kimliği listede yok null id dönecektir.

create table #tempIDs (id int) 
insert into #tempIDs values(id1), (id2), (id3), .... 

: İlk olarak, başka bir geçici tabloya in operatörü kullandığımız kimliklerinin listesini ekleyin:

Güncelleme soruyu güncelledikten sonra
, bu tavsiye ederim budur Daha sonra sadece basit bir sol kullanmak katılmak:

INSERT INTO [#Temp] 
SELECT t1.ID, Field1 
FROM #tempIDs t1 
LEFT JOIN [Other_table] t2 ON(t1.id = t2.id) 
+0

Teşekkürler @Zohar Peled. Bu çok yardımcı oldu, sonuçların başka bir şekilde yuvarlak olmasını istemek dışında, sorumu açık değildi. Değiştirdim. – Alex

+0

Teşekkürler @Zohar Peled. – Alex

3

Sen diğer sorgu oluşturmak zorunda DEĞİL İÇİNDE Kimliği en

SELECT ID, Field1 
into #temp1 
FROM [Other_table] WHERE ID NOT IN (ID1, ID2, ID3...) 

diğeri

SELECT ID, Field1 
into #temp2 
FROM [Other_table] WHERE ID IN (ID1, ID2, ID3...) 

ben değildi kimlikleri ekstra çalışma yapmak gerekir ne demektir eşleşti? Daha fazla ayrıntı ekleyebilir miyiz, belki bir sorguda ayrı bir

Güncelleme bu (ID1, ID2, ID3 ...) gelen

? Birleşim kullanabilir miyiz? Cevabınız Evetolup olmadığını ne istiyorsun olsun wil daha

bu bir

SELECT * Into #temp 
FROM(
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 
    Union 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID NOT IN (ID1, ID2, ID3...) 
) 

veya bu

SELECT ID, Field1 into #temp 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 
    Union 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID NOT IN (ID1, ID2, ID3...) 
+0

Teşekkürler, yani iki sorgu yapmalıyım, düşündüğüm ama emin olmak istedim. 'Diğer çalışma', bu bilgiyi elde etmek için başka bir sunucuyu sorgulamak anlamına gelir, buradaki sorumumla ilgili olarak anlayamadığım kadarıyla. Temp tablosunun bulunan bilgilere sahip olmasını ve kimliklerin kolayca bulunamamasını istiyorum. – Alex

+0

@Alex i cevabımı güncelledim, bu durumda _Union_'ı kullanabilir ve sonuç deposu aynı # temp-tablo –

+0

'case' en az sql server 2000'den beri t-sql'nin bir parçasıdır. OP bir şekilde çalışmıyorsa Daha eski bir versiyon, daha sonra önerdiğiniz çözümler en iyi şekilde komplikasyonların üzerindedir. –

3

varolan çözüm hızlı düzeltme o gelen tüm değerleri elde etmektir Temp masanızda mevcut olmayan masa. Tüm Id'leri için Field1'i NULL olarak işaretledim.

CREATE TABLE [#Temp] (ID Int, Field1 Varchar) 

INSERT INTO [#Temp] 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 

INSERT INTO [#Temp] 
SELECT ID, NULL AS Field1 
FROM [Other_Table] 
WHERE ID NOT IN (SELECT DISTINCT ID FROM #Temp) 

Diğer bir yol NEREDE kimlik DEĞİL İÇİNDE (ID1, ID2, ID3 ...) aynı INSERT deyiminde [Other_table] GELEN

CREATE TABLE [#Temp] (ID Int, Field1 Varchar(100)) 

INSERT INTO [#Temp] 
    SELECT ID, 
     CASE WHEN ID IN (ID1,ID2....) THEN Field1 
      ELSE NULL END AS 'Field1' 
    FROM [Other_Table]