Как выбрать записи без дубликатов только на одном поле в SQL?
у меня есть таблица с 3 столбцами вроде этого:
+------------+---------------+-------+
| Country_id | country_title | State |
+------------+---------------+-------+
в этой таблице много записей. Некоторые из них state
а некоторые другие нет. Теперь представьте себе эти записи:
1 | Canada | Alberta
2 | Canada | British Columbia
3 | Canada | Manitoba
4 | China |
мне нужно иметь названия стран без каких-либо дубликатов. На самом деле мне нужны их id
и title
, какая лучшая команда SQL для этого? Я использовал DISTINCT
в форме ниже, но я не мог добиться приемлемого результата.
SELECT DISTINCT title,id FROM tbl_countries ORDER BY title
мой желаемый результат что-то вроде этого:--9-->
1, Canada
4, China
7 ответов
DISTINCT
ключевое слово
Для меня ваш запрос правильный
просто попробуйте сделать это сначала
SELECT DISTINCT title,id FROM tbl_countries
позже вы можете попробовать с order by.
использовать 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 *
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 должно указывать имя схемы: TABLE_SCHEMA= 'computers'.
строки объединены с функцией 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');
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