Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
ASE 12.5.0. Ситуевина. Есть две таблички - юзера и их телефоны. Телефоны имеют признак "предпочтительный" и бывают land and cell. Нужно показать пользователя и оба его телефона, так чтобы был виден предпочтительный телефон, а если его нет то любой без этого признака. Без дублирования записей пользователя. Т.е. нужно отсортировать телефоны по признаку и взять только первый. Пусто если нет ни одного. Нужно сделать в одном запросе... Все бы ничего, но ASE моей версии не поддерживает select from select и top. Да, данные нужно выводить в ASP, так что буду рассматривать любые предложения, вплоть до shaping providers. Но это конечно уже изврат и удар по производительности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 16:27 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 16:36 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Где? Если мне нужно более одного юзера показать, то set rowcount отработает для всего запроса. А мне нужно только телефоны ограничить. Впрочем, я не упомянул этого.. Еще предложения есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 16:56 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
А хранимая процедура удовлетворяет условию "в одном запросе"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 17:08 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
В общем да, но что это меняет? Мне еще нужно поиск по юзерам. Можно ли в ASE выполнить строку? Еще раз. Мне нужно что-то вроде Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 17:48 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
В общем да, но что это меняет? как вариант - написать процедуру в несколько селектов (что безусловно не красиво) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 18:15 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
А можно в двух словах о процедуре? Я не понимаю как это сделать. Вот если рассматривать на клиенте, то я бы вычитал юзеров, а потом для каждого из них отдельными запросами телефоны. Это как раз случай где можно использовать set rowcount. И я уже думал о нем. Но так как юзеров много, то это просто нагнет сервер... Мне бы одним запросом извернуться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 18:20 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#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:34 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Просто, если бы вы привели полностью структуру таблиц, данные и ожидаемый результат, вам бы помогли быстрее.... А насчет нескольких select в процедуре можно промежуточные результаты записывать в #temp таблицы и осуществлять джойн с их участием ..... например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. PS Только я думаю в вашем случае все таки можно сделат в один запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 18:45 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Да, я там с top чушь написал... Но понятно, что мне нужен один телефон каждого типа для каждого юзера. так что скорее Код: plaintext 1. 2. 3. 4. 5. Только top не хватает. Может можно хинт какой прямо в select? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 18:50 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#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:26 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#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, 21:47 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Два подзапроса в isnull сделайте, и будет вам счастье. Типа isnull( (select xxx from phones where такой телефон), (select xxx from phones where разэтакий телефон) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 22:16 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Peter Kirillow Ну нетути top у него. 12.5.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 23:55 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
MasterZivДва подзапроса в isnull сделайте, и будет вам счастье. Типа isnull( (select xxx from phones where такой телефон), (select xxx from phones where разэтакий телефон) ) У меня телефонов разэтаких может быть больше одного... Очень сомневаюсь что isnull прокатит ;-) ASE 12.5.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2005, 00:00 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#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, 10:39 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
isnull прокатит. Если много телефонов, то вам придется выделить как-то один и его показывать. В SQL нет операции "взять любую запить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2005, 20:26 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#18+
Ok! Всем спасибо! Буду доводить идею до ума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2005, 21:40 |
|
||
|
Ограничение числа записей
|
|||
|---|---|---|---|
|
#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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2005, 23:12 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33346368&tid=2013297]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 444ms |

| 0 / 0 |
