2013-12-02 6 views
0

я 2 таблицы: 1. Материал с полями: materialcode, materialname, materialgroup 2. ProductionOrder с полями: materialcode, кол-во, ORDERDATE Я хочу, чтобы получить и группу по materialgroup. Таким образом, я использую следующий запрос:SQL Server LEFT JOIN

SELECT Material.materialgroup, ProductionOrder.qty 
FROM ProductionOrder LEFT OUTER JOIN Material 
ON ProductionOrder.materialcode=Material.materialcode 
WHERE ProductionOrder.orderdate='2013-11-30' 
GROUP BY Material.materialgroup 
ORDER BY Material.materialgroup 

Но результат неправильный. Он принимает все materialcode с группой materialgroup null. Примечание: есть некоторые материалы в ProductionOrder, не имеют материальной группы в таблице Material. Результат, иногда правильный, иногда нет.

Любая помощь. Спасибо.

LVD

+1

И каков был бы «правильный» результат? –

+0

Это то, что означает внешнее соединение. Возможно, вам понадобилось внутреннее соединение –

+0

в качестве побочного примечания, что это не сработает на SQL-сервере (который был тегом), потому что ProductionOrder.qty не является частью групповой или агрегатной функции. (Может быть, это действительно MySQL?) –

ответ

0

Он должен работать, если вы используете ЛЕВЫЙ INNER JOIN или просто JOIN.

+0

Каким будет выход «LEFT INNER JOIN»? –

+0

Нет такой вещи, как LEFT * INNER * JOIN –

+0

С внутренним соединением вы получили все результаты, соответствующие команде ON. Таким образом, вы получили все Заказы, которые получили набор материалов, который имеет запись в Materialtable. – SkaiBoa

0

LEFT JOIN Даст вам все строки из ProductionOrder и соответствующие строки из материала

SELECT Material.materialgroup, ProductionOrder.qty 
FROM ProductionOrder LEFT OUTER JOIN Material 
ON ProductionOrder.materialcode=Material.materialcode 
WHERE ProductionOrder.orderdate='2013-11-30' 
GROUP BY Material.materialgroup 
ORDER BY Material.materialgroup 

Чтобы получить только совпадающие строки из оба таблицы попробовать это с INNER JOIN

SELECT Material.materialgroup, ProductionOrder.qty 
FROM ProductionOrder INNER JOIN Material 
ON ProductionOrder.materialcode=Material.materialcode 
WHERE ProductionOrder.orderdate='2013-11-30' 
GROUP BY Material.materialgroup 
ORDER BY Material.materialgroup 

Если вы хотите получить все строки из материала и только соответствующие строки из ProductionOrder вы можете использовать RIGHT JOIN следующим образом:

SELECT Material.materialgroup, ProductionOrder.qty 
FROM ProductionOrder RIGHT JOIN Material 
ON ProductionOrder.materialcode=Material.materialcode 
WHERE ProductionOrder.orderdate='2013-11-30' 
GROUP BY Material.materialgroup 
ORDER BY Material.materialgroup