2016-11-08 73 views
1

我有以下查询....SQL UNION查询到另一个表来选择数据

SELECT t1.ProductID, t2.Name as [Product Type], t3.Name as [Product Category], 
t4.Name as [Product Provider] 
From tblProducts t1 
Inner Join tblReferences t2 on t1.ProductType = t2.ID 
Inner Join tblReferences t3 on t1.ProductCategory = t3.ID 
Inner Join tblReferences t4 on t1.ProductProvider = t4.ID 

我知道这是不是最漂亮的查询,但它的工作,而且很可能不会编辑完成后进行编辑。现在我试图做一个内部联接与另一个表,这里是问题来...

所以我想从另一个表(tblProductSeller),但我需要它来显示作为[产品供应]

所以在前面的SELECT语句添加...

 SELECT t1.ProductID, t2.Name as [Product Type], t3.Name as [Product Category], 
t4.Name as [Product Provider], 

t6.SellerName as [Product Provider] <---new line - 

然而,这显示它作为一个新的专栏,我想在同一列中显示它作为

t4.Name as [Product Provider] 

在我试图查询的其余部分是

Inner Join tblReferences t2 on t1.ProductType = t2.ID 
Inner Join tblReferences t3 on t1.ProductCategory = t3.ID 
Inner Join tblReferences t4 on t1.ProductProvider = t4.ID 
Inner Join tblProductSeller t6 on t1.ProductProvider = t6.ID 

是一样的东西,即使是可能的 - 我要做一个UNION?

编辑。为了保持简短,我会放弃大部分字段,但我遇到问题的例外情况除外。

TblProducts 
ProductID   ProviderID   
17     16 
18     20 
19     24 

tblReferences 
ID     Name 
16     Microsoft 
20     ADP 

tblProductSeller 
ID     ProductProvider 
24     Apple 

TblReferences有一些标准的卖家的名字,但是,我需要能够引用tblProductSeller,因为供应商的很多将在那里加入。基本上这是他们将被添加的地方。我所有的数据都存储在tblProducts中。

我的整个目标是能够填充DataGridView,但是,没有任何ID,而是能够引用tblReferences和tblProductSeller。

所以我最终的结果会是什么样子

ProductID  Contact Provider 
16    Microsoft 
20    ADP 
24    Apple 
+0

如果我可以提供更多的信息,请让我知道。 – BobSki

+1

显示在同一列意味着什么?拼接它?你可以做'(t4.Name +''+ t6。SellerName)作为[产品供应商]' – Mihai

+0

@mihil不连接。在tblProducts中,我为产品供应商保存了整数(ID)。我试图从tblReferences和tblProductSeller中选择Contact Provider TEXT。由于某些产品供应商位于tblProductSeller中,因此并非所有ID都可以在tblReferences中引用,所以我需要它为实际的TEXT值而不是ID引用这两个值。 – BobSki

回答

2

根据不同的使用情况下,以所需要的表的语句需要进行以下调整,但只是为了让您的车轮转动。 ..这里是一个例子。

SELECT t1.ProductID, 
      t2.Name as [Product Type], 
      t3.Name as [Product Category], 
      t4.Name as [Product Provider] 
    From tblProducts t1 
    Inner Join tblReferences t2 
    on t1.ProductType = t2.ID 
    Inner Join tblReferences t3 
    on t1.ProductCategory = t3.ID 
    Inner Join tblReferences t4 
    on t1.ProductProvider = t4.ID 
UNION 
    Select t1.ProductID, 
      t2.Name as [Product Type], 
      t3.Name as [Product Category], 
      t6.Name as [Product Provider] 
    From tblProducts t1 
    Inner Join tblReferences t2 
    on t1.ProductType = t2.ID 
    Inner Join tblReferences t3 
    on t1.ProductCategory = t3.ID 
    Inner Join tblProductSeller t6 
    on t1.ProductProvider = t6.ID 
+0

做这项工作。谢谢你,先生! – BobSki

+1

没问题,很高兴我能帮到你。 –

+1

看起来像一个'LEFT JOIN'和'COALESCE()'会容易得多......当然,如果当't4.Name'不同于't6.SellerName'时需要额外的一行,那么'UNION'就是可能是要走的路。 – ebyrob

1

这里是一个替代的解决方案,如ebyrob描述:

SELECT t1.ProductID, 
     t2.Name as [Product Type], 
     t3.Name as [Product Category], 
     IsNull(t4.Name, t6.Name) as [Product Provider] 
From tblProducts t1 
Inner Join tblReferences t2 on t1.ProductType = t2.ID 
Inner Join tblReferences t3 on t1.ProductCategory = t3.ID 
LEFT Join tblReferences t4 on t1.ProductProvider = t4.ID 
LEFT Join tblProductSeller t6 on t1.ProductProvider = t6.ID; 

这将完成的是显示从tblReferencesName如果有的话,否则它会显示从tblProductSellerName。您可以根据您的要求重新排序。您也不妨加一个谓词像

WHERE t4.ID IS NOT NULL OR t6.ID IS NOT NULL

这将避免在有两个tblReferencestblProductSeller匹配的情况返回多个行。

+0

这就是我遇到的问题。某些ID都在tblReferences和tblProductSeller中。现在对于其中一些人,我需要从tblReferences和tblProductSeller中提取一些。 – BobSki

+0

你怎么知道你需要从每张桌子上得到哪一张? @Bobski – mendosi

+0

我有点解决了问题,将tblProductSeller中的ID更改为一个不同的数字,所以当我将它保存并在我的查询中引用tblReference时,它没有找到它 – BobSki