Если ваша система (аппаратное обеспечение, конфигурация и т. Д.) Рассчитана на объем данных, которые вы в нее помещаете, лучший, самый быстрый и простой способ - просто объединить таблицы в одном запросе, извлечь строки (см. Другие комментарии о fetch_size), а затем выгрузите его в любом формате.
Исходя из примера выходного формата, вам нужно обрабатывать строки в отсортированном порядке (элемент, аудит, комментарии). Вы перебираете строки и отслеживаете последний обработанный элемент, и всякий раз, когда текущий ITEM_ID отличается от предыдущего, вы выводите данные элемента.
Единственный наиболее важный аспект, который необходимо учитывать при принятии решения о том, как реализовать это, - вписывается ли объединение и сортировка в память или нет. Если сортировка / объединение разлится на диск, вам придется обойти это, чтобы добиться желаемой производительности. Некоторые примеры того, как избежать разлива диска:
Хэшируйте таблицы (или их копии) по ITEM_ID. Затем вы можете объединить таблицы по частям так, чтобы каждое объединение помещалось в памяти.
Или вы можете получить все данные из всех таблиц, а в своем Java-коде поместить элементы в связанный список, а аудит / комментарии - в какую-нибудь хеш-структуру, основанную на item_no. Затем вы перебираете элементы и запрашиваете аудит / комментарии по item_id. Это решение позволяет избежать операции сортировки и не требует размещения объединенного результата в памяти.
Или вы можете реализовать самостоятельное разбиение. Например, запросить данные 9 раз. В первом запросе вы выбираете только элементы с ITEM_ID, начинающимися или заканчивающимися на 1. Во втором запросе выбираются все элементы, начинающиеся / заканчивающиеся на 2 и так далее. Это решение приводит к сканированию 9 таблиц на всех таблицах, что явно не очень эффективно. Но если вам удастся избежать разлива на диск, он на самом деле может быть быстрее.