SQL UNION查询到另一个表来选择数据
问题描述:
我有以下查询....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
答
根据不同的使用情况下,以所需要的表的语句需要进行以下调整,但只是为了让您的车轮转动。 ..这里是一个例子。
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
答
这里是一个替代的解决方案,如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;
这将完成的是显示从tblReferences
的Name
如果有的话,否则它会显示从tblProductSeller
的Name
。您可以根据您的要求重新排序。您也不妨加一个谓词像
WHERE t4.ID IS NOT NULL OR t6.ID IS NOT NULL
这将避免在有两个tblReferences
和tblProductSeller
匹配的情况返回多个行。
如果我可以提供更多的信息,请让我知道。 – BobSki
显示在同一列意味着什么?拼接它?你可以做'(t4.Name +''+ t6。SellerName)作为[产品供应商]' – Mihai
@mihil不连接。在tblProducts中,我为产品供应商保存了整数(ID)。我试图从tblReferences和tblProductSeller中选择Contact Provider TEXT。由于某些产品供应商位于tblProductSeller中,因此并非所有ID都可以在tblReferences中引用,所以我需要它为实际的TEXT值而不是ID引用这两个值。 – BobSki