Pertanyaan Bagaimana cara mendapatkan set baris unik dari SQL di mana keunikan didefinisikan oleh 2 kolom?


Jika saya memiliki tabel sebagai berikut:

ID | Nama | Kategori | Induk | URL | Terakhir diubah

Jika dua baris memiliki Nama dan orang tua yang sama, maka itu tidak unik. Bagaimana cara mendapatkan rangkaian baris unik dalam kasus ini (tetapi mengembalikan lebih dari kolom yang membuatnya unik)?

Jadi, untuk detail lebih lanjut: Ini adalah tabel kata kunci perusahaan, tempat kata kunci disusun menurut kategori. Setiap kata kunci hanya dapat memiliki satu kategori. Setiap kata kunci dapat memiliki kata kunci anak, jadi jika orang tua = 0 atau NULL, itu adalah kata kunci root. Jika kata kunci memiliki nama dan orang tua yang sama dalam suatu kategori, maka kata kunci tersebut tidak unik (terlepas dari kolom lainnya). Jika dua kata kunci memiliki nama dan kategori yang sama, dan induk = 0 atau NULL maka itu tidak unik. Jika ada duplikat, maka saya hanya menginginkan yang pertama. Alasannya adalah saya menempatkan ini ke dalam sistem yang tidak akan memungkinkan kata kunci untuk memiliki dua anak dengan nama yang sama.

Saya juga ingin melihat baris mana yang duplikat untuk melihat apa yang menyebabkan saya kesulitan!

Terima kasih satu juta sejauh ini untuk tanggapan yang sangat baik. Saya jelas bukan orang SQL ... :(


5
2018-02-08 23:32


asal


Jawaban:


Kueri ini menemukan semua baris di mana tidak ada baris lain yang memiliki nama dan orang tua yang sama. Jika dua baris induk disetel ke NULL, baris ini tidak dianggap memiliki induk yang sama.

SELECT T1.*
FROM Table1 T1
LEFT JOIN Table1 T2
ON T1.ID != T2.ID AND T1.Name = T2.Name AND T1.Parent = T2.Parent
WHERE T2.ID IS NULL

4
2018-02-08 23:45



Itu tergantung pada apa yang ingin Anda lakukan dengan baris yang tidak unik. Jika Anda tidak ingin mereka di hasil set Anda dapat menggunakan grup oleh dan memiliki:

select Name, Parent, Max(Category) 
from Table
group by Name, Parent
having count(*) = 1

Anda membutuhkan Max (Kategori) karena Anda tidak mengelompokkan berdasarkan kolom itu, meskipun hanya akan ada satu baris per Nama dan Orangtua.

Namun, jika Anda ingin menyertakan baris yang tidak unik dalam hasil, mirip dengan:

select distinct Name, Parent, Category from Table

kecuali bahwa dua baris dengan Nama dan Orangtua yang sama tetapi Kategori yang berbeda hanya mengembalikan satu baris. Dalam hal ini Anda perlu memutuskan apa yang akan ditampilkan untuk Kategori, karena lebih dari satu baris akan dikurangkan menjadi satu. Anda masih bisa menggunakan Max (Kategori) atau Min (Kategori) dan grup dengan, tetapi tidak memiliki.

select Name, Parent, Max(Category) 
from Table
group by Name, Parent

7
2018-02-08 23:39



Anda bisa menggunakan row_number berfungsi untuk mempartisi berdasarkan Name dan Parent, seperti:

select *
from (
    select
        row_number() over (partition by Name, Parent 
                           order by Name, Parent) as rn
    ,   *
    from YourTable
) sub
where rn = 1 -- Only first row for a name/parent combination

Jika Anda ingin memilih hanya baris yang unik, dalam arti tidak ada baris lain dengan nama dan orang tua yang sama, coba:

select *
from YourTable a
where (
    select count(*)
    from YourTable b
    where a.Name = b.Name
    and a.Parent = b.Parent
) = 1

2
2018-02-08 23:58



select x,y,z
from tablename t1
where not exists (select 1 from tablename t2 where t2.name = t1.name and t1.parent = t2.parent and t2.id <> t1.id)

dapat berjalan lambat tergantung pada ukuran tabel


1
2018-02-08 23:59