2012-09-02 33 views
29

Tôi có một bảng với 3 cột như thế này:Làm thế nào để chọn bản ghi mà không trùng lặp trên chỉ một trường trong SQL?

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

Có rất nhiều bản ghi trong bảng này. Một số người trong số họ có state và một số khác thì không. Bây giờ, hãy tưởng tượng những hồ sơ này:

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

Tôi cần có tên quốc gia không trùng lặp. Thực ra tôi cần idtitle, lệnh SQL tốt nhất để thực hiện điều này là gì? Tôi đã sử dụng DISTINCT trong biểu mẫu bên dưới nhưng tôi không thể đạt được kết quả phù hợp.

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title 

kết quả tôi mong muốn là một cái gì đó như thế này:

1, Canada 
4, China 
+1

Điều gì r esult bạn đã nhận được từ truy vấn bạn đã thử và nó khác với những gì bạn muốn? –

+0

Tôi nhận được kết quả với nhiều hồ sơ chứa Canada. –

+0

Bạn muốn thay thế điều gì? Bạn có thể cho biết tập hợp kết quả mong muốn của bạn là gì không. Làm cho nó rõ ràng. Bằng cách đó tôi có nghĩa là không chỉ mô tả những gì bạn muốn trong lời nói của riêng bạn. Cập nhật câu hỏi của bạn hiển thị kết quả * chính xác * bạn nhận được và kết quả * chính xác * mà bạn muốn, ở định dạng bảng và theo cách rõ ràng và chính xác. –

Trả lời

58

Hãy thử điều này:

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

DISTINCT là từ khóa
Đối với tôi truy vấn của bạn là đúng

Chỉ cần cố gắng để làm điều này đầu tiên

SELECT DISTINCT title,id FROM tbl_countries 

Sau đó bạn có thể thử theo thứ tự.

+4

Kết quả truy vấn sẽ chỉ loại bỏ cột 'State', và nó không phải là nhu cầu OP;). –

+1

OP đã thử điều này, không đúng ... – ChihHao

+0

Điều này chỉ đảm bảo rằng mỗi bộ kết quả từ truy vấn là duy nhất, không phải mỗi giá trị trong một cột là duy nhất. – Jodo1992

10

Để sử dụng DISTINCT từ khóa, bạn có thể sử dụng nó như thế này:

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 

Để sử dụng ROW_NUMBER(), bạn có thể sử dụng nó như thế này:

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 

Ngoài ra với việc sử dụng LEFT JOIN, bạn có thể sử dụng này:

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 

Và với việc sử dụng của EXISTS, bạn có thể thử:

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

Trong MySQL một hàm cột GROUP_CONCAT đặc biệt có thể sử dụng:

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; 

Cần lưu ý rằng lược đồ thông tin trong MySQL bao gồm tất cả các máy chủ cơ sở dữ liệu, không phải một số cơ sở dữ liệu nhất định. Đó là lý do tại sao nếu các cơ sở dữ liệu khác nhau chứa các bảng có cùng tên, thì điều kiện tìm kiếm của mệnh đề WHERE sẽ chỉ rõ tên lược đồ: TABLE_SCHEMA = 'computers'.

Chuỗi được nối với hàm CONCAT trong MySQL.Giải pháp cuối cùng của vấn đề chúng tôi có thể được thể hiện trong MySQL như

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 khoản là cách dễ nhất để tìm mục trùng lặp trong Oracle và sử dụng rowid chúng ta có thể loại bỏ dữ liệu trùng lặp ..

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

Hãy thử cái này

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; 
Các vấn đề liên quan