2015-05-13 3 views
0

Почему этот запрос выбирает две из каждой записи и как я могу сделать ее только для выбора?SQL-запрос, возвращающий две из каждой записи

Я не верю, что это связано с выбором JSON, но может быть.

SELECT 
    note.*, 
    usr.first_name AS usr_first_name, 
    usr.last_name AS usr_last_name, 
    e.data->>('f' || lname.field_id::text) AS entry_last_name, 
    e.data->>('f' || fname.field_id::text) AS entry_first_name 
FROM note 
LEFT JOIN usr ON note.usr_id = usr.usr_id 
LEFT JOIN entry AS e ON e.entry_id = note.entry_id 
LEFT JOIN field AS lname ON (lname.section_id = e.section_id AND lname.type = 'name') 
LEFT JOIN field AS fname ON (fname.section_id = e.section_id AND fname.type = 'first_name' AND fname.enabled = 1) 
WHERE note.grp_id = 1 AND note.deleted = 0 ORDER BY note.date DESC 
LIMIT 20 
+0

Можете ли вы предоставить данные о выборке и ожидаемые результаты? Верно ли дублирующиеся записи или их различия в некоторых столбцах? Я предполагаю, что добавление 'distinct' не устраняет проблему. – sgeddes

+0

Он возвращает два одинаковых точных результата. Где я могу добавить отличные? – maxhud

ответ

2

Скорее всего, один из ваших LEFT JOIN таблиц имеет две строки для каждой строки справа. Если вы проверите с помощью SELECT *, вы должны увидеть различия в результирующих строках (если у вас нет полных дубликатов в этой таблице, что будет проблемой).

Лучший способ исправить это зависит от информации, недоступной в вопросе. Один из способов - присоединиться к подзапросам (возможно, присоединить LATERAL), который складывает дубликаты перед присоединением, чтобы гарантировать, что одна строка слева гарантирована. Это, как правило, гораздо эффективнее, чем удаление обмоток с помощью DISTINCT.

+0

Исправлено - было несколько левых объединений – maxhud

Смежные вопросы