|
join по одному из условий
|
|||
---|---|---|---|
#18+
У меня есть два набора данных, которые нужно соединить между собой по любому из нескольких критериев. Если упростить, то наборы данных такие: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Каждый из наборов упорядочен по своему критерию (пронумерован через IDX). CUSTOMER_ID группирует наборы, CNT указывает на количество строк внутри группы (в тестовых наборах для упрощения только одна группа). Правила соединения у меня следующие: 1. Если IP.PARENT=SL.SERVICE_ID, то соединить строки этих наборов. 2. Из оставшихся записей наборы состоящие из одной строки (CNT=1) соединяются между собой. 3. Из оставшихся записей (в группе больше одной строки и для IP.PARENT нет пары) строки наборов соединяются по совпадению поля IP. 4. И наконец если все равно остались какие-то записи, то они соединяются по порядковому номеру. У меня используется такой запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Но на этом тестовом наборе он удваивает строки (потому что одновременно совпадают условия 3 и 4). Если условие 4 закомментировать, то строки не удваиваются. Но хотелось бы его сохранить, потому что такое условие иногда случается. Не подскажите, как тут можно исключить дубли? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 12:02 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
ну так добавьте. условие 4, если условие 3 НЕ выполняется ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 12:33 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
У меня именно так и сделано. Дубли появляются потому, что есть несовпадающие IP и совпадающие IDX. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 12:58 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
Alibek B. У меня именно так и сделано. Дубли появляются потому, что есть несовпадающие IP и совпадающие IDX. значит показываются строки, совпадающие например по 2 и 4 или по 1 и 4 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 14:29 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
Ну как бы в том и вопрос. Если добавить в запрос вывод столбцов SL.IDX, IP.IDX, то становится понятно, что строки потому и удваиваются, что для двух строк в моем примере одновременно выполняются условия 3 и 4 (совпадающие IP и несовпадающие IP с совпадающими IDX). Но как поменять условия, чтобы исключить их одновременное выполнение, я не соображу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:43 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
Alibek B., Уже похоже на говнокод, но может 1 or (not(1) and 2) or (not(1) and not(2) and 3)? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:50 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
Alibek B., Двоится не из-за выполнения нескольких условий а из-за концепции «оставшихся записей». Оставшихся от чего? Соединяются все записи со всеми, если подходят условия. Никто нигде не «остается» ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:58 |
|
join по одному из условий
|
|||
---|---|---|---|
#18+
Код: 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. 52.
Изучайте вашу ситуацию. Надеюсь, так станет понятнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 13:34 |
|
|
start [/forum/topic.php?fid=52&fpage=58&tid=1881752]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 176ms |
0 / 0 |