Katakanlah saya memiliki pertanyaan berikut.
SELECT ID, Email, ProductName, ProductModel FROM Products
Bagaimana saya bisa memodifikasinya sehingga tidak menghasilkan Email duplikat?
Dengan kata lain, ketika beberapa baris berisi email yang sama, saya ingin hasilnya hanya menyertakan satu dari baris tersebut (lebih disukai yang terakhir). Duplikat di kolom lain harus diizinkan.
Klausa suka DISTINCT
dan GROUP BY
tampaknya bekerja pada seluruh baris. Jadi saya tidak yakin bagaimana cara mendekati ini.
sql
sql-server
Jonathan Wood
sumber
sumber
Jawaban:
Jika Anda menggunakan SQL Server 2005 atau lebih baru gunakan ini:
EDIT: Contoh menggunakan klausa where:
sumber
SELECT
membutuhkan suatuWHERE
kondisi. Saya pikir nomor baris akan diberikan ke semua baris dalam tabel. Sintaks ini hanya sedikit di luar saya. Adakah peluang pembaruan yang akan menjamin satu baris dengan email tertentu yang memenuhiWHERE
persyaratan?JOIN
dalam permintaan saya. Segera setelah saya memilikiJOIN
, nilai yangROW_NUMBER
dikembalikan jauh lebih tinggi daripada "1".Ini mengasumsikan SQL Server 2005+ dan definisi Anda "terakhir" adalah maks PK untuk email yang diberikan
sumber
Ketika Anda menggunakan
DISTINCT
menganggapnya sebagai baris yang berbeda, bukan kolom. Ini akan mengembalikan hanya baris di mana kolom tidak sama persis sama.Kueri akan mengembalikan kedua baris karena
ID
kolomnya berbeda. Saya berasumsi bahwaID
kolom adalahIDENTITY
kolom yang bertambah, jika Anda ingin mengembalikan yang terakhir maka saya merekomendasikan sesuatu seperti ini:The
TOP 1
akan kembali hanya catatan pertama, dengan memesan itu denganID
turun itu akan mengembalikan hasil dengan baris terakhir pertama. Ini akan memberi Anda catatan terakhir.sumber
Anda dapat mengatasinya dengan menggunakan fungsi GROUP BY
sumber
SELECT id, max(email) AS email FROM tbl GROUP by email
. Dalam SQL Server SEMUA kolom dalamSELECT
klausa harus dalam fungsi agregat. Ini menggigit saya setiap kali saya kembali.Untuk Access, Anda dapat menggunakan kueri Select SQL yang saya sajikan di sini:
Misalnya Anda memiliki tabel ini:
CLIENTE || NOMBRES || SURAT
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
Dan Anda hanya perlu memilih email yang berbeda. Anda dapat melakukannya dengan ini:
SQL SELECT:
Anda dapat menggunakan ini untuk memilih ID maksimum, nama koresponden ke ID maksimum itu, Anda dapat menambahkan atribut lain dengan cara itu. Kemudian pada akhirnya Anda meletakkan kolom berbeda untuk difilter dan Anda hanya mengelompokkannya dengan kolom berbeda terakhir.
Ini akan memberi Anda ID maksimum dengan data koresponden, Anda dapat menggunakan min atau fungsi lainnya dan Anda mereplikasi fungsi itu ke sub-kueri.
Pilih ini akan kembali:
CLIENTE || NOMBRES || SURAT
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Ingatlah untuk mengindeks kolom yang Anda pilih dan kolom yang berbeda harus tidak memiliki data numerik semuanya dalam huruf besar atau huruf kecil, atau tidak akan berfungsi. Ini akan bekerja dengan hanya satu surat terdaftar juga. Selamat coding !!!
sumber
Alasan
DISTINCT
danGROUP BY
bekerja pada seluruh baris adalah permintaan Anda mengembalikan seluruh baris.Untuk membantu Anda memahami: Cobalah untuk menulis dengan tangan apa yang harus dikembalikan oleh kueri dan Anda akan melihat bahwa tidak jelas apa yang harus dimasukkan ke dalam kolom yang tidak terduplikasi.
Jika Anda benar-benar tidak peduli dengan apa yang ada di kolom lain, jangan kembalikan. Mengembalikan baris acak untuk setiap alamat email sepertinya sedikit tidak berguna bagi saya.
sumber
Coba ini
sumber
Coba ini:
sumber