Yanıtlar:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
S : Burada neler oluyor?
C : Kavramsal olarak, tüm satırları seçiyoruz table1
ve her satır table2
için name
sütun için aynı değere sahip bir satır bulmaya çalışıyoruz . Böyle bir satır yoksa, table2
sonucumuzun kısmını o satır için boş bırakırız . Ardından, sonuçta yalnızca eşleşen satırın bulunmadığı satırları seçerek seçimimizi kısıtlarız. Son olarak, name
sütun ( sonuçta olduğundan emin olduğumuz alan hariç) sonucumuzdaki tüm alanları yok sayıyoruz table1
.
Her durumda mümkün olan en performanslı yöntem olmasa da, ANSI 92 SQL'i uygulamaya çalışan her veritabanı motorunda çalışmalıdır.
Ya yapabilirsin
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
veya
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Bunu başarmak için 3 teknik için bu soruya bakın
2. cevabı oylayacak yeterli temsil puanım yok. Ama en üstteki cevaba yapılan yorumlara katılmıyorum. İkinci cevap:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Uygulamada FAR daha verimlidir. Nedenini bilmiyorum, ama 800k + kayıtlara karşı çalıştırıyorum ve fark yukarıda yayınlanan 2. cevaba verilen avantaj ile çok büyük. Sadece benim 0.02 $
Bu, minus
operasyonla elde edebileceğiniz saf set teorisidir .
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Tuzaklara dikkat edin. Alan Eğer Name
içinde Table1
Boşlara ihtiva Sürprizlerle demektir. Daha iyisi:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
İşte benim için en iyi olan şey.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Bu, denediğim diğer yöntemlerden iki kat daha hızlıydı.
EXCEPT
Mssql veya MINUS
oracle içinde kullanabilirsiniz , bunlar aşağıdakilere göre aynıdır:
Bu benim için keskin çalışıyor
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
(Ben henüz yorum yapmak için yeterince serin değilim) repost gidiyorum doğru durumda .... başka kimse daha iyi açıklanması gerektiğini düşündüm durumunda.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
Ve mySQL tablo adları arasında virgül gerektiren FROM sözdizimi gördüm ama sqlLite alan tercih gibi görünüyordu.
Sonuçta, değişken değişken isimlerini kullandığınızda soru bırakıyor. Değişkenlerim daha anlamlı olmalı. Ve birisi neden virgül kullanmamız gerektiğini veya virgül kullanmamamızı açıklamalıdır.
Belirli bir kullanıcıyı seçmek istiyorsanız
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
tent_npk
Bir kullanıcının bir birincil anahtar