2016-11-16 2 views
2

У меня есть две таблицы, имеющие следующие структуры Таблица AКак оптимизировать SQL запрос, используя соединение между несколькими таблицами

itemId categoryId  orderDate 
========================================== 
    1   23   2016-11-08 
    1   23   2016-11-12 
    1   23   2016-11-16 

Таблица B имеют структуру

categoryId stock  price 
========================================== 

    23   500  600 

Однако шахта желаемый выходной должен быть как Результат C

price   stock    orderdate        qty 
    600   500    2016-11-08 (first order date)   3 (3 time appearance in first table) 

Вот что я пытался до сих пор

select b.price,b.stock from B b, A a 
where b.categoryId = (
    select a.categoryId 
    from A 
    GROUP BY categoryId 
    HAVING COUNT(categoryId)>1 
    ) 
and (a.orderdate = (
    select MIN(orderdate) 
    from A 
    where categoryId = b.categoryId) 
) 

я следующий результат

price   stock    orderdate        
600   500    2016-11-08  

я понятия не имею, как найти qty как он появился 3 раза в первой таблице ,

ответ

0

Вы также должны выбрать COUNT (*)

1

Я думаю, что вы хотите записи в таблице сгруппированных по идентификатору и идентификатор категории, поэтому включать эти два в вашей группе по заявлению. Затем другие столбцы, которые вы должны заполнить, используя MIN, MAX, AVG, SUM и т. Д. Я использую MIN, который даст вам наименьшее число в группе для этого конкретного столбца, хотя в данном случае не имеет значения, используете ли вы MIN или MAX или AVG - все равно. Затем COUNT (*) будет просто подсчитывать количество повторений в группе.

Кроме того, соединения, как правило, предпочтительнее перечислить таблицы запятыми.

SELECT a.itemid, a.categoryid, MIN(b.price), MIN(b.stock), min(a.orderdate), count(*) as qty 
FROM a 
INNER JOIN b ON a.categoryid = b.categoryid 
GROUP BY a.itemid, a.categoryid 
0

как об использовании следующих SQL

select min(price), min(stock), min(orderDate), COUNT(categoryId) 
from A,B where A.categoryId = B.categoryId 
GROUP by A.categoryId 
0

Вы можете создать представления для ваших подзапросов и дать им осмысленные имена, например, CategoriesUsedInMultipleOrders, MostRecentOrderByCategory. Это «оптимизирует» ваш запрос, абстрагируя сложность и облегчая понимание читателем.

0

Это запрос с помощью соответствующего метода присоединиться see Result:

SELECT B.price, B.stock, MIN(A.orderDate) AS orderdate, COUNT(*) AS qty 
FROM TableA A, TableB B 
WHERE A.categoryId = B.CategoryId 
GROUP BY A.categoryId, B.price, B.stock 
Смежные вопросы