2016-07-11 8 views
0

Как описано в названии, у меня есть запрос, который работает отлично, но я хотел бы добавить дополнительный столбец из таблицу в подзапросе, которая в настоящее время дает мне ошибку ниже:Добавление дополнительного столбца в подзапрос дает ошибку, запрашивающую использовать «EXISTS» для подзапросов с более чем одним полем

«Вы написали подзапрос, который может возвращать более одного поля без использования зарезервированного слова EXISTS в предложении FROM основного запроса. Пересмотрите инструкцию SELECT подзапрос запрашивает только одно поле. "

Можно ли ввести более одного столбца в подзапрос? Или это было бы лучше сделано с присоединением? Мой текущий код ниже:

SELECT S.Prod, S.Date, (SELECT Price, 
      FROM [Products] P 
      WHERE P.[Prod1] = S.[Prod] 
      AND P.[Date to use] = (SELECT MIN(P2.[Date to use]) 
         FROM [Products] P2 
         WHERE P2.[Prod1] = P.[Prod1] 
         AND P2.[Date to use] > S.[Date])) AS Price 
FROM [Sales] AS S; 

Я хотел бы принести в поле под названием «Стоимость», ниже мой неверный код, который возвращает ошибку:

SELECT S.Prod, S.Date, (SELECT Price, Cost 
      FROM [Products] P 
      WHERE P.[Prod1] = S.[Prod] 
      AND P.[Date to use] = (SELECT MIN(P2.[Date to use]) 
         FROM [Products] P2 
         WHERE P2.[Prod1] = P.[Prod1] 
         AND P2.[Date to use] > S.[Date])) AS Price 
FROM [Sales] AS S; 

Пожалуйста, может кто-то показать мне, как Я бы сделал это? Ура!

+0

Любая причина, почему вы не используете объединения на 'Sales' и' 'продуктов в главном запросе и имеющий' мин ([дата использования]) 'как суб-запрос? – Verma

+0

Не особенно. Казалось, что это работает. Я буду работать над созданием соединения для подзапроса. Предложения приветствуются! Cheers – thatguy

ответ

1

Вы могли бы начать с этого ...

SELECT S.Prod, S.Date, P.Price, P.Cost 
FROM [Sales] S, [Products] P 
WHERE P.[Prod1] = S.[Prod] 
AND P.[Date to use] = (SELECT MIN(P2.[Date to use]) 
         FROM [Products] P2 
         WHERE P2.[Prod1] = S.[Prod] 
         AND P2.[Date to use] > S.[Date]); 
+0

Это похоже на то, что мне нужно. Я никогда не создавал объединения, используя этот метод, мне всегда приходилось записывать «INNER JOIN ....» и т. Д. Есть ли разница между соединением, которое вы показали выше, по сравнению с традиционным, которое вы делаете в виде таблицы? Большое спасибо – thatguy

+0

никакой реальной разницы кроме удобочитаемости. См. ... http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – Verma

+0

Один вопрос: есть ли способ ускорить этот запрос? Использование метода join существенно повлияло на производительность запроса. Все необходимые столбцы уже индексированы, но метод join занимает примерно 5-10x больше. – thatguy