留下在je的第一个小脚印

经过上次飞机巧遇张哥,交谈中了解,此人编码工龄 8年,于是我在心中不敬的佩服他,他也挺谦虚的,三个多小时的行程,我们聊的甚欢,他不仅告诉了我一些学习方法和经验,而且还告诉了我这个网站(je),于是,有了现在我每天必做的事就是来je逛逛,向je的前辈们学习了....

非常好的问题! 你指出的非常对:**在你提供的 SQL 中,第二个 SELECT 子句并没有使用 `AS JE` 显式地为 `JE02` 指定别名 `JE`,但为什么我们说它是“作为 JE 字段”?** 我们来看你提供的 SQL 片段: ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE02, ND || '-02' NY FROM B ``` 确实,这里并没有写成: ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE02 AS JE, ... ``` --- ## ✅ 为什么我们说 `JE02` 是“作为 JE 字段”? 这是因为在 **`UNION ALL` 查询中,Oracle 是根据字段的位置来匹配列的**,而不是靠别名。 来看你完整的 SQL: ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE01 AS JE, ND || '-01' NY FROM B UNION ALL SELECT B.YSKM, B.GCDM, B.ysbm, JE02, ND || '-02' NY FROM B ``` 这两个 `SELECT` 的字段顺序如下: | 字段位置 | 第一个 SELECT | 第二个 SELECT | |----------|----------------|----------------| | 1 | B.YSKM | B.YSKM | | 2 | B.GCDM | B.GCDM | | 3 | B.ysbm | B.ysbm | | 4 | JE01 AS JE | JE02 | | 5 | ND || '-01' | ND || '-02' | 在 `UNION ALL` 查询中,两个 SELECT 的字段**必须数量一致、类型兼容**,Oracle 会按照字段的**位置**来合并,而不是看字段名。 因此: - 第一个 SELECT 的第 4 个字段是 `JE01 AS JE`,它被命名为 `JE`; - 第二个 SELECT 的第 4 个字段是 `JE02`,虽然没有别名,但它在相同的位置,因此它也**被视为 `JE` 列的一部分**; - Oracle 会自动将这两个列合并为一个名为 `JE` 的字段(取第一个 SELECT 的列名); --- ## ✅ Oracle 中如何查看列名? 在 `UNION ALL` 查询中,最终结果集的列名 **取自第一个 SELECT 的列名或别名**。 所以即使你在第二个 SELECT 中写成: ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE02 AS XX, ND || '-02' NY FROM B ``` 它在最终结果集中仍然会被命名为 `JE`,因为第一个 SELECT 给了别名 `JE`。 你可以运行以下语句验证: ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE01 AS JE, ND || '-01' NY FROM B UNION ALL SELECT B.YSKM, B.GCDM, B.ysbm, JE02 AS XX, ND || '-02' NY FROM B ``` 你会发现最终结果集的列名仍然是: ``` YSKM | GCDM | ysbm | JE | NY ``` --- ## ✅ 总结 | 观点 | 说明 | |------|------| | ✅ 两个 SELECT 字段顺序必须一致 | 否则会报错 | | ✅ 列名取自第一个 SELECT | 第二个 SELECT 的别名不起作用 | | ✅ 不写 AS JE 也可以 | 只要字段位置一致,Oracle 会自动合并 | | ✅ 推荐显式写 AS | 为了可读性和维护性,建议写上别名 | --- ## ✅ 推荐写法(更清晰) ```sql SELECT B.YSKM, B.GCDM, B.ysbm, JE01 AS JE, ND || '-01' NY FROM B UNION ALL SELECT B.YSKM, B.GCDM, B.ysbm, JE02 AS JE, ND || '-02' NY FROM B ``` 这样写虽然不是必须的,但**提高了可读性**,别人一看就知道 `JE02` 是作为 `JE` 被使用的。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值