web-dev-qa-db-fra.com

Comment sélectionner des enregistrements sans dupliquer sur un seul champ SQL?

J'ai un tableau avec 3 colonnes comme ceci: 

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

Il y a beaucoup d'enregistrements dans ce tableau. Certains d'entre eux ont state et d'autres pas. Maintenant, imaginez ces disques: 

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

J'ai besoin de noms de pays sans doublons. En fait, j'ai besoin de leurs id et title, quelle est la meilleure commande SQL pour créer cela J'ai utilisé DISTINCT dans le formulaire ci-dessous mais je ne pouvais pas obtenir un résultat approprié. 

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title

Le résultat souhaité est quelque chose comme ceci: 

1, Canada  
4, China
39
Mohammad Saberi

Essaye ça:

SELECT MIN(id) AS id, title
FROM tbl_countries
GROUP BY title
75
Mark Byers

DISTINCT est le mot clé
Pour moi votre requête est correcte

Essaye juste de faire ça d'abord

SELECT DISTINCT title,id FROM tbl_countries

Plus tard, vous pouvez essayer avec l'ordre de.

27
Immu

Pour utiliser le mot clé DISTINCT, vous pouvez l'utiliser comme suit:

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

Pour utiliser ROW_NUMBER(), vous pouvez l’utiliser comme ceci:

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

Également avec LEFT JOIN, vous pouvez utiliser ceci:

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

Et avec l’utilisation de EXISTS, vous pouvez essayer:

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)
9
shA.t
select Country_id,country_title from(
   select Country_id,country_title,row_number() over (partition by country_title 
   order by Country_id  ) rn from country)a
   where rn=1;
0
Ashah

Ignorer les lignes en double dans SQL. Je pense que cela peut vous aider.

    SELECT res2.*
    FROM
    (SELECT res1.*,ROW_NUMBER() OVER(PARTITION BY res1.title ORDER BY res1.id)as num
     FROM 
    (select * from [dbo].[tbl_countries])as res1
    )as res2
    WHERE res2.num=1
0
Selim Reza

Dans MySQL, une fonction de colonne spéciale GROUP_CONCAT peut être utilisée:

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;

Il convient de mentionner que le schéma d’information de MySQL couvre l’ensemble des serveurs de bases de données, mais pas certaines bases de données. C'est pourquoi, si différentes bases de données contiennent des tables avec des noms identiques, la condition de recherche de la clause WHERE doit spécifier le nom du schéma: TABLE_SCHEMA = 'ordinateurs'.

Les chaînes sont concaténées avec la fonction CONCAT dans MySQL. La solution finale de notre problème peut être exprimée dans MySQL comme

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
user6678173

La clause Having est le moyen le plus simple de rechercher une entrée dupliquée dans Oracle. En utilisant rowid, nous pouvons supprimer les données dupliquées.

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
SUERSH K

Essaye celui-là

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;
0
M. Salem