通过一个选择加入许多表

时间:2015-09-26 22:31:52

标签: sql-server inner-join

我有一些不同类型订单的表格

  • 表格顺序

    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万行!

我该如何解决? (如果必要的话,我可以改变表的结构)

由于

1 个答案:

答案 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)。