2009-08-03 12 views
41

MS Access, yinelenen satırları bulmak için sql kodu oluşturmak için bir düğmeye sahiptir. SQL Server 2005/2008 Yönetim Stüdyosu buna sahip olup olmadığını bilmiyorum.T-SQL kodunun çiftleri bulması nasıl sağlanır?

  1. Değiştirmişse, lütfen gelin nerede

  2. Çekilmemişse, böyle bir kod oluşturmak için bir T-SQL yardımcınız var nasıl söyle lütfen.

cevap

107

Eh, tablodaki kopya olarak tüm satırları varsa, aksi en azından birincil anahtar değeri farklı olurdu, en azından o tablo için kurulmuş bir birincil anahtar var ettik.

Ancak, burada sütun kümesi üzerinde kopyası almak için bir SQL nasıl oluşturulacağı açıklanmıştır: Bu sütunlar col1-Süt4 için hangi satırları bulacaksınız

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

, değerlerin aynı kombinasyonu, birden fazla kez sahiptir . Mesela

, aşağıdaki tabloda, satır 2 + 3 olacaktır çiftleri:

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

iki sıra sütun col1-Süt4 ortak değerler paylaşan ve böylece, bu SQL tarafından çiftleri olarak kabul edilir. Bunu analiz etmek istediğiniz tüm sütunları içerecek şekilde sütunların listesini genişletin.

+0

Kodun beklediğim kadar zor değildir, çünkü bir nokta var . Diğer SQL dillerinde elle kodlamak zor olabilir –

+3

Olmamalıdır, bu standart SQL, T-SQL'e özgü bir şey değil. MySQL, SQLite, Oracle, Sybase, DB2, vb. Için aynı olmalıdır. –

+0

Haklısınız. Sözdizimi vurgulama ve gürültülü kod eksikliği bana MS Access'in oluşturduğu kodun anlaşılması zor ve daha önce denemedim. –

2

AFAIK, öyle değil. Yalnızca bir tablonun tüm alanlarına göre gruplandırma ve sayımın 1'den büyük olduğu bir ekleme cümlesi kullanarak filtreleme yapın.

Satırlarınız anahtarın dışında yineleniyorsa, anahtarı seçim alanları. Eğer SQL Server 2005+ kullanıyorsanız

51

, diğer sütunlarla birlikte tüm satırları görmek için aşağıdaki kodu kullanabilirsiniz:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 
Youd da silmek (veya başka şekilde çalışmak) olabilir

bu kullanarak çoğaltan teknik:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER son derece güçlüdür - Bu sol bulundu http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1. Ayrıca, snippet'iniz de PK'yi içerir. /necro – theTuxRacer

+0

bu, top1 – SQueek

+0

için oylanmalıdır. Bir diğer fayda, gördüğüm yaklaşımlarla gruptan daha hızlı çalıştığı görünmesidir. –

5

de üzerinde BOL makalesine bakın - onunla yapabileceğiniz çok şey var Katkı bir ya da daha fazla yinelenen alanları ile tüm satırları dökümü gerekir ama tablosundaki her alan adını yazın istemiyorum zaman:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col