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 года.