|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Имеется Таблица с полем Name, так вот его удивительное содержимое! "Лариса~Влад~Николай" "Борис" "Андрей~Николай~Борис" ну никак не могу сообразить как вытащить эти имена, чтобы в результате они были по одному и не повторялись типа SELECT DISTINCT ......... в результате: "Лариса" "Влад" "Николай" "Борис" "Андрей" Может посоветуете что, по существу ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2015, 22:04 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
SELECT`ами никак из этой каши не вытащить, сначала надо данные нормализовать. Как вариант примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 06:40 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Хотя я полностью согласен с тем, что Dima Tсначала надо данные нормализовать., тем не менее Dima TSELECT`ами никак из этой каши не вытащить вытащить можно: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
О производительности, ясное дело, говорить тут не приходится. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 07:14 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Да мне кажется можно и проще. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 08:26 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Пока сотворила и пользуюсь вариантом: * Выбираем первые - getwordnum(name, 1 ,'~') Select Cast(getwordnum(name, 1 ,'~') as C(10)) as qwe from Tab1 TABLE Tmp * Зная, что максимум сочетаний - 6 запускаю цикл (с 2-ки т.к. 1-е уже в Tmp) FOR I=2 TO 6 INSERT INTO Tmp (qwe) SELECT Cast(GETWORDNUM(NAME, I ,'~') as C(10)) from Tab1 WHERE GETWORDCOUNT(Name,'~')> I-1 NEXT * Тет самым получаю Все имени * Ну и затем в архив с соблюдением уникальности SELECT DISTINCT qwe FROM Tmp INTO ARRAY ss * 5 строчек кода, о производительности молчу ( ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 11:11 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Людмila, а нафига цикл с i=2 ? имхо на гетвордкаунте потеряется больше времени, чем на добавление пустых записей в курсор... тем более что всё равно потом дистинктом проходите Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 11:52 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Ну первый Select - создает Tab1 с первыми Именами (в вашем варианте Тав1 придется все равно Create Table) поэтому For I=2 to 6 вставляем в Тав1 - уже вторые и последующие имена, по-моему так быстрее. на производительность протестирую все варианты (попозже) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 12:18 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Людмila Попробуйте так: SELECT * FROM (SELECT PADR(GETWORDNUM(field1,1,'~'),20) FROM table1; UNION SELECT PADR(GETWORDNUM(field1,2,'~'),20) FROM table1 ; UNION SELECT PADR(GETWORDNUM(field1,3,'~'),20) FROM table1) ; AS query1 WHERE !EMPTY(exp_1) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 13:08 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Людмilaна производительность протестирую все вариантыесли там не сотни тысяч записей, то навряд ли разница будет заметна ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2015, 13:36 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Вариант от sg12 тоже работает и более всех - в духе SQL! протестировать на производительность пока нет возможности - всего около 50 записей, ну и затраченное время естественно 0.00 sec во всех вариантах. Как бы то ни было, на мой взгляд, последний вариант рулит! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2015, 20:36 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
ЛюдмilaВариант от sg12 тоже работает и более всех - в духе SQL! протестировать на производительность пока нет возможности - всего около 50 записей, ну и затраченное время естественно 0.00 sec во всех вариантах. Как бы то ни было, на мой взгляд, последний вариант рулит! При больших таблицах SCAN эффективнее, чем SELECT. Вообще-то все эти решения совершенно равнозначны, по обстоятельствам. Нужно только немного упорядочить коды, вам в коллекцию: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2015, 22:22 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Очень признательна! Большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 01:57 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Людмilaи более всех - в духе SQL! SQL в чистом виде тут не уместен. SQL предполагает что данные нормализованы согласно правилам реляционных БД, чего в данном случае нет. Поэтому конкретно в этом случае для использования только SQL надо заложить жесткое ограничение на количество имен в одной строке. Например 6. Что будет если в рабочем коде появится строка где имен 7 или 8 ? Зачем закладывать такие "мины" в код? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 09:46 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Dima TЛюдмilaи более всех - в духе SQL! SQL в чистом виде тут не уместен. SQL предполагает что данные нормализованы согласно правилам реляционных БД, чего в данном случае нет. Поэтому конкретно в этом случае для использования только SQL надо заложить жесткое ограничение на количество имен в одной строке. Например 6. Что будет если в рабочем коде появится строка где имен 7 или 8 ? Зачем закладывать такие "мины" в код? Подсчитать количество имен вы можете хотя бы так: SELECT MAX(OCCURS('~',field1)) + 1 FROM table1 О нормализации у вас странные понятия. Например, вас можно понять так, что по вашим представлениям полей вида ФИО (Иванов Петр Сергеевич) не может быть, т.к. данные разделены пробелом. Или, в списках отделов кадров полно бывает не только тезок, но и полных однофамильцев. Эта же таблица с именами вполне может быть списком детей по группам в детском садике на новогодние открытки, что по вашим понятием недопустимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 12:15 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
sg12Подсчитать количество имен вы можете хотя бы так: SELECT MAX(OCCURS('~',field1)) + 1 FROM table1 Могу, а дальше как задачу средствами SQL ? Никак, потому что SQL работает на нормализованных данных. Поэтому их надо сначала как-то нормализовать другими средствами, а затем применять SQL. sg12О нормализации у вас странные понятия. Это не мои понятия, это основы реляционных БД. Бери любую книгу по любой СУБД и в начале будет следущее: https://ru.wikipedia.org/wiki/Первая_нормальная_форма Определение Переменная отношения находится в первой нормальной форме тогда и только тогда, когда в любом допустимом значении отношения каждый его кортеж содержит только одно значение для каждого из атрибутов Это основы, которые должны быть соблюдены. В данном случае это правило нарушено: один кортеж (запись) содержит несколько значений (имен). Поэтому возникает проблема применения SQL к этим данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 15:27 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Людмilaи более всех - в духе SQL! а почему мой вариант вам показался "менее в духе скл"? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 16:08 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Dima Tsg12Подсчитать количество имен вы можете хотя бы так: SELECT MAX(OCCURS('~',field1)) + 1 FROM table1 Могу, а дальше как задачу средствами SQL ? Никак, потому что SQL работает на нормализованных данных. Поэтому их надо сначала как-то нормализовать другими средствами, а затем применять SQL. sg12О нормализации у вас странные понятия. Это не мои понятия, это основы реляционных БД. Бери любую книгу по любой СУБД и в начале будет следущее: https://ru.wikipedia.org/wiki/Первая_нормальная_форма Определение Переменная отношения находится в первой нормальной форме тогда и только тогда, когда в любом допустимом значении отношения каждый его кортеж содержит только одно значение для каждого из атрибутов Это основы, которые должны быть соблюдены. В данном случае это правило нарушено: один кортеж (запись) содержит несколько значений (имен). Поэтому возникает проблема применения SQL к этим данным. Копируете вы красиво. Только где вы там увидели подтверждение ваших утверждений. Вы путаете ваш термин "несколько значений (имен)" с именами людей, это не одно и тоже. Поля таблиц могут содержать достаточно сложное выражение, и не только символьное или какое, но и составное, и вычисляемое. Эта таблица соответствует вашему условию - пририсуйте индексное поле, для наглядности, и проблемы ваши исчезнут. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 18:02 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
sg12Копируете вы красиво. Только где вы там увидели подтверждение ваших утверждений. Я выше не увидел опровержение моих утверждений. Приведи, обсудим. PS Извини, своболудием не болею, флудить тебе придется в одиночестве. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 18:55 |
|
SELECT DISTINCT
|
|||
---|---|---|---|
#18+
Dima Tsg12Копируете вы красиво. Только где вы там увидели подтверждение ваших утверждений. Я выше не увидел опровержение моих утверждений. Приведи, обсудим. PS Извини, своболудием не болею, флудить тебе придется в одиночестве. Привычное вам обзывательства вам ближе. Я уже указывал, где вы путаетесь и вы снова "приведи". Два разных SQL у вас под носом, а вы все "никак". Пример: Есть такой тип поля - DateTime. Оно содержит в себе разделенные разделителями и вычисляемые с помощью функций год, месяц, день, час, минуты, секунды, а также AM/PM, день недели, високосность года, может еще-что. Т.е. по вашим понятиям это "имена", но вас это устраивает. С чего вы решили, что такое качество присуще только этому типу поля? Теперь об "основах", которыми вы козырнули. Когда дают ссылки типа вашей (или на MSDN, Microsoft и т.п.), то часто это означает, что автор ссылки сам не может в ней разобраться и хотел бы разъяснений. Переведем вами скопированную цитату на привычный язык: Таблица находится в первой нормальной форме тогда и только тогда, когда каждая строка содержит только одно значение для каждого столбца. И что из этой фразы следует, что вы хотели доказать? Интересно, а в Фоксе есть вообще такая возможность (.dbf ведь не таблица Excel)? Из Хелпа: Поля типа Character могут содержать различную символьную информацию: символы, цифры, знаки и прочее, но не могут быть использованы в арифметических и математических вычислениях; Вот строка из таблицы, все согласно Хелп, даже без прочих: lcString = "Лариса~Влад~Николай" Вас что, символ '~' в ней раздражает? А если вместо него будет пробел, подчеркивание, тире или запятая, то тогда как? Хотя бы функцию UPPER() можно применить? SELECT UPPER(field1) FROM table1 Для упражнений: В выражениях: 'Северо-восток Южного Вьетнама' или 'Земля Франса-Иосифа' или 'Штат Новый Орлеан' - сколько "ваших" имен? А здесь: 'Александр Дюма.Три мушетера' или 'Иван Сергеевич Тургенев' или 'Иванов,Иван,Иванович'? Сколько "имен" в строке: 'Паспорт выдан Ивановским ОВД г.Алешкино Сергеевской области'? Пример: Если в поле таблицы будут храниться различные алфавиты, вы будете требовать, чтобы каждую букву по вашему образцу "нормализовали", прежде чем ее оттуда извлечь? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2015, 22:24 |
|
|
start [/forum/search_topic.php?author=OOPer&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 444ms |
total: | 583ms |
0 / 0 |