Настройка MSSQL-запросов

У меня есть следующий сценарий:

1 Клиент имеет 2 списка товаров (один общий, один частный), в этих списках много продуктов, некоторые продукты могут появиться в двух списках. Если продукт появится в личном списке, я хочу получить его, в противном случае я возьму тот, что в общем списке.

Какой самый быстрый способ достичь этого, по вашему мнению? До сих пор я пробовал следующее:

  • СОЮЗ ВСЕХ затем удалите дубликаты в PHP (посредственные выступления)
  • UNION (плохие показатели)

Есть ли другие возможности для достижения этой цели?

РЕДАКТИРОВАТЬ

Вот скрипка, демонстрирующая, что у меня есть http://sqlfiddle.com/#!6/41d2e/2

В скрипте я предполагаю, что идентификаторы списка 7 и 1 являются идентификаторами списка для клиента 1, я не использовал объединение, так как у меня уже есть идентификатор, полученный из php.

Что мне нужно, это получить продукт из личного списка, если существует, в противном случае из публичного

Будучи в большей степени mysql-парнем, я обычно делал бы это с группой без агрегатов, так что при правильном порядке mysql просто обрезал нежелательные записи (плохая практика, но достаточно надежная и производительная):

select *
from pricelist
where listId in (1, 7)
order by listId asc
group by artnum

Так, например, если я хочу получить все продукты для клиента с идентификатором 1, мне нужно получить следующие данные:

ID  ARTNUM  ARTDES  LISTID  PRICE
1   1000    potatoes    1   20
1   1001    carrots     7   4

Поскольку у клиента 1 есть 2 списка: 1 и 7 (картофель появляется в списках 1 и 7, поэтому я просто хочу, чтобы картофель был в личном списке клиента, а не в публичном)

Надеюсь, я достаточно ясен, извините за все эти правки

-1

Решение

Поскольку я не мог понять, как сделать это правильно в чистом SQL, я использовал метод PHP:

  • Получить два запроса без UNION / UNION ALL
  • Создать 2 коллекции php
  • Объедините 2 коллекции, удалив дубликаты
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]