0

我有以下查询,它有一个子查询可以从对偶中进行选择。主查询和子查询的结果都需要显示在输出中。

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

4

2 回答 2

0
  • exists, 不是exist
  • 缺少关闭子查询括号
  • 表别名不接受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';
于 2021-12-02T08:19:09.340 回答
0

修复语法错误(EXISTSnot EXIST,缺少右括号并且不要使用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表或别名,因为子查询别名为anotc并且子查询仅包含一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

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);

取决于您要如何检查客户端是否存在。

于 2021-12-02T08:46:09.103 回答