Android SQLite: выберите «Нет дубликатов» в запросе SQL - PullRequest
0 голосов
/ 07 августа 2011

У меня есть база данных, полная значений и один из столбцов в источнике (откуда берется конкретный элемент).Я пытаюсь заполнить счетчик всеми источниками, перечисленными в базе данных, но, очевидно, я хочу, чтобы они повторялись только один раз.Я пытаюсь использовать оператор sql:

String sql = "SELECT _id, origin FROM items GROUP BY origins";

Но я также использую собственный SimpleCursorAdapter для заполнения счетчика, и поэтому мне также необходимо запросить столбец _id.Когда я добавляю столбец _id к запросу, он создает запрос со всеми повторяющимися источниками, потому что идентификатор делает его там, где ни одна строка не является дубликатом.Что мне нужно сделать, чтобы пропустить оба столбца, но удалить дубликаты?Было бы здорово организовать их по алфавиту!

Ответы [ 3 ]

3 голосов
/ 07 августа 2011

Вы получаете представление с дублирующимися исходными значениями, поскольку каждое исходное значение может «принадлежать» нескольким идентификаторам.

Я не думаю, что следующее является «чистым» решением, но оно не дает вам дубликатов.значения вместе с наибольшим идентификатором, соответствующим каждому исходному значению:

Select origin, max(_id) from items group by origin
2 голосов
/ 07 августа 2011

Вы также можете подумать о нормализации вашей базы данных. Вместо того, чтобы повторять источники в таблице несколько раз, вы можете создать отдельную справочную таблицу источников. Затем в исходной таблице вы можете ссылаться на источник по его первичному ключу. Например:

origins
***********************
id     name
-----------------------
1      origin_1
2      origin_2
3      origin_3
***********************

detail_data
**************************
id      origin_id     data
1       1             ...
2       1             ...
3       3             ...
4       3             ...
**************************

Тогда, если вам нужны только источники, для которых существуют данные, вы можете сделать что-то вроде:

SELECT DISTINCT o.* 
FROM origins AS o 
JOIN detail_data AS dd ON (dd.origin_id = o.id)
ORDER BY o.name ASC;

Я обычно предпочитаю нормализованную базу данных, потому что нормализация может предложить такие преимущества, как уменьшенный размер занимаемой площади, более чистые данные и более гибкая структура. Я признаю, однако, что нормализация кажется менее выгодной с Android по сравнению с традиционными системами баз данных (то есть настольными компьютерами, серверами). И нормализация также имеет недостатки, такие как более сложные запросы (как мы видим выше). Однако для обеспечения максимальной гибкости, ремонтопригодности и надежности в долгосрочной перспективе лучшим подходом может быть нормализация.

0 голосов
/ 07 августа 2011

Чтобы добавить к ответу Прели, если вы хотите, чтобы они были в алфавитном порядке, просто измените его на:

SELECT origin, MAX(_id) FROM items GROUP BY origin ORDER BY origin
...