SQL:如何使用Union按列筛选

SQL:如何使用Union按列筛选,sql,sql-server,Sql,Sql Server,我对SQl非常陌生,所以我不知道如何在谷歌搜索中构建我的问题。。基本上,我尝试合并两组列。他们有非常相似的信息;集合A是一系列产品,其中包含一列供供应商使用。集合B是一系列没有供应商的产品 我想做的是设置一个过滤器,这样只显示某个供应商的产品,这就是我使用WHERE子句所做的。但是,我想合并集合A和集合B,这样集合B中的值将只在集合A中有产品条目的地方显示和合并 也就是说,为了更好地解释,我希望集合B“查看”集合A。它将看到集合A仅包含来自某个供应商的项目,集合B将删除集合A中不包含来自该供应商

我对SQl非常陌生,所以我不知道如何在谷歌搜索中构建我的问题。。基本上,我尝试合并两组列。他们有非常相似的信息;集合A是一系列产品,其中包含一列供供应商使用。集合B是一系列没有供应商的产品

我想做的是设置一个过滤器,这样只显示某个供应商的产品,这就是我使用WHERE子句所做的。但是,我想合并集合A和集合B,这样集合B中的值将只在集合A中有产品条目的地方显示和合并

也就是说,为了更好地解释,我希望集合B“查看”集合A。它将看到集合A仅包含来自某个供应商的项目,集合B将删除集合A中不包含来自该供应商的项目的项目

有什么想法吗?谢谢,

代码如下:

SELECT ([Transfer_From]
      ,'Transfer_To' = [WAREHOUSE_CODE]
      ,'Product_Number' = [PRODUCT_NUMBER]
      ,'QTY_Trans' = [quantity_received]
      ,'Transfer_Date' = [received_date]

  FROM [fstrkdb_1].[dbo].[Inventry]
  WHERE vendor_number = '1074'

UNION

SELECT [Transfer_From]
        ,[Transfer_To]
      ,[Product_Number]
      ,'QTY_Trans' =[Quantity_Allocated]
      ,[Transfer_Date]

  FROM [fstrkdb_1].[dbo].[InvtransFromWhs]


ORDER BY Transfer_Date

GO
这将生成数据集1。然后使用dataset1中的产品作为dataset2上的过滤器,然后将这两个集合合并在一起

这将生成数据集1。然后使用dataset1中的产品作为dataset2上的过滤器,然后将这两个集合合并在一起。

一种方法是使用WHERE子句中的EXISTS。CTE有助于避免重复第一个查询:

WITH a as (
      SELECT Transfer_From, WAREHOUSE_CODE as Transfer_To, Product_Number,
             quantity_received as QTY_Trans, received_date as Transfer_Date
      FROM [fstrkdb_1].[dbo].[Inventry]
      WHERE vendor_number = '1074'
     )
SELECT a.*
FROM a
UNION ALL
SELECT Transfer_From, Transfer_To, Product_Number, Quantity_Allocated
       Transfer_Date
FROM [fstrkdb_1].[dbo].InvtransFromWhs ifw
WHERE EXISTS (SELECT 1 FROM a WHERE a.Product_Number = ifw.Product_Number)
ORDER BY Transfer_Date;
只有在需要重复项时才需要UNION。查询不应创建意外的重复项。

一种方法是在WHERE子句中使用EXISTS。CTE有助于避免重复第一个查询:

WITH a as (
      SELECT Transfer_From, WAREHOUSE_CODE as Transfer_To, Product_Number,
             quantity_received as QTY_Trans, received_date as Transfer_Date
      FROM [fstrkdb_1].[dbo].[Inventry]
      WHERE vendor_number = '1074'
     )
SELECT a.*
FROM a
UNION ALL
SELECT Transfer_From, Transfer_To, Product_Number, Quantity_Allocated
       Transfer_Date
FROM [fstrkdb_1].[dbo].InvtransFromWhs ifw
WHERE EXISTS (SELECT 1 FROM a WHERE a.Product_Number = ifw.Product_Number)
ORDER BY Transfer_Date;

只有在需要重复项时才需要UNION。查询不应创建意外的重复项。

这是什么RDBMS这看起来是基于[]的SQL Server使用这可能是通过使用联接的公共表表达式实现的。能否给出一些示例数据和预期输出?这是什么RDBMS这看起来是基于[]的SQL Server可以通过使用联接的公共表表达式来使用它。您能给出一些示例数据和预期的输出吗?这在我看来效率很低。据推测,一个产品可能会在DataSet1中重复多次,然后联合会在删除重复项时会产生额外的开销。我希望不同的供应商会有不同的产品编号,但一个现有的联合会可能更有效。但是,对数据的了解还不够确定。是的,在从数据集1UG编号中选择产品编号时使用WHERE A.Product_编号可能更好。我会使用连接或存在。只有当我知道数据集1中的记录总是低于50时,我才会使用。。就个人而言,我也会在CTE上使用临时表,这对我来说效率很低。据推测,一个产品可能会在DataSet1中重复多次,然后联合会在删除重复项时会产生额外的开销。我希望不同的供应商会有不同的产品编号,但一个现有的联合会可能更有效。但是,对数据的了解还不够确定。是的,在从数据集1UG编号中选择产品编号时使用WHERE A.Product_编号可能更好。我会使用连接或存在。只有当我知道数据集1中的记录总是低于50时,我才会使用。。就我个人而言,我也会在CTE上使用临时表