主 select 查询以及具有 "select * dual" 的子查询
Main select query together with subquery having "select * dual"
我有以下查询,它有一个从 dual 到 select 的子查询。主查询和子查询的结果都需要在输出中显示。
SELECT
a.ROW_EXISTS AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM
(
select
case when exist (select 1 from c.clients where client_id='c-001' then 'Y' else 'N' end as ROW_EXISTS
from dual
) AS a
INNER JOIN CLIENT_DYN cd ON c.CLIENT_ID = cd.CLIENT_ID
WHERE c.CLIENT_ID = 'c-001';
执行查询时,错误 ORA-00933: SQL command not properly ended
在行 ) AS A
附近遇到。
exists
,不是exist
- 缺少右子查询括号
- table 别名不接受
as
关键字(相对于列)
SELECT a.ROW_EXISTS AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM client c
INNER JOIN CLIENT_DYN cd ON c.CLIENT_ID = cd.CLIENT_ID
CROSS JOIN (SELECT CASE
WHEN EXISTS
(SELECT 1
FROM clients c
WHERE client_id = 'c-001')
THEN
'Y'
ELSE
'N'
END AS ROW_EXISTS
FROM DUAL) a
WHERE c.CLIENT_ID = 'c-001';
修复语法错误后(EXISTS
而不是 EXIST
,缺少右大括号并且不对 table 别名使用 AS
关键字),您的外部查询是
SELECT <some columns>
FROM (SELECT 'Y/N Value' AS row_exists FROM DUAL) a
INNER JOIN client_dyn cd
ON (c.CLIENT_ID = cd.CLIENT_ID)
外部查询中没有 c
table 或别名,因为子查询的别名是 a
而不是 c
并且只有子查询包含一个 row_exists
列而不是 CLIENT_ID
列;所以在这两点上,c.CLIENT_ID
都是无效的。
您可能想要的是:
如果要检查 client_id
匹配当前行:
SELECT CASE WHEN c.client_id IS NOT NULL THEN 'Y' ELSE 'N' END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
RIGHT OUTER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = 'c-001' AND c.CLIENT_ID = cd.CLIENT_ID);
或者,如果您想检查 client_id
是否与返回的行集合匹配:
SELECT CASE
WHEN COUNT(CASE WHEN c.client_id = 'c-001' THEN 1 END) OVER () > 0
THEN 'Y'
ELSE 'N'
END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
INNER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = cd.CLIENT_ID);
或者,如果您想检查 client_id
是否存在于 clients
table 中的任何位置:
SELECT CASE
WHEN EXISTS(SELECT 1 FROM clients WHERE client_id = 'c-001')
THEN 'Y'
ELSE 'N'
END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
INNER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = cd.CLIENT_ID);
取决于您要如何检查客户端是否存在。
我有以下查询,它有一个从 dual 到 select 的子查询。主查询和子查询的结果都需要在输出中显示。
SELECT
a.ROW_EXISTS AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM
(
select
case when exist (select 1 from c.clients where client_id='c-001' then 'Y' else 'N' end as ROW_EXISTS
from dual
) AS a
INNER JOIN CLIENT_DYN cd ON c.CLIENT_ID = cd.CLIENT_ID
WHERE c.CLIENT_ID = 'c-001';
执行查询时,错误 ORA-00933: SQL command not properly ended
在行 ) AS A
附近遇到。
exists
,不是exist
- 缺少右子查询括号
- table 别名不接受
as
关键字(相对于列)
SELECT a.ROW_EXISTS AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM client c
INNER JOIN CLIENT_DYN cd ON c.CLIENT_ID = cd.CLIENT_ID
CROSS JOIN (SELECT CASE
WHEN EXISTS
(SELECT 1
FROM clients c
WHERE client_id = 'c-001')
THEN
'Y'
ELSE
'N'
END AS ROW_EXISTS
FROM DUAL) a
WHERE c.CLIENT_ID = 'c-001';
修复语法错误后(EXISTS
而不是 EXIST
,缺少右大括号并且不对 table 别名使用 AS
关键字),您的外部查询是
SELECT <some columns>
FROM (SELECT 'Y/N Value' AS row_exists FROM DUAL) a
INNER JOIN client_dyn cd
ON (c.CLIENT_ID = cd.CLIENT_ID)
外部查询中没有 c
table 或别名,因为子查询的别名是 a
而不是 c
并且只有子查询包含一个 row_exists
列而不是 CLIENT_ID
列;所以在这两点上,c.CLIENT_ID
都是无效的。
您可能想要的是:
如果要检查 client_id
匹配当前行:
SELECT CASE WHEN c.client_id IS NOT NULL THEN 'Y' ELSE 'N' END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
RIGHT OUTER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = 'c-001' AND c.CLIENT_ID = cd.CLIENT_ID);
或者,如果您想检查 client_id
是否与返回的行集合匹配:
SELECT CASE
WHEN COUNT(CASE WHEN c.client_id = 'c-001' THEN 1 END) OVER () > 0
THEN 'Y'
ELSE 'N'
END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
INNER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = cd.CLIENT_ID);
或者,如果您想检查 client_id
是否存在于 clients
table 中的任何位置:
SELECT CASE
WHEN EXISTS(SELECT 1 FROM clients WHERE client_id = 'c-001')
THEN 'Y'
ELSE 'N'
END AS CLIENT_EXIST,
c.AP_Before AS AP_before,
c.AP_TIMESTAMP AS AP_TIMESTAMP,
cd.AAM_FLAG AS AAM_FLAG,
cd.SSM_FLAG AS SSM_FLAG
FROM clients c
INNER JOIN CLIENT_DYN cd
ON (c.CLIENT_ID = cd.CLIENT_ID);
取决于您要如何检查客户端是否存在。