【问题标题】:How to write queries with concatenation and alias in Oracle?如何在 Oracle 中编写具有连接和别名的查询?
【发布时间】:2015-05-06 06:29:56
【问题描述】:

我有两个表 A 和 B,其架构如下:-

表 A -> 两列 Principal (varchar) 和 LoginTime (Timestamp)

表 B -> 两列用户名(varchar)和登录时间(时间戳)

现在我必须对两个表运行查询,合并它们,然后按用户名排序。所以我写了一个这样的查询:-

select Principal AS Uname || ', ' ||
       LoginTime from A
       where LoginTime > 1430890465
UNION ALL
select Username AS Uname || ', ' ||
       LoginTime from B
       where LoginTime > 1430890465
order by Uname;

但上述似乎不起作用并给出以下错误:-

ORA-00923: 在预期的地方找不到 FROM 关键字 00923. 00000 - “在预期的地方找不到 FROM 关键字” *原因:
*行动:

【问题讨论】:

    标签: sql oracle oracle11g sql-order-by union


    【解决方案1】:

    校长 AS Unname || ', ' || 登录时间

    语法不正确。您可以连接两列。您不能将一列与另一列的别名连接起来。

    由于您要连接usernametimestamp 列,您只需在连接列 中添加一个别名,即表达式。

    select (Principal || ', ' ||
           LoginTime) AS Uname from A
           where LoginTime > 1430890465
    UNION ALL
    select (Username || ', ' ||
           LoginTime) AS Uname from B
           where LoginTime > 1430890465
    order by Uname;
    

    我在表达式中添加了大括号,即连接列,以便您轻松理解 别名 Uname 用于连接值

    【讨论】:

    • 所以我相信上面会考虑将(主体/用户名和登录时间)组合为一个字符串,然后按字母顺序排序。我说的对吗?
    • 是的,你完全正确。您会将其排序为字符串。即您正在对串联值 Uname 进行排序。
    • 感谢拉利特的回答。由于简单,选择了您的答案作为正确答案。
    【解决方案2】:

    as 位于您要为其指定别名的列之后:

    select Principal  || ', ' || LoginTime  AS Uname
    from A
    where LoginTime > 1430890465
    
    union all
    
    select Username || ', ' || LoginTime
    from B
    where LoginTime > 1430890465
    

    【讨论】:

    • 在我的情况下,用户名和委托人是相同的。那么为什么我们需要在 LoginTime 之后加上 Uname 呢?
    • @Siddharth:你不必输入别名,只要你愿意,你就应该做对。
    • 感谢您的回答。抱歉,如果我遗漏了这个概念,但我想要 Principal/Username 列的别名为 Uname。对于我的 DB Principal 和 Username 有类似的数据。那么我还需要在 LoginTime 之后放置 Uname 吗?
    • @Siddharth:是的,就像我在上面展示的那样。
    • @suslov 好吧,您不需要外部查询,联合都可以正常工作。排序依据将应用于联合集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2018-09-10
    • 2023-03-05
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多