我有一些不同类型订单的表格
表格顺序
idA - int,idCustomer - int,propertieA1 - string,propertieA2 - int ...
表格订单B
idB - int,idCustomer - int,propertieB1 - real,propertieB2 - int ...
表格顺序
idC - int,idCustomer - int,propertieC1 - string,propertieC2 - string ...
和一个cutomers表
表客户
idCustomer - int,name string,address - string ...
现在我想选择特定客户的所有订单。我该怎么做? 我想做一个像这样的选择:
SELECT * FROM customer
INNER JOIN orderA ON orderA.idCustomer = customer.idCustomer
INNER JOIN orderB ON orderB.idCustomer = customer.idCustomer
INNER JOIN orderC ON orderC.idCustomer = customer.idCustomer
WHERE customer.idCustomer = 235
但它给了我所有的" orderA"与第一个" oredrB",再一次所有" orderA"使用第二个" orderB"等等。
所以如果他有100个orderA,100个orderB和100个orderC - 结果是100 * 100 * 100行 - 300个订单的100万行!
我该如何解决? (如果必要的话,我可以改变表的结构)
由于
答案 0 :(得分:0)
如果可以更改表格的结构。 。 。然后去做!将所有订单放入一个表中,即使您有NULL
列,因为这些值不适用。
如果您想要一张表中的所有订单,那么您需要仔细选择列,然后使用union all
。一般结构是:
SELECT *
FROM customer c INNER JOIN
((SELECT idCustomer, col1, col2, . . .
FROM orderA
) UNION ALL
(SELECT idCustomer, col1, col2, . . .
FROM orderB
) UNION ALL
(SELECT idCustomer, col1, col2, . . .
FROM orderC
)
) o
ON o.idCustomer = c.idCustomer
WHERE c.idCustomer = 235;
您需要确定所需的列,并确保每个子查询都有一个列值(即使值为NULL
)。