|
|
|
Несколько разноприоритетных условий join для неоднозначных данных
|
|||
|---|---|---|---|
|
#18+
Подскажите, как лучше такое реализовать? Нужно связать между собой два набора данных, для которых условия по связыванию могут зависеть от нескольких факторов. Есть Клиент. У Клиента есть дочерние Услуги разных Типов. Для новых данных соблюдается ограничение, что у Клиента может быть не больше одной Услуги каждого Типа. Но для старых Клиентов такого ограничения не было и у некоторых Клиентов может быть несколько Услуг одного типа. У Услуг есть набор различных Атрибутов, состав которых зависит от Типа услуги. Есть два Типа услуг, которые логически увязаны друг с другом на уровне бизнес-процессов. На уровне базы данных услуги можно связать между собой (для этого в БД есть специальная таблица связей), однако в информационной системе для операторов не предусмотрен GUI для этой операции, связь устанавливается с помощью административных инструментов информационной системы. Необходимо с помощью стороннего скрипта синхронизировать их между собой. При синхронизации услуги сопоставляются между собой по следующему алгоритму (правила применяются в рамках одного Клиента, в порядке их перечисления): 0. Если услуги присутствуют в таблице связей, то всегда используется существующая связь. 1. Если есть ровно одна Услуга с типом Тип1 и ровно одна услуга с типом Тип2, то они связываются (и эта связь добавляется в таблицу связей). 2. У Услуги с типом Тип1 есть Атрибут1. У Услуги с типом Тип2 есть Атрибут2. Если у услуг разных типов совпадают значения Атрибут1 и Атрибут2, то они связываются. 3. У Услуги с типом Тип1 есть атрибут Логин. У Услуги с типом Тип2 есть атрибут ДатаДобавления. Несвязанные услуги упорядочиваются по вышеуказанным атрибутам и связываются по порядковому номеру. 4. Оставшиеся Услуги фиксируются в журнале, ими вручную занимается администратор информационной системы. Есть выборка для Услуг типа Тип1 примерно следующего вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Есть выборка для Услуг типа Тип2 примерно следующего вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. По отдельности эти запросы возвращают правильные результаты. Как мне их связать между собой? Как-то так? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Или может быть условие соединение описывать через CASE (тогда не нужно будет повторять инвертированные предыдущие условия)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 19:05 |
|
||
|
Несколько разноприоритетных условий join для неоднозначных данных
|
|||
|---|---|---|---|
|
#18+
В финальном запросе переделал left на full. Код: plsql 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. Работает быстро, результаты возвращает правильные. Но я не уверен, что связываться данные будут именно в том порядке, который мне требуется (наиболее приоритетна существующая связь, затем остальные критерии). И еще вопрос, из чистого любопытства — почему-то full join выполняется гораздо быстрее, чем left join (250 мс против нескольких минут). Причем эта разница сохраняется даже если я раскомментирую ограничение в WHERE (которое фактически превращает full join в left join). Планы разумеется различаются, но на мой взгляд план с left join должен быть быстрее. left join + explain Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. full join + explain Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 20:27 |
|
||
|
Несколько разноприоритетных условий join для неоднозначных данных
|
|||
|---|---|---|---|
|
#18+
И еще хотел бы спросить. С полученными данными мне нужно будет делать несколько разных обработок. Поэтому я хочу использовать не запрос, а вспомогательную таблицу, которая будет предварительно очищаться, а затем в которую эти данные будут сохраняться. Не посоветуете, с какими параметрами и атрибутами эту таблицу лучше создавать? Я задал LOGGING, CACHE и NOPARALLEL. Или лучше просто сделать временную таблицу (global temp)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 21:37 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=113&tid=1883935]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
21ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 306ms |

| 0 / 0 |
