Подтвердить что ты не робот

Как выбрать записи без дубликатов только на одном поле в SQL?

У меня есть таблица с тремя столбцами:

+------------+---------------+-------+  
| 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

Мой желаемый результат выглядит примерно так:

1, Canada  
4, China
4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

DISTINCT - ключевое слово
Для меня ваш запрос правильный

Просто попробуйте сделать это первым.

SELECT DISTINCT title,id FROM tbl_countries

Позже вы можете попробовать выполнить заказ.

Ответ 3

Для использования ключевого слова 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)

Ответ 4

В 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 = "компьютеры".

Строки объединены с функцией CONCAT в MySQL. Окончательное решение нашей проблемы может быть выражено в 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

Ответ 5

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

Ответ 6

Попробуйте этот

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;

Ответ 7

Игнорировать повторяющиеся строки в 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

Ответ 8

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;

Ответ 9

Повторяющиеся строки можно удалить для сложных запросов с помощью

Сначала сохраните результат в #TempTable или @TempTableVariable

Удалить из #TempTable или @TempTableVariable, где ваше состояние

Затем выберите остальные данные.

Если необходимо создать номер строки, создайте столбец идентификации.