|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Просьба помочь. В сторону какого оператора копать Перерыл кучу стаей, нигде не нашел. есть таблица1, где шапки документов №-описание-статус есть таблица 2, где строки документов код элемента - количество - id_таблицы1 как мне отобрать документы таблицы1, в которых 3 строки и строго только следующие коды элементов (1,12,17). Код: plsql 1. 2. 3.
\\выдает пусто Код: plsql 1. 2. 3.
или Код: plsql 1.
\\выдает больше значений, т.к. между значениями OR ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 16:34 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
AmonRa, Что есть pos? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 16:40 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
PinkCat.000003, исправил ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 16:44 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
AmonRa, http://www.postgresqltutorial.com/postgresql-all/ Хотя... скорее всего придется считать в два этапа - первый - подсчет вхождений, второй - отбор по нужному количесtvu. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 17:03 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
AmonRa, оптимальный зависит от статистики (количеств записей в таблицах и их соотношений) можно 3 exists--а, можно джойнить на array_agg() | count(distinct ...) where в т.ч. lateral ~~ примерно в эту сторону Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 17:04 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq, спасибо, но запрос выдаст все журналы, у которых 3 строки и как минимум один элемент из массива. но это неверно, т.к. могут быть 3-х строчные журналы включающие 1 или 2 элемента ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 17:14 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq, хотя оптимально в другую сторону . куда-то туда : -- не вычитывал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 17:16 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
AmonRa qwwq, спасибо, но запрос выдаст все журналы, у которых 3 строки и как минимум один элемент из массива. но это неверно, т.к. могут быть 3-х строчные журналы включающие 1 или 2 элемента dhfnm nj pfxtv & ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 17:17 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq qwwq, хотя оптимально в другую сторону . куда-то туда : -- не вычитывал и наврал. править надо примерно втуда : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2019, 22:46 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq, Зачем так усложнять с self join В начале, очевидно, должен быть exists со слов "отобрать документы таблицы1", про таблицу 2 ни слова. Вот мой тестовый вариант в один проход: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 02:46 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Не надо писать ерунду ночью. Зачем здесь окна сам не пойму. Все гораздо проще. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 07:55 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit, если экономить буковки в селекте, то можно и ещё короче Код: 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.
только в зависимости от кардинальностей оно может оказаццо сильно хуже более длинного буковками запроса (а может и не сильно -- если искомого довольно много от общего, и при этом не так много деталировок по 100500 позиций) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 10:13 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq, Мне кажется мой запрос Код: 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.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
будет эффективнее вашего Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Особенно на больших данных. Операция сравнения массивов будет очень дорогой. Извините за занудство. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 10:58 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit, ну давайте понудим ddl + data Код: 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.
array_agg= Код: 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.
exist having Код: 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.
"сложно" Код: 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. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.
кактотак ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 11:20 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq, Мда... я убедился, но не понял почему. Это кунгфу мне пока не доступно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 11:53 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
чуть изменил запрос, я кажется понял свою ошибку. Код: sql 1. 2. 3. 4. 5.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:05 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit чуть изменил запрос, я кажется понял свою ошибку. <> ну так тот, что "сложно " именно это и делает. (конструкции in() | = any(array[]) равносильны -- см план.) + зараз выводит деталировку . в качестве рюшечек. но всё сильно завязано на кардинальности. если всех товаров всего штук 5-6. и средний чек -- ровно 3 товара -- то агрегатить м.б. выгоднее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 12:37 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq Troglodit чуть изменил запрос, я кажется понял свою ошибку. <> ну так тот, что "сложно " именно это и делает. (конструкции in() | = any(array[]) равносильны -- см план.) + зараз выводит деталировку . в качестве рюшечек. но всё сильно завязано на кардинальности. если всех товаров всего штук 5-6. и средний чек -- ровно 3 товара -- то агрегатить м.б. выгоднее. Я не понял для чего лишние танцы с бубном Код: sql 1. 2. 3.
и изначально я сомневался насчет запроса с Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 13:00 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit Я не понял для чего лишние танцы с бубном array_agg( (t2.*)::table2) и lateral unnest(table2_s) AS ut2 qwwq <> + зараз выводит деталировку . в качестве рюшечек. <> там могет быть чтонть оригинальное, типа скидок, цветов, количеств и т.п. плавающих параметров. получаем за 1 проход вместе с шапками. Troglodit и изначально я сомневался насчет запроса с Код: sql 1.
это к тому, что "формально упрощать" можно тупо в лоб (одно легкоинтерпретируемое сравнение вместо кучи сравнений в хевинге), (заодно решая случай с повторами позиций в деталировке) что не является реальной оптимизацией. т.е. за краткость декларативных предложений бороться надо во вторую очередь . в первую -- за простоту(вычислительную оптимальность) исполнения и да , при подобающей кардинальности и наличии соотв. индексов фильтрация в where обыкновенно сильно дешевле, чем по агрегатам в having. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 13:35 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
qwwq AmonRa, оптимальный зависит от статистики (количеств записей в таблицах и их соотношений) можно 3 exists--а, можно джойнить на array_agg() | count(distinct ...) where в т.ч. lateral ~~ примерно в эту сторону Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
на самом деле мне это помогло. на этой основе написал. огромное спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 15:44 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
AmonRa, Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 17:49 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
entrypoint, Мне кажется у вас тот же изъян в запросе, что и в моем предыдущем варианте. Попробуйте на большой случайной выборке из запроса выше, мне кажется сильно удивитесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2019, 21:40 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit, Никаких изъянов В задаче не дается тестовый массив данных, поэтому давая решение предполагаю, что источник данных содержит уникальное сочетание id + elementcode, т.е CTE а - это Код: plsql 1. 2. 3. 4. 5. 6.
во всех остальных случаях источник нужно привести к этому виду в Вашем случае Код: 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.
Какой вопрос - такой и ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 10:02 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
entrypoint, Вы создайте таблицы как написал выше qwwq, и заполните не 10 записей, а как у него. И очень сильно удивитесь, когда сделаете explain. Я прождал пять минут используя ваш вариант, но результата так и не дождался, хотя мой последний вариант с правками от qwwq или его вариант на этих же данных исполняется менее секунды. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 12:53 |
|
SELECT по двум таблицам
|
|||
---|---|---|---|
#18+
Troglodit, авторЯ прождал пять минут используя ваш вариант, но результата так и не дождался, хотя мой последний вариант с правками от qwwq или его вариант на этих же данных исполняется менее секунды. Думаю - это логично Автор не предоставил структуру, а я её не придумывал, просто дал одно решение А Ваш вариант, с Вашей структурой базы данных, с Вашим запросом и с Вашим пониманием предмета и должен работать быстро ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2019, 14:07 |
|
|
start [/forum/topic.php?fid=53&tid=1994878]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 406ms |
0 / 0 |