暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 为多个条件构建单个SQL

askTom 2017-07-10
152

问题描述

嗨,康纳/克里斯,

您是否可以根据以下输入和条件来帮助构建查询:
表结构也在liveSQL中共享。

DROP TABLE TEST_LOGIN_MASTER;
DROP TABLE TEST_LOGIN_REQUEST;
DROP TABLE TEST_LOGIN_ACCESS;


CREATE TABLE TEST_LOGIN_MASTER
( PK_TEST_LOGIN_MASTER NUMBER(10,0),
LOGIN_MASTER NUMBER(10,0), 
COMPANY_DETAILS NUMBER(10,0),
FK_TEST_LOGIN_REQUEST VARCHAR2(20) 
);

INSERT INTO TEST_LOGIN_MASTER
SELECT 1,1015918, 1557, 'REQUEST 1'  FROM DUAL UNION
SELECT 2,1015918, 1680, 'REQUEST 3'  FROM DUAL UNION
SELECT 3,1015918, 13770, 'REQUEST 4'  FROM DUAL UNION
SELECT 4,1015918, 13771, NULL  FROM DUAL UNION
SELECT 5,1015918, 13906, NULL  FROM DUAL;

CREATE TABLE TEST_LOGIN_REQUEST
( PK_TEST_LOGIN_REQUEST VARCHAR2(20),
STATUS VARCHAR2(2)
);

INSERT INTO TEST_LOGIN_REQUEST
SELECT  'REQUEST 1', 'AC'  FROM DUAL UNION
SELECT  'REQUEST 2', 'AC'  FROM DUAL UNION
SELECT  'REQUEST 3', 'AC'  FROM DUAL;


CREATE TABLE TEST_LOGIN_ACCESS
( LOGIN_MASTER NUMBER(10,0), 
COMPANY_DETAILS NUMBER(10,0)
);

INSERT INTO TEST_LOGIN_ACCESS
SELECT 1015918, 1557  FROM DUAL UNION
SELECT 1015918, 1680 FROM DUAL UNION
SELECT 1015918, 13770 FROM DUAL UNION
SELECT 1015918, 13771 FROM DUAL UNION
SELECT 1015918, 13906 FROM DUAL;
复制



1.使用LOGIN_MASTER和COMPANY_DETAILS检查TEST_LOGIN_MASTER中的FK_TEST_LOGIN_REQUEST是否具有值
2.如果FK_TEST_LOGIN_REQUEST不为NULL,则检查状态是否为TEST_LOGIN_REQUEST中的 “ac”
3.如果FK_TEST_LOGIN_REQUEST为NULL,则使用LOGIN_MASTER和COMPANY_DETAILS在TEST_LOGIN_ACCESS中检查是否存在条目

最后,我需要如下所示的输出:

1015918 1557   Y
1015918 1680   Y
1015918 13770  N
1015918 13771  Y
1015918 13906  Y
复制

专家解答

所以如果有一行test_login_request.status = 'AC',你想显示Y吗?

如果test_login_master.fk_test_login_request为null,您想在login_master和company_details上的test_login_access中是否有匹配行显示Y?

否则显示N?

如果是这样,你可以得到你想要的:

-外部加入请求,并在适当的列上访问master
-使用带有when子句的大小写表达式测试您的条件并返回适当的值

例如:

select m.*,
       case 
         when m.fk_test_login_request is not null and 
              r.status = 'AC' then 'Y'
         when m.fk_test_login_request is null and 
              a.login_master is not null then 'Y'
         else 'N'
       end yn
from   test_login_master m
left   join test_login_request r
on     m.fk_test_login_request = r.pk_test_login_request
left   join test_login_access a
on     a.login_master = m.login_master
and    a.company_details = m.company_details ;

PK_TEST_LOGIN_MASTER LOGIN_MASTER COMPANY_DETAILS FK_TEST_LOGIN_REQUES Y
-------------------- ------------ --------------- -------------------- -
                   1      1015918            1557 REQUEST 1            Y
                   2      1015918            1680 REQUEST 3            Y
                   3      1015918           13770 REQUEST 4            N
                   4      1015918           13771                      Y
                   5      1015918           13906                      Y
复制


PS-请不要喊!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论