我的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>
也许需要一个子选择,但我也不太了解如何做到这一点。
任何建议都会很棒。
答案 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行。