Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何合并SQL中不常见的列_Sql_Sql Server_Union_Union All - Fatal编程技术网

如何合并SQL中不常见的列

如何合并SQL中不常见的列,sql,sql-server,union,union-all,Sql,Sql Server,Union,Union All,我应该写什么SELECT语句才能从表1和表2获得所需的表 表1-费用表 表2-订单表 所需表格 要使用UNION,每个SELECT必须具有相同数量的选定列、相同数量的列表达式、相同的数据类型,并且具有相同的顺序,如下所示: DECLARE @tblCharge AS Table ( ChargeId INT, BillingId INT, OrderId INT, ChargeName VARCHAR(50), Amount Decimal(18,2)

我应该写什么SELECT语句才能从表1和表2获得所需的表

表1-费用表

表2-订单表

所需表格


要使用UNION,每个SELECT必须具有相同数量的选定列、相同数量的列表达式、相同的数据类型,并且具有相同的顺序,如下所示:

DECLARE @tblCharge AS Table
(
    ChargeId INT,
    BillingId INT,
    OrderId INT,
    ChargeName VARCHAR(50),
    Amount Decimal(18,2)
)

DECLARE @tblOrder AS Table
(   
    OrderId INT,
    ProductName VARCHAR(50),
    Price Decimal(18,2)
)

INSERT INTO @tblCharge
(
    ChargeId,
    BillingId ,
    OrderId ,
    ChargeName ,
    Amount
)
VALUES
(1,1,1,'ServiceFee',2.00),
(2,1,2,'ServiceFee',3.00),
(3,1,3,'ServiceFee',2.00),
(4,1,3,'BookingFee',2.00),
(5,2,4,'ServiceFee',1.00),
(6,2,5,'ServiceFee',1.00)

INSERT INTO @tblOrder
(
    OrderId ,
    ProductName ,
    Price
)
VALUES
(1,'Sandwich',5.00),
(2,'Coke',2.50),
(3,'Cake',5.00),
(4,'Water',3.00),
(5,'Sandwich',7.00)

SELECT
    ChargeId,
    BillingId ,
    OrderId ,
    ChargeName ,
    Amount
FROM @tblCharge C
UNION
SELECT
    C.ChargeId,
    C.BillingId ,
    O.OrderId ,
    O.ProductName ,
    O.Price
FROM @tblOrder O 
LEFT JOIN @tblCharge C ON C.OrderId=O.OrderId

你在这里做的事没有多大意义

首先,联合不能以您试图应用它的方式使用。请参见Microsoft关于工会的文档:

如果要在表匹配的条件下组合两个表,请尝试使用内部联接:

SELECT a.ChargeId, a.BillingId, a.OrderId a.ChargeName, a.Amount, b.ProductName, b.Price
FROM Table1 a
INNER JOIN Table2 b ON a.OrderId = b.OrderId

最终结果与您想要的表不同,但比您试图返回的表更有逻辑意义。

尝试下面的查询

;WITH cte_1
 as
 (SELECT ChargeID,BillingId,o.OrderID,ChargeName,ProductName,Amount,Price
 FROM Charge c
   JOIN [Order] o on c.OrderID=o.OrderID)
SELECT ChargeID,BillingId,OrderID,ChargeName,Amount
FROM cte_1
UNION 
SELECT ChargeID,BillingId,OrderID,ProductName,Price
FROM cte_1
ORDER BY OrderID

这应该是一个注释,如果我的回答对提问者有所帮助,那么它是否应该在注释部分就没有任何意义了。这是否意味着无法实现此所需的表?要实现上述结果,您还可以使用联接。为什么表2:OrderId=3不在列表中?