2012-09-02 10 views
29

Tengo una tabla con 3 columnas como esta:¿Cómo seleccionar registros sin duplicar en un solo campo en SQL?

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

hay muchos registros en esta tabla. Algunos de ellos tienen state y otros no. Ahora imagine estos registros:

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

Necesito tener nombres de países sin ningún duplicado. En realidad necesito su id y title, ¿Cuál es el mejor comando SQL para hacer esto? Usé DISTINCT en el siguiente formulario, pero no pude lograr un resultado apropiado.

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title 

Mi resultado deseado es algo como esto:

1, Canada 
4, China 
+1

Lo r ¿Qué resultado obtuvo de la consulta que intentó y cómo difiere de lo que desea? –

+0

obtengo un conjunto de resultados con muchos registros que contienen Canadá. –

+0

¿Qué es lo que quieres que pase? ¿Puedes mostrar cuál es tu conjunto de resultados deseado? Hazlo explícito. Con eso me refiero no solo describa lo que quiere con sus propias palabras. Actualice su pregunta mostrando los resultados * exactos * que obtiene y los resultados * exactos que desea, en formato de tabla, y de una manera clara y precisa. –

Respuesta

58

Prueba esto:

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

DISTINCT es la palabra clave
Para mí la consulta es correcta

sólo tratar de hacer esto primero

SELECT DISTINCT title,id FROM tbl_countries 

Más tarde puedes probar con orden de.

+4

Los resultados de la consulta solo eliminarán la columna 'Estado', y no es que el OP necesite;). –

+1

OP ya lo intentó, no es correcto ... – ChihHao

+0

Esto solo asegura que cada tupla resultante de la consulta sea única, no que cada valor en una columna sea único. – Jodo1992

10

Para poder utilizar DISTINCT palabra clave, puede utilizar de esta manera:

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 

Para poder utilizar ROW_NUMBER(), se puede utilizar de esta manera:

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 

también con el uso de LEFT JOIN, puede utilizar esto:

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 

Y con el uso de EXISTS, puede intentar:

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

En MySQL una función GROUP_CONCAT columna especial puede haber usado:

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; 

Cabe mencionar que el esquema de información en MySQL cubre todo el servidor de la base de datos, no ciertas bases de datos. Es por eso que si diferentes bases de datos contienen tablas con nombres idénticos, la condición de búsqueda de la cláusula WHERE debe especificar el nombre del esquema: TABLE_SCHEMA = 'computadoras'.

Las cadenas se concatenan con la función CONCAT en MySQL.La solución final de nuestro problema se puede expresar en MySQL como

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 Cláusula es la forma más fácil de encontrar entrada duplicada en Oracle y utilizando rowid podemos eliminar datos duplicados ..

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

Prueba este

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; 
Cuestiones relacionadas