2016-12-01 2 views
0

Я пытаюсь понять SELECT IN лучше. Будет ли это действительным запросом?SQL SELECT IN возвращает два атрибута

SELECT name 
FROM products 
WHERE product_id IN 
(SELECT product_id, SUM(unit_price) 
FROM sales 
GROUP BY product_id 
HAVING (SUM(unit_price) > 200)); 
+0

выбросит ошибку 'Только одно выражение можно указать в списке выбора, когда подзапрос не вводится с EXISTS.' –

ответ

1

Нет, по той же причине это не было бы допустимым предикатом:

WHERE product_id = (1234, 16) 

Это не имеет смысла сравнивать, что один скаляр равен кортеже.

Обратите внимание, что SQL действительно позволяет Вам сравнить кортеж кортежа:

WHERE (product_id, 16) = (1234, 16) 

Но число элементов в обоих наборах должны быть одинаковыми.

А также вы можете сравнить кортеж подзапроса, который возвращает кортеж:

WHERE (product_id, 16) IN (SELECT product_id, SUM(unit_price) FROM ... 

Пока оба кортежи имеют одинаковое число элементов.

0

Select внутри In не может иметь 2 колонки. Это вызовет ошибку. Но так как вы ищете продукт Ids вам не нужно SUM(Unit_Price) во всяком случае, ниже запрос должен работать нормально:

SELECT name FROM products WHERE product_id IN (SELECT product_id FROM sales GROUP BY product_id HAVING (SUM(unit_price) > 200)); 

Вы можете использовать внутреннее соединение, а если вы хотите, чтобы избежать IN части.

+0

Это зависит от базы данных. Некоторые, конечно, позволяют использовать несколько столбцов, если счетчик с обеих сторон 'in' одинаковый. i.e '(column1, column2) in (select column3, column4 from some_table)'. – Allan

+0

Привет, Шрихари, спасибо вам за помощь! Я хотел бы задать следующий вопрос для вашего запроса. Я немного смущен, потому что мне повезло, что если я включаю предложение HAVING, тогда формат SELECT должен быть следующим: SELECT column_name, aggregate_function (имя_столбца) FROM table_name WHERE Значение столбца_источника GROUP BY column_name HAVING aggregate_function (column_name) значение оператора; –

+0

Да, Hope Ashcraft, вы можете работать без агрегатной функции в предложении select (по крайней мере, в oracle) –

0

Вы можете использовать общие таблицы Выражения (КТР), чтобы добиться того, что

;WITH CTE(ProductId, UnitPrice) 
AS(
SELECT product_id, SUM(unit_price) 
FROM sales 
GROUP BY product_id 
HAVING (SUM(unit_price) > 200)) 

SELECT [Name], c.UnitPrice 
FROM Products p INNER JOIN CTE c on p.Product_Id = c.ProductId