如何在 SQL 中只选择一个字段而不重复选择记录?

我有一张桌子,上面有三列,像这样:

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

这个表中有许多记录,有些有 state,有些没有。现在,想象一下这些记录:

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

我需要有没有任何重复的国家名称。其实我需要他们的 idtitle,什么是最好的 SQL 命令,使这?我在下面的表格中使用了 DISTINCT,但是我没有得到一个合适的结果。

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title

我期望的结果是这样的:

1, Canada
4, China
551029 次浏览

DISTINCT是关键词
对我来说,你的问题是正确的

先试试这个

SELECT DISTINCT title,id FROM tbl_countries

稍后您可以尝试订购。

试试这个:

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

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

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

对于使用 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

使用 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

使用 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)

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

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 中的信息模式涵盖了所有数据库服务器,而不是某些数据库。这就是为什么如果不同的数据库包含具有相同 WHERE子句 names, search条件的表时,应该指定模式名: TABLE_SCHEMA='computers'

字符串与 MySQL 中的 CONCAT函数连接在一起。我们问题的最终解决方案可以在 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

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);

试试这个

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;

忽略 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
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;