UNION 语句连接同一个表中的两列

Posted

技术标签:

【中文标题】UNION 语句连接同一个表中的两列【英文标题】:UNION statement to join two columns in same table 【发布时间】:2014-10-22 01:23:01 【问题描述】:

您好,我是 SQL Server 的新手,我的家庭作业有一个问题让我很头疼,这是我家庭作业的最后一个问题,出于某种原因,我正在努力解决最后一个问题。

问题是这样的:

使用 UNION 运算符生成由 Orders 表中的三列组成的结果集: ShipStatus 包含已发货或未发货值的计算列 OrderID OrderID 列 OrderDate OrderDate 列 如果订单在 ShipDate 列中有值,则 ShipStatus 列应包含 SHIPPED 值。否则,它应该包含 NOT SHIPPED 值。 按 OrderDate 对最终结果集进行排序。

这是我到目前为止所得到的,但它似乎不起作用。

SELECT OrderID,OrderDate FROM Orders UNION SELECT ShipDate AS ShipStatus FROM Orders IF ShipDate IS NULL THEN ShipDate = 'Not Shipped' ELSE ShipDate = 'Shipped'

我不想要确切的答案,因为我想弄清楚,但如果能朝正确的方向轻推将不胜感激!

更新---------

大家好,感谢您的帮助! 在大家的帮助下,我想通了。

这是最终工作的代码。

SELECT OrderID, OrderDate, 'SHIPPED' AS ShipStatus FROM Orders WHERE ShipDate IS NOT NULL UNION SELECT OrderID, OrderDate, 'NOT SHIPPED' AS ShipStatus FROM Orders WHERE ShipDate IS NULL;

【问题讨论】:

【参考方案1】:

您正在为联合中的每个查询都需要具有相同数量的列而苦苦挣扎。这里有一些 SQL(mysql 语法)可以帮助你克服这个障碍。现在您对我的查询进行了这些更正,这里是订购问题的解决方案:

SELECT OrderID, OrderDate, ShippedStatus FROM
(
    SELECT OrderID, OrderDate, 'SHIPPED' as ShippedStatus
    FROM Orders 
    WHERE ShipDate IS NOT NULL
    UNION
    SELECT OrderID, OrderDate, 'NOT SHIPPED'
    FROM Orders
    WHERE ShipDate IS NULL
) AS myQuery ORDER BY OrderDate;

【讨论】:

好吧,我对其进行了一些修改,使其看起来像这样。 SELECT ShipDate AS ShipStatus, OrderID, OrderDate FROM Orders WHERE ShipDate IS NOT NULL = 'Shipped' UNION SELECT ShipDate AS ShipStatus, OrderID, OrderDate FROM Orders WHERE ShipDate IS NULL = 'Not Shipped'; 我需要的是列 OrderID、OrderDate,然后我需要另一列显示 OrderStatus,如果值为 NULL,那么它应该说 NOT SHIPPED,如果值不是 NULL,那么它需要输出为 SHIPPED .如果来自 ShipDate 列,我获取 NULL 或非 Null 值的方式 我终于想通了。这段代码最终输出了我正在寻找的结果。 SELECT OrderID, OrderDate, 'SHIPPED' AS ShipStatus FROM Orders WHERE ShipDate IS NOT NULL UNION SELECT OrderID, OrderDate, 'NOT SHIPPED' AS ShipStatus FROM Orders WHERE ShipDate IS NULL;【参考方案2】:

select 语句中没有 if。您只能在全局语句中使用 if。喜欢

if (condition)
begin

select statement ***

end

你要做的是where子句。

联合连接两个选择仅用于不同的值。哪个适用于已发货和未发货的价值。

所以你为 Shiped 做第一个表,然后为 Not Shiped 做第二个表,然后将这两个表与 union 结合起来。

【讨论】:

【参考方案3】:

UNION 中的 FYI SELECT 语句必须具有相同的列数。这些列还必须具有相似的数据类型。此外,每个 SELECT 语句中的列的顺序必须相同。

所以我想你需要一些东西来解决这个问题。但是我不知道联合在这里有什么用!

SELECT orderid, 
       orderdate,
       case 
          when shipdate IS NULL THEN shipdate = 'Not Shipped' 
          ELSE 'shipped' 
       END shipstatus 
FROM   orders 
ORDER BY orderdate

【讨论】:

以上是关于UNION 语句连接同一个表中的两列的主要内容,如果未能解决你的问题,请参考以下文章

从表中的两列中选择相同的数据,并使用一条sql语句显示所有数据

两个表,一个表中的两列关联另一个表的id,如何将这个表中的两列显示为另一个表id对应的内容

连接来自两个不同表的两列

在 Oracle 存储过程中比较 IF 语句中的两列

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

当一个表中的两列指向另一个表中的主键时,避免循环引用