Вытащить 2 независимых запроса, а затем объединить в один подзапрос в SQL Server - PullRequest
0 голосов
/ 02 декабря 2018

[введите описание изображения здесь] пример набора данных введите описание изображения здесь

2 У меня вопрос к постановке 2 независимых запросов.Во-первых, мне нужно вытащить продукты, которые содержатся во всех магазинах.Второй запрос - собрать все продукты и перечислить доступные размеры.Сделав 2 запроса, я могу объединить их в один подзапрос.Я использую SQL Server.

Итак, я получил первую часть, в которой я смог получить идентификатор продукта, доступный во всех магазинах.Это только выводит идентификатор продукта, моя стратегия заключалась в том, чтобы затем иметь внешний запрос для их оценки и объединить его с таблицей размеров.

SELECT product_id
FROM Sells
GROUP BY product_id
HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location);

Я сейчас пытаюсь получить второй запрос для размеров,Кто-нибудь может указать на то, что мне не хватает?Я получаю сообщение об ошибке: available_in.ID продукта не может быть привязан.

enter image description here

Я добавил ERD для уточнения таблиц.Я предполагаю, что мне нужно объединить таблицы между Product к Available_in и присоединить available_in к Sizes.Я пытаюсь вывести имя, параметр размера, product_id

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я бы просто JOIN их вместе.Научитесь использовать правильный, явный синтаксис standard JOIN. Никогда не используйте запятые в предложении FROM.

select s.size_option, ai.product_id, p.product_name
from Sizes s join
     available_in ai
     on ai.sizes_id = s.sizes_id join
     Product p
     on p.product_id = ai.product_id join
     (select se.product_id
      from sells se
      group by se.product_id
      having count(se.store_location_id) = (select count(*) from store_location
     ) se
     on se.product_id = p.product_id;

Вы заметите, что это также включает псевдонимы таблиц, которые облегчают написание и чтение запроса.

0 голосов
/ 02 декабря 2018

Исходя из вопроса, вы хотите знать, как объединить два запроса ?

Я внес пару изменений в ваш второй запрос в список таблиц (Sizes, Available_in(Продает), я удалил «Available_in, Продает», потому что они представляют перекрестное соединение, когда помещены туда.

Я также держался подальше от интерпретации запросов, не зная фактического контекста таблиц.Однако для ясности запрос запрашивает:

Список уникальных идентификаторов товаров, в которых количество магазинов, в которых продается продукт, совпадает с количеством магазинов в таблице местоположений магазинов, где находится продукт.продается во всех магазинах.

SELECT size_option, available_in.product_id, product.product_name
FROM Sizes
JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
JOIN Product ON Product.product_id = Available_in.product_id

Существует несколько способов сделать это, в зависимости от используемой версии SQL Server. Общие выражения таблиц (CTE) были представлены в SQL Server 2005.Ниже приведены два примера.

SQL Server до 2005 г.

SELECT size_option, available_in.product_id, product.product_name
FROM Sizes
JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
JOIN Product ON Product.product_id = Available_in.product_id

WHERE product.product_id in (
   SELECT product_id
   FROM Sells
   GROUP BY product_id
   HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location)

)

SQL Server 2005 и выше

WITH ProductIDList as (
   SELECT product_id
   FROM Sells
   GROUP BY product_id
   HAVING COUNT(store_location_id) = (SELECT COUNT(*) FROM store_location)

)
, ProductInfo as (
   SELECT size_option, available_in.product_id, product.product_name
   FROM Sizes
   JOIN available_in ON Available_in.sizes_id = Sizes.sizes_id
   JOIN Product ON Product.product_id = Available_in.product_id

)
SELECT *
FROM ProductInfo 
JOIN ProductIDList ON ProductInfo.product_id = ProductIDList.product_id
...