Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
26.10.2005, 16:27
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
ASE 12.5.0. Ситуевина. Есть две таблички - юзера и их телефоны. Телефоны имеют признак "предпочтительный" и бывают land and cell. Нужно показать пользователя и оба его телефона, так чтобы был виден предпочтительный телефон, а если его нет то любой без этого признака. Без дублирования записей пользователя. Т.е. нужно отсортировать телефоны по признаку и взять только первый. Пусто если нет ни одного. Нужно сделать в одном запросе... Все бы ничего, но ASE моей версии не поддерживает select from select и top. Да, данные нужно выводить в ASP, так что буду рассматривать любые предложения, вплоть до shaping providers. Но это конечно уже изврат и удар по производительности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 16:36
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 16:56
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
Где? Если мне нужно более одного юзера показать, то set rowcount отработает для всего запроса. А мне нужно только телефоны ограничить. Впрочем, я не упомянул этого.. Еще предложения есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 17:08
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
А хранимая процедура удовлетворяет условию "в одном запросе"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 17:48
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
В общем да, но что это меняет? Мне еще нужно поиск по юзерам. Можно ли в ASE выполнить строку? Еще раз. Мне нужно что-то вроде Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 18:15
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
В общем да, но что это меняет? как вариант - написать процедуру в несколько селектов (что безусловно не красиво) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 18:20
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
А можно в двух словах о процедуре? Я не понимаю как это сделать. Вот если рассматривать на клиенте, то я бы вычитал юзеров, а потом для каждого из них отдельными запросами телефоны. Это как раз случай где можно использовать set rowcount. И я уже думал о нем. Но так как юзеров много, то это просто нагнет сервер... Мне бы одним запросом извернуться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 18:34
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
К сожалению у меня нет сейчас ASE Но может как то так (воспользоваться аггрегативом min к примеру) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 18:45
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
Просто, если бы вы привели полностью структуру таблиц, данные и ожидаемый результат, вам бы помогли быстрее.... А насчет нескольких select в процедуре можно промежуточные результаты записывать в #temp таблицы и осуществлять джойн с их участием ..... например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. PS Только я думаю в вашем случае все таки можно сделат в один запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 18:50
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
Да, я там с top чушь написал... Но понятно, что мне нужен один телефон каждого типа для каждого юзера. так что скорее Код: plaintext 1. 2. 3. 4. 5. Только top не хватает. Может можно хинт какой прямо в select? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 21:26
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
table _users id name 1 user 1 2 user 2 table _phones id type pref phone 1 c 1223 1 c p 77 1 l p 88 1 l 66 2 c 222 запрос select u.name, coalesce( (select top 1 p.phone from _phones p where u.id = p.id and type = 'c' and pref='p'), (select top 1 p.phone from _phones p where u.id = p.id and type = 'c'), "" ) as C, coalesce( (select top 1 p.phone from _phones p where u.id = p.id and type = 'l' and pref='p'), (select top 1 p.phone from _phones p where u.id = p.id and type = 'l'), "" ) as L from _users u результат name C L user 1 77 88 user 2 222 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 21:47
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Запрос: Показать всех person удовлетворяющим критериям поиска. Для каждой person вывести два телефона (cell & land). Если среди телефонов есть предпочтительный, то вывести его, если нет то любой из оставшихся данного типа. Если нет ни одного данного типа телефона - пусто. Оба cell и land, могут иметь признак предпочтения. При этом барин желает искать как по имени, так и реверсно - по номеру телефона. (Ну, блин, как же плохо без select from select...) В оракле или MS SQL решилось бы с пол-пинка, так как есть возможность взять top 1 в коррелированном запросе. Я вот решил на все плюнуть и возложить все на хрупкие плечи клиентской части... Сделать что-то вроде Код: plaintext 1. 2. 3. 4. 5. А потом просто бежать по результату и сворачивать записи. Если телефон найден, то остальные записи просто прорускаются, пока не найдена новая персона. Если кто и будет ждать, так это web клиент. Но хоть сервер базы, не буду загружать дурной работой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 22:16
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
Два подзапроса в isnull сделайте, и будет вам счастье. Типа isnull( (select xxx from phones where такой телефон), (select xxx from phones where разэтакий телефон) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.10.2005, 23:55
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
Peter Kirillow Ну нетути top у него. 12.5.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2005, 00:00
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
MasterZivДва подзапроса в isnull сделайте, и будет вам счастье. Типа isnull( (select xxx from phones where такой телефон), (select xxx from phones where разэтакий телефон) ) У меня телефонов разэтаких может быть больше одного... Очень сомневаюсь что isnull прокатит ;-) ASE 12.5.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2005, 10:39
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
Есть способ - вроде работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2005, 20:26
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
isnull прокатит. Если много телефонов, то вам придется выделить как-то один и его показывать. В SQL нет операции "взять любую запить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2005, 21:40
|
|||
|---|---|---|---|
|
|||
Ограничение числа записей |
|||
|
#18+
Ok! Всем спасибо! Буду доводить идею до ума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2005, 23:12
|
|||
|---|---|---|---|
Ограничение числа записей |
|||
|
#18+
MasterZivisnull прокатит. Если много телефонов, то вам придется выделить как-то один и его показывать. В SQL нет операции "взять любую запить". Ну, может тогда так: select u.name, isnull(max(case when p1.kind = 'c' then p1.phone else null end),'n/a') CellPhone, isnull(max(case when p1.kind = 'l' then p1.phone else null end),'n/a') Landphone from phone p1, users u where p1.id = u.id and p1.prereffered = (select min(p2.prereffered) from phone p2 where p2.id = p1.id and p2.kind = p1.kind group by p2.id, p2.kind) group by u.name go ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&mobile=1&tid=2013297]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 371ms |

| 0 / 0 |
