Я создаю приложение, которое динамически генерирует sql для поиска строк конкретной таблицы (это основной класс домена, например Employee).
Существуют три таблицы Table1, Table2 и Table1Table2Map. Таблица 1 имеет много-много отношений с таблицей 2 и отображается в таблице Table1Table2Map. Но так как Table1 является моей основной таблицей, отношения практически одинаковы друг от друга.
Мое приложение генерирует sql, который в основном дает набор результатов, содержащий строки из всех этих таблиц. Предложение select и joins не изменяются, тогда как предложение where создается на основе взаимодействия пользователя. В любом случае я не хочу дублировать строки таблицы 1 в моем результирующем наборе, так как это основная таблица для отображения результатов. Сейчас запрос, который создается, выглядит следующим образом:
select distinct Table1.Id as Id, Table1.Name, Table2.Description from Table1
left outer join Table1Table2Map on (Table1Table2Map.Table1Id = Table1.Id)
left outer join Table2 on (Table2.Id = Table1Table2Map.Table2Id)
Для простоты я исключил предложение where. Проблема заключается в том, что в таблице 2 для таблицы есть несколько строк, хотя я сказал, что отличается от Table1.Id набор результатов имеет повторяющиеся строки таблицы 1, поскольку он должен выбрать все соответствующие строки в таблице2.
Чтобы подробнее рассказать о том, что для строки в таблице 1 с Id = 1 в таблице Table1Table2Map (1, 1) и (1, 2) отображаются таблицы 1 в две строки в таблице 2 с идентификаторами 1, 2. Вышеуказанные упомянутый запрос возвращает повторяющиеся строки для этого случая. Теперь я хочу, чтобы запрос возвращал строку Table1 с идентификатором 1 только один раз. Это связано с тем, что в таблице 2 есть только одна строка, которая соответствует активному значению для соответствующей записи в таблице 1 (эта информация содержится в таблице сопоставления). Есть ли способ избежать дублирования строк таблицы.
Я думаю, что есть некоторые основные проблемы в том, как я пытаюсь решить проблему, но я не могу понять, что это такое. Спасибо заранее.