SQL Запрос внешнего соединения сервера или Entity Framework для больших таблиц - PullRequest
0 голосов
/ 14 апреля 2020

у меня три таблицы; как одна из них главная таблица (имеет 7 м записей) и имеет отношения один ко многим с двумя дочерними таблицами.

Table1 (дочерний элемент tablemain)

+----+--------------+-------+------------+ 
| id | tablemain_id | value | updatedate |
+----+--------------+-------+------------+
|  1 |   1111111111 |   500 | 14/04/2020 |
|  2 |   2222222222 |   100 | 15/04/2020 |
|  3 |   2222222222 |   200 | 16/04/2020 |
|  4 |   2222222222 |   300 | 17/04/2020 |
|  5 |   3333333333 |   100 | 18/04/2020 |
|  6 |   3333333333 |   500 | 19/04/2020 |
|  7 |   3333333333 |   600 | 20/04/2020 |
|  8 |   4444444444 |   300 | 21/04/2020 |
|  9 |   4444444444 |   200 | 22/04/2020 |
| 10 |   4444444444 |   900 | 23/04/2020 |
+----+--------------+-------+------------+

TableMain (он же Table2)

+------------+------------+
|     id     | other data |
+------------+------------+
| 1111111111 | somedata   |
| 2222222222 | somedata   |
| 2222222222 | somedata   |
| 2222222222 | somedata   |
| 3333333333 | somedata   |
| 3333333333 | somedata   |
| 3333333333 | somedata   |
| 4444444444 | somedata   |
| 4444444444 | somedata   |
| 4444444444 | somedata   |
+------------+------------+

Table3 (еще один дочерний элемент tablemain)

+----+--------------+-------+------------+
| id | tablemain_id | price | updatedate |
+----+--------------+-------+------------+
|  1 |   1111111111 |    12 | 20/01/2020 |
|  2 |   2222222222 |    22 | 21/01/2020 |
|  3 |   2222222222 |    21 | 22/01/2020 |
|  4 |   2222222222 |    23 | 23/01/2010 |
|  5 |   3333333333 |    44 | 27/01/2020 |
|  6 |   3333333333 |    41 | 28/01/2020 |
|  7 |   3333333333 |    54 | 29/01/2020 |
|  8 |   5555555555 |    44 | 23/01/2020 |
|  9 |   5555555555 |    22 | 24/01/2020 |
| 10 |   5555555555 |    33 | 25/01/2020 |
+----+--------------+-------+------------+

Я хочу получить записи из Table1 среди последний table1.value меньше, чем 500 и последний таблица цен Table3 старше 25.01.2020 или ноль.

Мой ожидаемый результат:

+----+--------------+-------+------------+
| id | tablemain_id | value | updatedate |
+----+--------------+-------+------------+
|  4 |   2222222222 |   300 | 17/04/2020 |
| 10 |   4444444444 |   100 | 23/04/2020 |
+----+--------------+-------+------------+

На самом деле мне удалось получить результат по этому запросу SQL (SQL запросы тоже хорошо) но это очень медленно! В TableMain.

примерно 7 миллионов строк. Вот мой запрос:

select *
from 
    (select 
         t1.value as table1value, t1.UpdateTime as T1Update,
         tm.somedata, t3.price, t3.UpdateTime as T3Update
         row_number() over (partition by tablemain_ID order by t3.UpdateTime desc) AS rk2,
         row_number() over (partition by tablemain_ID order by r1.UpdateTime desc) AS rk
     from 
         TableMain tm
     inner join 
         Table1 t1 on tm.ID = t1.TableMain_ID
     full outer join 
         Table3 t3 on tm.ID = TableMain_ID
     group by 
         t1.value, t1.UpdateTime, tm.somedata, t3.price, t3.UpdateTime) tv
where 
    tv.rk = 1  
    and (tv.T3Update < 'somedate' or tv.T3Price is null)

1 Ответ

0 голосов
/ 14 апреля 2020

Разве ваш результат не должен быть 300? 600 - это не менее 500?

+----+--------------+-------+------------+
| id | tablemain_id | value | updatedate |
+----+--------------+-------+------------+
|  4 |   2222222222 |   300 | 17/04/2020 |
| 10 |   4444444444 |   100 | 23/04/2020 |
+----+--------------+-------+------------+

Или мы видим примеры значений, которых нет в данных примера? Я думаю, что это немного сбивает с толку, потому что мы не видим даты в примерах таблиц, но видим эти даты в ожидаемом результате.

Кроме того, имена ваших столбцов не соответствуют тому, что вы просите. В вашем примере запроса вы отфильтровываете, что T3Price имеет значение null, но в своем запросе вы говорите, что дата ценообразования старше 25-01-2020 или дата ценообразования равна нулю.

Пожалуйста, постарайтесь быть более точным в своем примере, чтобы легче увидеть отношения и требования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...