2012-09-02 12 views
29

Mam tabeli z 3 kolumny tak:Jak wybierać rekordy bez duplikatów tylko w jednym polu w SQL?

+------------+---------------+-------+ 
| Country_id | country_title | State | 
+------------+---------------+-------+  

Istnieje wiele rekordów w tej tabeli. Niektóre z nich mają state, a niektóre nie. Teraz wyobraź sobie te zapisy:

1 | Canada | Alberta 
2 | Canada | British Columbia 
3 | Canada | Manitoba 
4 | China | 

Muszę mieć nazwy krajów bez żadnych duplikatów. Właściwie potrzebuję ich id i title, Jakie jest najlepsze polecenie SQL, aby to zrobić? Użyłem DISTINCT w poniższym formularzu, ale nie mogłem uzyskać odpowiedniego wyniku.

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title 

Moja pożądany wynik jest mniej więcej tak:

1, Canada 
4, China 
+1

Co r esult otrzymałeś od zapytania, które wypróbowałeś i jak się od niego różni? –

+0

Otrzymuję zestaw wyników z wieloma rekordami zawierającymi Kanadę. –

+0

Co chcesz zamiast tego zrobić? Czy możesz pokazać, jaki jest pożądany zestaw wyników? Uczyń to wyraźnie. Rozumiem przez to, że nie opisujesz tego, czego chcesz, własnymi słowami. Zaktualizuj swoje pytanie, wyświetlając * dokładne * wyniki i * dokładne * wyniki, które chcesz, w formie tabelarycznej oraz w jasny i precyzyjny sposób. –

Odpowiedz

58

Spróbuj tego:

SELECT MIN(id) AS id, title 
FROM tbl_countries 
GROUP BY title 
23

DISTINCT jest kluczowe
Dla mnie zapytanie jest poprawne

Wystarczy spróbować zrobić ten pierwszy

SELECT DISTINCT title,id FROM tbl_countries 

Później możesz spróbować według kolejności według.

+4

Wyniki kwerendy po prostu usunie kolumnę 'State', I nie jest tak, że PO potrzebuje;). –

+1

OP już wypróbował to, to nie w porządku ... – ChihHao

+0

To tylko upewnia się, że każda wynikowa krotka z zapytania jest unikalna, a nie każda wartość w kolumnie jest unikalna. – Jodo1992

10

Do korzystania DISTINCT słowa kluczowego, można go używać tak:

SELECT DISTINCT 
    (SELECT min(ti.Country_id) 
    FROM tbl_countries ti 
    WHERE t.country_title = ti.country_title) As Country_id 
    , country_title 
FROM 
    tbl_countries t 

Do korzystania ROW_NUMBER(), można go używać tak:

SELECT 
    Country_id, country_title 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY country_title ORDER BY Country_id) As rn 
    FROM tbl_countries) t 
WHERE rn = 1 

także z użyciem LEFT JOIN, można użyć tego:

SELECT t1.Country_id, t1.country_title 
FROM tbl_countries t1 
    LEFT OUTER JOIN 
    tbl_countries t2 ON t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id 
WHERE 
    t2.country_title IS NULL 

I z korzystaniem z EXISTS, można spróbować:

SELECT t1.Country_id, t1.country_title 
FROM tbl_countries t1 
WHERE 
    NOT EXISTS (SELECT * 
       FROM tbl_countries t2 
       WHERE t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id) 
0

W MySQL specjalną kolumnę funkcja GROUP_CONCAT może być używany:

SELECT GROUP_CONCAT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'computers' AND 
    TABLE_NAME='Laptop' AND 
    COLUMN_NAME NOT IN ('code') 
ORDER BY ORDINAL_POSITION; 

Należy wspomnieć, że schemat informacji w MySQL obejmuje cały serwer bazy danych, a nie pewne bazy danych. Dlatego jeśli różne bazy danych zawierają tabele o identycznych nazwach, warunek wyszukiwania klauzuli WHERE powinien określać nazwę schematu: TABLE_SCHEMA = "komputery".

Struny są łączone z funkcją CONCAT w MySQL.Ostateczne rozwiązanie naszego problemu może być wyrażona w MySQL jako

SELECT CONCAT('SELECT ', 
(SELECT GROUP_CONCAT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA='computers' AND 
    TABLE_NAME='Laptop' AND 
     COLUMN_NAME NOT IN ('code') 
ORDER BY ORDINAL_POSITION 
), ' FROM Laptop'); 

http://www.sql-ex.ru/help/select20.php

0

Having klauzula jest najprostszym sposobem, aby znaleźć duplikat wpisu Oracle i korzystania rowid możemy usunąć zduplikowane dane ..

DELETE FROM products WHERE rowid IN (
    SELECT MAX(sl) FROM (
    SELECT itemcode, (rowid) sl FROM products WHERE itemcode IN (
    SELECT itemcode FROM products GROUP BY itemcode HAVING COUNT(itemcode)>1 
)) GROUP BY itemcode); 
0

Spróbuj jeden

SELECT country_id, country_title 
FROM (SELECT country_id, country_title, 
CASE 
WHEN country_title=LAG(country_title, 1, 0) OVER(ORDER BY country_title) THEN 1 
ELSE 0 
END AS "Duplicates" 
FROM tbl_countries) 
WHERE "Duplicates"=0;