> SELECT 2 num UNION ALL
> SELECT 3 num UNION ALL
> SELECT 4 num UNION ALL
> SELECT 5 num UNION ALL
> SELECT 6 num UNION ALL
> SELECT 7 num UNION ALL
> SELECT 8 num UNION ALL
> SELECT 9 num) ones
> CROSS JOIN
> (SELECT 0 num UNION ALL
> SELECT 10 num UNION ALL
> SELECT 20 num UNION ALL
> SELECT 30 num UNION ALL
> SELECT 40 num UNION ALL
> SELECT 50 num UNION ALL
> SELECT 60 num UNION ALL
208
Глава 10. И снова соединения
> SELECT 70 num UNION ALL
> SELECT 80 num UNION ALL
> SELECT 90 num) tens
> CROSS JOIN
> (SELECT 0 num UNION ALL
> SELECT 100 num UNION ALL
> SELECT 200 num UNION ALL
> SELECT 300 num) hundreds;
++
| ones.num + tens.num + hundreds.num |
++
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
...
...
...
| 391 |
| 392 |
| 393 |
| 394 |
| 395 |
| 396 |
| 397 |
| 398 |
| 399 |
++
400 rows in set (0.00 sec)
Если найти декартово произведение трех наборов – {0, 1, 2, 3, 4, 5, 6, 7,
8, 9}, {0, 10, 20, 30, 40, 50, 60, 70, 80, 90} и {0, 100, 200, 300} – и сло
жить значения во всех трех столбцах, получится результат, состоя
щий из 400 строк, содержащих все числа от 0 до 399. Хотя это больше
366 строк, необходимых для формирования набора дней 2004 года, из
бавиться от лишних строк достаточно просто. Вскоре я покажу, как
это сделать.
Следующий шаг – преобразовать числа в набор дат. Для этого восполь
зуемся функцией
date_add()
и добавим каждое число в результирую
щий набор к 1 января 2004 года. Затем введем условие фильтрации,
чтобы отбросить все даты 2005 года.
Перекрестные соединения
Достарыңызбен бөлісу: |