为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8
【操作系统】:Windows 10
【CPU】:x86
【问题描述】*:
为什么执行这个报错:
[执行语句1]
SELECT count(1) FROM T_ASSET_SERVICE_STATE_HIS ASSH LEFT JOIN T_ASSET ASS ON ASSH.ASSET_ID = ASS.ASSET_ID LEFT JOIN T_ORG ORG ON ASS.ORG_ID = ORG.ORG_ID
where ASS.status = 0 AND ASSH.GROUP_ID = 1 and ASSH.CHANGE_START_TIME >= TO_DATE('2025-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')
执行失败,失败原因:
[-2207]:无法解析的成员访问表达式[CEIL2]
把TO_DATE的条件去掉执行这个就正常:
SELECT count(1) FROM T_ASSET_SERVICE_STATE_HIS ASSH LEFT JOIN T_ASSET ASS ON ASSH.ASSET_ID = ASS.ASSET_ID LEFT JOIN T_ORG ORG ON ASS.ORG_ID = ORG.ORG_ID
where ASS.status = 0 AND ASSH.GROUP_ID = 1
或者不count也正常
SELECT * FROM T_ASSET_SERVICE_STATE_HIS ASSH LEFT JOIN T_ASSET ASS ON ASSH.ASSET_ID = ASS.ASSET_ID LEFT JOIN T_ORG ORG ON ASS.ORG_ID = ORG.ORG_ID
where ASS.status = 0 AND ASSH.GROUP_ID = 1 and ASSH.CHANGE_START_TIME >= TO_DATE('2025-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')
-- 创建资产服务状态历史表
CREATE TABLE T_ASSET_SERVICE_STATE_HIS (
ASSET_ID NUMBER,
GROUP_ID NUMBER,
CHANGE_START_TIME DATE
);
-- 创建资产表
CREATE TABLE T_ASSET (
ASSET_ID NUMBER,
ORG_ID NUMBER,
STATUS NUMBER
);
-- 创建组织表
CREATE TABLE T_ORG (
ORG_ID NUMBER
);
-- 满足所有条件的数据(预期被统计)
INSERT INTO T_ASSET_SERVICE_STATE_HIS (ASSET_ID, GROUP_ID, CHANGE_START_TIME)
VALUES (1, 1, TO_DATE('2025-01-01 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));
INSERT INTO T_ASSET (ASSET_ID, ORG_ID, STATUS)
VALUES (1, 1, 0);
INSERT INTO T_ORG (ORG_ID)
VALUES (1);
-- 不满足 status 条件(status ≠ 0)
INSERT INTO T_ASSET_SERVICE_STATE_HIS (ASSET_ID, GROUP_ID, CHANGE_START_TIME)
VALUES (2, 1, TO_DATE('2025-01-01 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));
INSERT INTO T_ASSET (ASSET_ID, ORG_ID, STATUS)
VALUES (2, 2, 1);
-- 不满足 GROUP_ID 条件(GROUP_ID ≠ 1)
INSERT INTO T_ASSET_SERVICE_STATE_HIS (ASSET_ID, GROUP_ID, CHANGE_START_TIME)
VALUES (3, 2, TO_DATE('2025-01-01 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));
INSERT INTO T_ASSET (ASSET_ID, ORG_ID, STATUS)
VALUES (3, 3, 0);
-- 不满足时间条件(时间早于 2025-01-01 11:22:33)
INSERT INTO T_ASSET_SERVICE_STATE_HIS (ASSET_ID, GROUP_ID, CHANGE_START_TIME)
VALUES (4, 1, TO_DATE('2024-12-31 11:00:00', 'yyyy-mm-dd hh24:mi:ss'));
INSERT INTO T_ASSET (ASSET_ID, ORG_ID, STATUS)
VALUES (4, 4, 0);
-- 左连接中的 NULL 情况(T_ASSET 中无对应记录)
INSERT INTO T_ASSET_SERVICE_STATE_HIS (ASSET_ID, GROUP_ID, CHANGE_START_TIME)
VALUES (5, 1, TO_DATE('2025-01-01 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));
SELECT count(1)
FROM T_ASSET_SERVICE_STATE_HIS ASSH
LEFT JOIN T_ASSET ASS
ON ASSH.ASSET_ID = ASS.ASSET_ID
LEFT JOIN T_ORG ORG
ON ASS.ORG_ID = ORG.ORG_ID
where ASS.status = 0
AND ASSH.GROUP_ID = 1
and ASSH.CHANGE_START_TIME >= TO_DATE('2025-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss');
构造了一个测试用例,没有重现,你用这个用例试试
我也遇到了类似问题,请问有答案了嘛?
我只见过count(*)和count(1),什么是count(0)?