Объединять таблицы только при соблюдении определенных условий - PullRequest
2 голосов
/ 16 марта 2011

Я пытаюсь написать запрос SQLite, который выполняет JOIN, только если выполняется определенное условие (items.super = 1). Я знаю, что мог бы написать некоторый код в своем приложении, чтобы выяснить, имеет ли super == 1, и затем выполнить правильный запрос, но я бы предпочел, чтобы только один запрос работал в обоих случаях - будь то super или 0 или 1.

SELECT i2.id, i2.name
FROM items i
JOIN items i2 ON i.subcategory_id = i2.subcategory_id AND i.super = 1
WHERE i.id = ?

Выше я пытался добавить второе условие в мое предложение JOIN, но оно не работает, когда i.super == 0. Должен ли я решить эту проблему с помощью чего-то дурацкого, например, двух левых соединений и функции coalesce ()?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 16 марта 2011

Вот так я читаю вопрос.

Если вы хотите показать запись из элементов, фильтр WHERE применяется к элементу.
Однако в случае, когда текущий элемент супер = 1, вы хотите показать все элементы одного брата вместо одной подкатегории.

В этом случае вы можете использовать этот запрос

SELECT i2.id, i2.name
FROM items i
INNER JOIN items i2 ON
    (i.super = 0 and i2.id = i.id)
    OR
    (i.super = 1 and i.subcategory_id = i2.subcategory_id)
WHERE i.id = ?
1 голос
/ 16 марта 2011

Не уверен, правильно ли я понимаю, что вы хотите.

SELECT i2.id, i2.name
  FROM items i
    JOIN items i2 
      ON i.subcategory_id = i2.subcategory_id 
        AND (i.super = 1 OR i.super = 0)
;
0 голосов
/ 16 марта 2011

Я со всеми, кто не уверен, что они понимают вопрос, но так как вы спрашиваете о coalesce (), я думаю, что одного левого соединения будет достаточно:одна процедура

SELECT i.id, i.name, i.super, i2.id, i2.name
FROM items i
LEFT JOIN items i2 ON i.subcategory_id = i2.subcategory_id AND i.super = 1
WHERE i.id = ?

И пусть ваше приложение решает, какие столбцы использовать после выполнения запроса, а не раньше.

0 голосов
/ 16 марта 2011

Не то, что вы после:

SELECT i2.id, i2.name
FROM items i
JOIN items i2 ON (i.subcategory_id = i2.subcategory_id AND (i.super = 1 OR i.super = 0))
WHERE i.id = ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...