SQL 服务器:使用来自第一个查询的数据创建联合视图

SQL Server : create a view with Union with data from first query

我的 SQL 很生疏,以至于我以前没有创建过视图,我不完全确定如何做我需要的。也许我需要一个存储过程。这是交易。

我们有一个票务历史(购买)数据库。我们想要过滤某个 SKU,但我们想要具有该 SKU 的每张票的所有行项目。例如,某人买了一件衬衫和一顶帽子。我想过滤衬衫以找到所有想要衬衫的人,但要显示包含衬衫和帽子的整张票。

我认为我的查询应该是这样的,但我认为它行不通。

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>

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

任何建议都很好。

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

也许您想要自行加入?

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 获取第 1 行,即使没有匹配的第 2 行。

我不确定您要在这里做什么,也不确定 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的注意事项:

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