mysql - 在 mysql DB 中创建视图时如何将行号作为列?
问题描述
我有一个选择查询,它可以在结果中自动生成行号列作为 ID。
SELECT
@curRow := @curRow + 1 AS rowID,
`tt`.`STATUS` AS `STATUS`,
`tt`.`PERFORMED_BY` AS `PERFORMED_BY`,
`tt`.`TMS_LOAD_ID` AS `TMS_LOAD_ID`,
`tt`.`SHIP_LOCATION_ID` AS `SHIP_LOCATION_ID`,
`tt`.`TRIP_END_TIME` AS `TRIP_END_TIME`,
`tt`.`COMMENTS` AS `ASSIGN_DETAILS_COMMENT`,
FROM
abc as tt
JOIN(
SELECT
@curRow := 0
) r
但是当我创建视图时,它告诉我选择命令有参数。
我该如何解决这个问题?
谢谢。
解决方案
理想情况下,如果你使用的是 MySQL 8+,你可以在ROW_NUMBER
这里使用:
CREATE VIEW yourView AS
SELECT
ROW_NUMBER() OVER (ORDER BY some_col) AS rowID,
STATUS AS STATUS,
PERFORMED_BY AS PERFORMED_BY,
TMS_LOAD_ID AS TMS_LOAD_ID,
SHIP_LOCATION_ID AS SHIP_LOCATION_ID,
TRIP_END_TIME AS TRIP_END_TIME,
COMMENTS AS ASSIGN_DETAILS_COMMENT
FROM abc;
仔细注意,调用ROW_NUMBER
具有一个ORDER BY
子句,该子句确定哪一行将编号为 1、2 等。没有ORDER BY
,上述调用ROW_NUMBER
和您的用户变量方法都没有多大意义。
话虽如此,如果您坚持使用 MySQL 5.7 或更早版本,您也许可以使用相关子查询来模拟行号:
CREATE VIEW yourView AS
SELECT
(SELECT COUNT(*) FROM abc t2 WHERE t2.some_col < t1.some_col) AS rowID,
STATUS AS STATUS,
PERFORMED_BY AS PERFORMED_BY,
TMS_LOAD_ID AS TMS_LOAD_ID,
SHIP_LOCATION_ID AS SHIP_LOCATION_ID,
TRIP_END_TIME AS TRIP_END_TIME,
COMMENTS AS ASSIGN_DETAILS_COMMENT
FROM abc t1
some_col
如果没有重复值,这种方法会很好用。
推荐阅读
- python - snappy/snappymodule.cc(31):致命错误 C1083:无法打开包含文件:'snappy-ch':没有这样的文件或目录
- java - Java 发出 POST 请求以表达 js 服务器并下载 PDF 文件
- protocol-buffers - 错误“make all”/usr/bin/ld: 安装 caffe 时找不到 -lprotobuf
- elasticsearch - 如何从弹性搜索中的默认_english_停用词列表中删除停用词?
- javascript - 无法全局调用javascript函数
- azure-active-directory - 在访问令牌中包含来自外部数据库的角色
- macos - 在 MacOS 上的 MS Edge Canary 上启动自动化
- c++ - 编译 gsoap 输出文件的问题 (onvif)
- sql-server - MSSQL:选择更新特定列时的最大日期
- c# - 使用 .NET DirectoryServices 在 Active Directory 组成员资格上设置 TTL