2016-01-19 2 views
1
mtOrder 
------- 
idOrder idCust 
1  123423  
2  324602 

dtOrderBox 
---------- 
idOrder  idBox idItem Quantity usedBox 
1   1  39  2   1 
1   2  34  30  0 
1   3  39  2   1 
2   1  39  10  1 
2   2  24  5   0 

dtOrderDetail 
------------- 
idOrder idBox  idItem Quantity 
1   1   45  10 
1   3   46  10 
2   1   45  15 

Как показано на рисунке выше, 3 табл где соединены idOrder и dtOrderBox и dtOrderDetail также связаны снова idBox. dtOrderBox используется для записи, а также без коробки. dtOrderDetail используется для записи содержимого ящика, который является заказом в dtOrderBox.Присоединение 3 таблицы с более чем 1 относительно

Проблема заключается, когда я пытался присоединиться к этому дереву стола вместе

select * from mtOrder 
Join dtOrderBox on dtOrderBox.idOrder = mtOrder.idOrder 
Join dtOrderDetail on dtOrderDetail.idOrder = mtOrder.idOrder and dtOrderDetail.idBox = dtOrderBox.idBox 

Используя это, результат будет показать весь пункт в dtOrderBox, что с помощью Box. Элемент, который не использует поле (как показано в колонке dtOrderBoxusedBox), не будет отображаться. Спасибо за помощь!

Desired Result 
-------------- 
idOrder idBox idItem Quantity 
1   1  45  20 
1   2  34  30 
1   3  46  20 
2   1  45  150 
2   2  24  5 
+0

Если вы будете использовать левый Присоединяйтесь затем "dtOrderDetail.idOrder = mtOrder.idOrder" это условие не является обязательным. –

+0

@RaviHirani, если я не использую «dtOrderDetail.idOrder = mtOrder.idOrder», тогда результат 'dtOrderDetail' и' dtOrderBox' не будет соответствовать. –

+0

Это также сильно помогло бы, если бы вы показали нам желаемый результат , Помните об этом, когда задаете вопросы о переполнении стека. –

ответ

0

Попробуйте этот запрос: -

SELECT mtOrder.*,dtOrderBox.*,dtOrderDetail.* 
FROM mtOrder 
LEFT JOIN dtOrderBox ON mtOrder.idOrder = dtOrderBox.idOrder 
LEFT JOIN dtOrderDetail ON dtOrderDetail.idBox = dtOrderBox.idBox 
0

Попробуйте использовать левое соединение:

select mtOrder.idOrder, mtOrder.idCust, 
     dtOrderBox.idItem, dtOrderBox.Quantity, dtOrderBox.usedBox, 
     dtOrderDetail.Quantity 
from mtOrder 
Left Join dtOrderBox on dtOrderBox.idOrder = mtOrder.idOrder 
Left Join dtOrderDetail on dtOrderDetail.idOrder = mtOrder.idOrder and dtOrderDetail.idBox = dtOrderBox.idBox 
0

Использование слева присоединяется, чтобы сохранить записи из dtOrderBox таблицы, которые не соответствуют ни к чему.

SELECT m.*, dob.*, dod.* 
FROM mtOrder m 
LEFT JOIN dtOrderBox dob 
    ON dob.idOrder = m.idOrder 
LEFT JOIN dtOrderDetail dod 
    ON dod.idOrder = m.idOrder AND dod.idBox = dob.idBox 
+0

Я пробовал этот метод раньше .. Он не сохраняет записи –

+0

Я верю, что каждый ответ дает использование «LEFT JOIN». Почему это не будет работать для вашего дела? –

+0

Элемент, который не имеет аналогов в 'dtOrderDetail', не хочет отображаться. –

0

Попробуйте это:

SELECT mo.*,dob.*,dod.* 
FROM mtOrder as mo 
LEFT JOIN dtOrderBox as dob ON mo.idOrder = dob.idOrder 
LEFT JOIN dtOrderDetail as dod ON dod.idBox = dob.idBox and dod.idBox = dob.idBox