То, что происходит, является декартовым произведением. Другими словами, набор вашего первого запроса приносит 2 строки, в то время как набор вашего второго приносит еще 2 строки. Итак, 2x2 = 4 строки.
Еще одна вещь, на которую следует обратить внимание, это то, что детали A и B не являются независимыми. Это не очень интуитивно понятно, я знаю. Позвольте мне попытаться рассказать вам, как Crystal справляется с этим (это не так, как на самом деле работает, просто полезный взгляд, чтобы понять это):
- Crystal выполняет два ваших запроса.
Результат первого запроса имеет 2 элемента, а именно 1 и 2.
Результат второго запроса содержит 2 других элемента, а именно 3 и 4.
- Кристалл, проверьте связь между двумя наборами результатов. Поскольку - я полагаю - вы не сказали Кристаллу, что это за ссылка, Кристалл полагает, что ссылок нет, поэтому он образует декартово произведение, которое дает 4 строки, а именно 1/3, 1/4, 2/3, 2/4 .
- Тогда Кристалл делает своего рода заявление «foreach». Таким образом, для каждого из 4 строк печатается один экземпляр раздела подробностей.
- Поскольку в вашем разделе с подробностями есть 2 подраздела, а именно: детали A и детали B, в итоге будет напечатано 4 детали, как вы видели:
1 //1st detail section, subsection A, field from 1st result set
3 //1st detail section, subsection B, field from 2nd result set
1 //2nd detail section, subsection A, field from 1st result set
4 //2nd detail section, subsection B, field from 2nd result set (second item)
2 //3st detail section, subsection A, field from 1st result set (second item)
3 //3st detail section, subsection B, field from 2nd result set
2 //4nd detail section, subsection A, field from 1st result set (second item)
4 //4nd detail section, subsection B, field from 2nd result set (second item)
Итак, как уже указывал @MilletSoftware (пока я писал это, хахах), самое простое решение - использовать два подотчета.