使用SQL从多个表中获取主键数据

时间:2014-01-12 14:38:47

标签: c# mysql sql sql-server

我想用名为ProductIDCategoryIDVendorID的列中的数据填充组合框。

我试图用三种不同的功能填充组合框。但我想知道,有没有其他方法来填充这些组合框只有一个查询来获取数据。

基本上我需要一个查询来从表ProductsCategoriesVendors中获取这些记录。

表包含数据

VendorID
   1
   2

ProductID
   1
   2

CategoryID
   1

我已尝试过此查询,但结果并非如此。

 String query = "Select C.CategoryID,V.VendorID,P.ProductID From Categories C,Vendors V,Products P";

此查询的结果是

CategoryID   VendorID   ProductID
   1            1           1
   1            1           2
   1            2           1
   1            2           2

我需要查询结果看起来像这个

  CategoryID   VendorID   ProductID
       1            1           1
                    2           2

2 个答案:

答案 0 :(得分:1)

对于您的查询,它恰好是Cartesian JOIN。听起来您尝试从3个不同的表中获取数据,而不是彼此相关。因此,让我们定义我们作为字符串查询的表,并为所有三个查询定义UNION ALL,以便您可以在客户端,C#或Java中过滤它!

Select 'Categories' as data_type , C.CategoryID From Categories C
UNION ALL
Select 'Vendors' as data_type , V.VendorID  FROM Vendors V
UNION ALL
Select 'Products' as data_type , P.ProductID From Products P

答案 1 :(得分:1)

因此,您希望通过一次数据库调用获得3个不相关的查询。

有几种方法可以做到这一点,一种是多个记录集(例如stored procedure,其中包含3个单独的SELECT语句),另一种方法是使用UNION和添加一列以指定项目的类型或表名称。为了将正确类型的项目放入正确的组合框,您需要使用此附加列。

我将专注于UNION方法。 UNION语句允许将多个查询组合成一组结果数据行。

为了便于说明,我将假设除了ID之外,您可能还想提取姓名。

您的查询将如下所示:

Select
    ProductID As ID,
    ProductName As ItemName,
    'Products' As ItemType
    From Products

Union All

Select
    VendorID As ID,
    VendorName As ItemName,
    'Vendors' As ItemType
    From Vendors

Union All

Select
    CategoryID As ID,
    CategoryName As ItemName,
    'Categories' As ItemType
    From Categories

结果如下:

ID  |  ItemName  |  ItemType
-----------------------------
1   |  Pencil    |  Products 
1   |  Pens, Inc |  Vendors 
2   |  Acme123   |  Vendors
1   |  Writing   |  Categories 
2   |  Editing   |  Categories

然后,你需要循环遍历结果并使用switch语句来决定哪个组合框根据其ItemType添加哪个项目,或者使用LINQ .Where()语句3次,每个组合框一个,取决于你如何提取数据。我不会为你写出这一切,但我认为这足以让你前进。

请注意,UNION语句在每个单独的查询中需要相同数量和类型的SELECT字段才能执行。