SQL: ошибка запроса UNION при объединении двух таблиц - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть 2 набора данных, Products и OrderDetails (набор данных Northwind)

Набор данных Products

ProductID   ProductName SupplierID  CategoryID  QuantityPerUnit     UnitPrice   UnitsInStock 
1               Chai        1              1     10 boxes x 20 bags   18.00             39         
2                Chang      1              1     24 - 12 oz bottles   19.00             17        
3              Aniseed      1              2     12 - 550 ml          10.00             13         
4            Seasoning      2              2     48 - 6 oz jars       22.00             53  
5             Gumbo Mix     2              2     36 boxes             21.35              0  

Детали данных заказа

ProductID   UnitPrice   OrderID Quantity    Discount
1             18.00     10248   10            0
42              9.80    10248   10            0
72             34.80    10248   5             0
1              18.00    10249   10            0
51             42.40    10249   40            0   and so on
1              18.00    10270   12            0

Запрос

SELECT ProductName, Count([Order Details].OrderID)
FROM ([Order Details] UNION Products ON [Order Details].OrderID = Products.OrderID)
WHERE [Order Details].Quantity = 10
GROUP BY ProductName

Ожидаемый результат

Product Name (from Products dataset)    How many OrderIDs had this product where quantity = 10
Chai                                     2

Здесь, поскольку 2 идентификатора заказа имели Chai, 10248 и 10249 где количество = 10, мы рассмотрели только эти случаи. Но я получаю ошибку в запросе ''

Incorrect syntax near the keyword 'UNION'.

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Вы, кажется, хотите JOIN, а не UNION. Однако для этого набора данных я бы go для коррелированного подзапроса:

select
    p.*,
    (
        select count(*) 
        from orderDetails od 
        where od.productID = p.productID and od.quantity = 10
    ) no_orders
from products p

Преимущество этого подхода состоит в том, что:

  • он избегает внешней агрегации

  • вы получаете результаты также для продуктов, у которых нет совпадающих заказов (они бы получили число 0)

  • подзапрос в любом случае выполняется только один раз для каждого продукта, поэтому по сравнению с подходом join штраф отсутствует; Я ожидаю, что это будет работать одинаково хорошо или лучше, если принять индекс orderDetails(productID, quantity)

1 голос
/ 23 апреля 2020
Select p.ProductName , count(o.ProductID) from dbo.Products p
join dbo.Orders o
on p.ProductID = o.ProductID where o.Quantity = '10'
group by o.ProductID, p.ProductName

Надеюсь, это поможет.

1 голос
/ 23 апреля 2020

Попробуйте следующее.

select
    productName,
    count(*) as total_orders
from products p
join order o
on p.productId = o.productId
where Quantity = 10
group by
    productName
...