2015-08-19 3 views
0

В настоящее время у меня есть таблица items, которая содержит столбец id. У меня также есть таблица stores, которая также содержит столбец id. Наконец, у меня есть таблица соединений store_items, которая содержит item_id и store_id внешних ключей. Эта таблица объединяет элементы в магазины, в которые они доступны.Создание/рефакторинг sql-запроса

Мне нужен способ получить: либо элемент по id, либо переменная itemId имеет значение null, чтобы получить все элементы, доступные в магазине, и если переменная storeId имеет значение null, чтобы получить все элементы.

В настоящее время у меня есть это, что полная неразбериха:

SELECT DISTINCT i.id 
FROM items AS i JOIN store_items AS si ON ITEMVAR IS NULL 
    AND (
     (STOREVAR IS NULL OR si.store_id = STOREVAR) 
      AND i.id = si.item_id 
     ) 
    OR i.id = ITEMVAR; 

Это лучше практика, чтобы просто отделить различные запросы, или есть способ восстановить фактор это?

+0

Отдельных запросы. Их смятие заслоняет намерение и ничего не добавляет. – Dmitri

+0

Кстати, каково желаемое поведение, если запрос имеет как 'item_id', так и' store_id', но этот элемент недоступен в этом магазине? – Dmitri

+0

@Dmitri В идеале, чтобы вернуть пустой массив, чтобы было легко проверить, существует ли элемент в хранилище – PaulOlteanu

ответ

0

Я думаю, что лучший подход состоит в использовании EXISTS, если вы хотите все это в одном запросе:

SELECT i.id 
FROM items i 
WHERE i.id = ITEMVAR or 
     (ITEMVAR IS NULL AND 
     EXISTS (SELECT 1 FROM store_items si WHERE si.store_id = STOREVAR) 
    ) or 
     STOREVAR IS NULL;