嘿,我在下面有我在使用 SQLite 时编写的查询:
SELECT
ad.ID,ad.Script_Name,ad.Current_Status,
ad.Issues_found_during_run,ad.Testers,
ad.Run_Date,ad.Tools,u.fTag,u.role,u.avatar
FROM
allData ad
INNER JOIN
users u
ON
u.fTag = ad.lastUserWhoUpdated
GROUP BY
ad.ID
ORDER BY
ad.ID ASC
这会产生我想象中会提出该查询的 6 条记录。
但是,我已经转向使用Oracle数据库。这是我正在使用的 Oracle 服务器上的信息:
Oracle 数据库 12c 企业版版本 12.2.0.1.0 - 64 位生产
因此,当我将 SQLite 数据转换为 Oracle 并运行相同的查询时,只需对 GROUP BY 进行修改,因为 Oracle 似乎想要 SELECT 语句中的所有名称,而不仅仅是我需要分组的名称:
SELECT
ad.ID,ad.Script_Name,ad.Current_Status,
ad.Issues_found_during_run,ad.Testers,
ad.Run_Date,ad.Tools,u.fTag,u.role,u.avatar
FROM
allData ad
INNER JOIN
users u
ON
u.fTag = ad.lastUserWhoUpdated
GROUP BY
ad.ID,ad.Script_Name,ad.Current_Status,ad.Issues_found_during_run,ad.Testers,ad.Run_Date,ad.Tools,u.fTag,u.role,u.avatar
ORDER BY
ad.ID ASC;
在 SQL 开发人员中运行时,上述内容将生成 0 条记录。那么,Oracle 需要我做什么来解决这个问题,以便它像 SQLite 版本一样提取 6 条记录?
你可以使用这样的东西:
SELECT
ad.ID,MAX(ad.Script_Name), MAX(ad.Current_Status),
MAX(ad.Issues_found_during_run), MAX(ad.Testers),
MAX(ad.Run_Date), MAX(ad.Tools), MAX(u.fTag),MAX(u.role),MAX(u.avatar)
FROM
allData ad
INNER JOIN
users u
ON
u.fTag = ad.lastUserWhoUpdated
GROUP BY
ad.ID
ORDER BY
ad.ID ASC;
有关聚合函数的更多信息,请参阅此处:
https://docs.oracle.com/database/121/SQLRF/functions003.htm
这没有意义(至少对我来说(。没有WHERE
子句会限制返回的行数。 GROUP BY
当然不必对此做任何事情。唯一可疑的是
on u.fTag = ad.lastUserWhoUpdated
这导致没有检索到任何行。
因此:
- 是否确定这两个表中存在匹配的值?
检查这两列的数据类型,特别是如果一列(或两列(
CHAR
(我的意思是 CHAR,而不是VARCHAR2
(,它会用空格右键填充值,直到整个列大小,所以你可以尝试使用on trim(u.fTag) = trim(ad.lastUserWhoUpdated)
这有其缺点(索引不会被使用,除非它是基于函数的(,所以 - 如果事实证明是这种情况,请将数据类型修改为
VARCHAR2
.