75

我有一个包含 3 列的表格,如下所示:

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

这张表中有很多记录。其中一些有state,而另一些则没有。现在,想象一下这些记录:

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

我需要有没有任何重复的国名。实际上我需要他们的idand title,最好的 SQL 命令是什么?我DISTINCT在下面的表格中使用,但我无法获得适当的结果。

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title

我想要的结果是这样的:

1, Canada  
4, China
4

9 回答 9

112

试试这个:

SELECT MIN(id) AS id, title
FROM tbl_countries
GROUP BY title
于 2012-09-02T19:58:10.077 回答
47

DISTINCT是关键字
对我来说你的查询是正确的

试着先做这个

SELECT DISTINCT title,id FROM tbl_countries

稍后您可以尝试使用 order by。

于 2012-09-02T19:47:59.367 回答
18

对于 usingDISTINCT关键字,您可以像这样使用它:

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

对于 using ROW_NUMBER(),您可以像这样使用它:

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

同样使用 using LEFT JOIN,您可以使用它:

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

并使用 of EXISTS,您可以尝试:

SELECT t1.Country_id, t1.country_title
FROM tbl_countries t1   
WHERE
    NOT EXISTS (SELECT 1 
                FROM tbl_countries t2 
                WHERE t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id)
于 2015-04-28T07:22:32.087 回答
2

试试这个

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;
于 2017-08-26T13:28:27.957 回答
1

GROUP_CONCAT在 MySQL 中,可以使用特殊的列函数:

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;

需要指出的是,MySQL 中的信息模式涵盖了所有数据库服务器,而不是某些数据库。这就是为什么如果不同的数据库包含具有相同子句names, search条件的表应该指定模式名称: .WHERETABLE_SCHEMA='computers'

字符串与CONCATMySQL 中的函数连接。我们问题的最终解决方案在 MySQL 中可以表示为:

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

于 2017-02-26T02:06:44.833 回答
1
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;
于 2019-02-18T17:13:59.227 回答
0

忽略 SQL 中的重复行。我想这可能会对你有所帮助。

    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
于 2018-06-06T06:22:36.017 回答
0

可以通过以下方式删除复杂查询的重复行,

首先将结果存储到 #TempTable 或 @TempTableVariable

从 #TempTable 或 @TempTableVariable 删除您的条件

然后选择其余数据。

如果需要创建行号创建标识列。

于 2019-09-07T04:53:11.293 回答
-1

Having子句是在 Oracle 中查找重复条目的最简单方法,使用rowid我们可以删除重复数据。

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);
于 2017-08-04T11:19:58.523 回答