2016-05-28 2 views
0

У меня есть таблицы: juices, juice_ingredients и ingredients.Запрос, возвращающий несколько одинаковых строк вместо одного

Таблица juices имеет атрибуты:

  • имя
  • штрих

juice_ingredients Таблица содержит атрибуты:

  • juice_id
  • ingredient_id

И ingredients таблицы имеет

  • имя
  • факультативные (булево)

Ради логистики клиента различных соков могут иметь один и тот же штрих-код, но с различными ингредиентами, некоторые из которых являются необязательными Мне нужно выбрать по штрих-коду, единственный сок, который не содержит ингредиентов, не содержит ингредиентов.

Я подписал четыре ингредиента: вода (необязательно: ложная), сахар (необязательно: истина), целлюлоза ананаса (необязательно: ложная) и мята (необязательно: истина). И подписал четыре сока: один только с водой и ананасовой мякотью, другой с водой, ананасовой мякотью и сахаром, другой с водой, мякотью ананаса и мятой, а другой с водой, мякотью ананаса, мятой и сахаром. Все с тем же штрих-кодом. Я делаю запрос, чтобы выбрать только сок сделать с необязательными ингредиентами, в данном случае воды и ананасовой целлюлозы.

SELECT * 
FROM juices 
INNER JOIN juice_ingredients ON (juice_ingredients.juice_id = juices.id) 
INNER JOIN ingredients ON (juice_ingredients.ingredient_id = ingredients.id) 
WHERE juices.barcode = '000000000001' AND ingredients.optional = false 

Но он возвращал несколько строк. Что должно изменить этот запрос, чтобы привести только один или сок, не содержащий никаких дополнительных ингредиентов в композиции?

+0

вы пробовали 'DISTINCT', т. е. как' SELECT DISTINCT ..... ' –

+0

Чтобы сделать его более понятным и понятным: вы хотите видеть строки« соков », на которые не ссылается« сок_индивидуальный »(вы на самом деле хотите только см. те, которые имеют данный штрих-код, и вы ожидаете, что будете только одним из этих ки без обозначения даты Но согласен ли я с моим упрощением? Если да, опубликуйте полные определения 'juices' и' juice_ingredients'.) –

ответ

1

Поскольку вы не указали, какую базу данных вы используете, вы, возможно, придется настроить SQL для конкретной базы данных:

select * 
    from juices j 
where j.barcode = '000000000001' 
    and not exists (select * 
        from juice_ingredients ji 
        inner join ingredients i 
         on (i.ingredient_id = ji.ingredient_id 
         and i.optional = true) 
        where ji.juice_id = j.juice_id) 
+0

Извините. Я использую Postgres. Я обновлю сообщение. – rplaurindo

+0

Я адаптировал вас к Postgres, и это сработало. '' '... on (i.id = ji.ingredient_id ...) где ji.juice_id = j.id)' '' – rplaurindo

2

Вы можете сделать это с помощью пункта having:

SELECT juices.* 
FROM juices 
JOIN juice_ingredients ON juice_ingredients.juice_id = juices.id 
JOIN ingredients ON juice_ingredients.ingredient_id = ingredients.id 
WHERE juices.barcode = '000000000001' 
GROUP BY 1, 2 
HAVING MAX(ingredients.optional::text) = 'false' 
+0

Спасибо, но с PostgresSQL не получилось. – rplaurindo

+0

@RafaelLaurindo, в чем была ошибка? Вывод? – Bohemian

+0

Bohemin, это была возвращенная ошибка: '' 'ERROR: функция min (boolean) не существует ЛИНИЯ 7: ИМЕЕТ МИН (ингредиенты.необязательно) = true ^ СОВЕТ: Никакая функция не соответствует данным имени и типам аргументов. Возможно, вам придется добавлять явные типы. ********** Ошибка ********** ОШИБКА: функция min (boolean) не существует Состояние SQL: 42883 Подсказка: никакая функция не соответствует заданному имени и аргументу типы. Возможно, вам придется добавлять явные типы. Персонаж: 226''' – rplaurindo

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