SQL Server:使用Union创建一个包含来自第一个查询

时间:2015-10-13 13:40:38

标签: sql sql-server subquery union

我的SQL非常生疏,以至于我之前没有创建过视图,而且我不完全确定如何做我需要的东西。也许我需要一个存储过程。这是合约。

我们有一个票务历史数据库(购买)。我们希望过滤某个SKU,但我们希望每张具有该SKU的故障单中的所有订单项。对于isntance,有人买了一件衬衫和一顶帽子。我想在衬衫上过滤,找到每个想要一件衬衫的人,但要显示整张票,上面有衬衫和帽子。

我认为我的查询会是这样的,但我认为它不会起作用。

select 
    ticket_id, post_date, qty_sold, total_price, sales_total
from 
    ticket_history 
where 
    sku = 'xxxx'

Union

select 
    sku as trans_sku, qty_sold as trans_qty_sold, desc as trans_desc, total_price as trans_total_price
from 
    ticket_history 
where 
    ticket_id = <the ticket id in first query>

也许需要一个子选择,但我也不太了解如何做到这一点。

任何建议都会很棒。

2 个答案:

答案 0 :(得分:1)

我不确定你在这里尝试做什么以及UNION是否正在寻找。

在您的查询中,列不同,并且两个查询之间不匹配。无论如何,您可以使用Common table Expression以便重用子查询,这可以解决您的问题:

WITH FirstQuery
AS
(
   select
     ticket_id,
     post_date, 
     qty_sold,
     total_price, 
     sales_total
   from ticket_history 
  where sku = 'xxxx'
)
SELECT * 
FROM FirstQuery
UNION
SELECT 
  ... -- You should select the same number of columns
  ... -- and with the same data types to match the first columns
from ticket_history 
where ticket_id IN(SELECT ticket_id FROM FirstQuery);

这里的FirstQuery就像子查询一样,但在这里你可以像我们一样重用它,并在where子句中使用它。

但是,再次在第一个查询中选择的列:

ticket_id,
 post_date, 
 qty_sold,
 total_price, 
 sales_total

与您在第二个查询中选择的列不同:

sku as trans_sku, 
qty_sold as trans_qty_sold, 
desc as trans_desc, 
total_price as trans_total_price

应匹配这些列(它们的数量和数据类型)。否则你会收到错误。

有关UNION的注意事项:

  • 两个查询之间的列数应该相同。
  • 列的名称来自第一个查询。

答案 1 :(得分:0)

执行UNION时,所选列必须在两个选择之间匹配。 (相同数量的列和匹配的数据类型。)

也许你想要一个自我加入?

select th1.ticket_id, th1.post_date, th1.qty_sold, th1.total_price, th1.sales_total,
       th2.sku as trans_sku, th2.qty_sold as trans_qty_sold,
       th2.desc as trans_desc, th2.total_price as trans_total_price
from ticket_history th1
  left join ticket_history th2 on th2.ticket_id = th1.ticket_id
where th1.sku = 'xxxx'

LEFT JOIN获得th1行,即使没有匹配的th2行。