如何在同一输出窗口获取两个SQL查询的结果?
嘿,要把这两个查询的结果同时展示在一个输出窗口,有两种实用的方法,看你需求来选:
方法1:在SQL客户端中同时执行两个查询(最常用)
大多数主流SQL客户端(比如PL/SQL Developer、DBeaver、SQL Developer等)都支持在同一个脚本里执行多个查询,执行后会自动在输出窗口分标签或者分区展示两个结果集。你直接把下面两个查询放在同一个脚本里运行就行:
查询1:SOAP服务日志
SELECT C.SERVICENAME, C.SERVICEID, B.SOAPIN, B.SOAPOUT, A.TIMESTAMP FROM Schema1.LG_LOGENTRIES A JOIN Schema1.LG_SOAPREQUESTS B ON A.ID = B.LOGENTRYID JOIN Schema1.CFG_SOAPSERVICES C ON B.SERVICEID = C.SERVICEID WHERE C.SERVICENAME <> 'UploadAndPrepareDocumentEx1__sdweb_services_preload' AND B.TIMESTAMP BETWEEN TO_DATE('02/01/2018 11:55:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE('02/01/2018 12:03:59','dd/mm/yyyy hh24:mi:ss') AND A.USERID IN (SELECT ID FROM Schema1.CFG_USERS WHERE NAME = UPPER('CGBXGVSG'));
(注:我把原来的隐式JOIN改成了显式JOIN,可读性更好,逻辑完全一致)
查询2:事件日志
SELECT B.JSONIN, B.JSONOUT, A.TIMESTAMP, B.EVENT_MESSAGE, A.PROCESSID, A.status, A.SERVERNAME FROM Schema1.LG_LOGENTRIES A JOIN Schema1.LG_EVENT B ON A.ID = B.LOG_ENTRYID WHERE B.EVENT_MESSAGE NOT IN ('getFileImage','submitBase64','loadDocumentToSign','getRefData') AND B.TIMESTAMP BETWEEN TO_DATE('31/12/2017 13:43:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE('31/12/2017 13:53:59','dd/mm/yyyy hh24:mi:ss') AND A.USERID IN (SELECT ID FROM Schema1.CFG_USERS WHERE NAME = UPPER('CTHX8Y2G'));
方法2:合并为单个结果集(如果需要统一展示)
如果你的客户端不支持多结果集展示,或者你希望把两个结果放在同一张表里,那可以通过补全对方缺失的列(用NULL填充),再用UNION ALL合并:
-- 第一个查询补全第二个查询的列 SELECT C.SERVICENAME, C.SERVICEID, B.SOAPIN, B.SOAPOUT, A.TIMESTAMP, NULL AS JSONIN, NULL AS JSONOUT, NULL AS EVENT_MESSAGE, NULL AS PROCESSID, NULL AS status, NULL AS SERVERNAME, 'SOAP_SERVICE_LOG' AS LOG_TYPE -- 加个标识区分两类日志 FROM Schema1.LG_LOGENTRIES A JOIN Schema1.LG_SOAPREQUESTS B ON A.ID = B.LOGENTRYID JOIN Schema1.CFG_SOAPSERVICES C ON B.SERVICEID = C.SERVICEID WHERE C.SERVICENAME <> 'UploadAndPrepareDocumentEx1__sdweb_services_preload' AND B.TIMESTAMP BETWEEN TO_DATE('02/01/2018 11:55:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE('02/01/2018 12:03:59','dd/mm/yyyy hh24:mi:ss') AND A.USERID IN (SELECT ID FROM Schema1.CFG_USERS WHERE NAME = UPPER('CGBXGVSG')) UNION ALL -- 第二个查询补全第一个查询的列 SELECT NULL AS SERVICENAME, NULL AS SERVICEID, NULL AS SOAPIN, NULL AS SOAPOUT, A.TIMESTAMP, B.JSONIN, B.JSONOUT, B.EVENT_MESSAGE, A.PROCESSID, A.status, A.SERVERNAME, 'EVENT_LOG' AS LOG_TYPE -- 加个标识区分两类日志 FROM Schema1.LG_LOGENTRIES A JOIN Schema1.LG_EVENT B ON A.ID = B.LOG_ENTRYID WHERE B.EVENT_MESSAGE NOT IN ('getFileImage','submitBase64','loadDocumentToSign','getRefData') AND B.TIMESTAMP BETWEEN TO_DATE('31/12/2017 13:43:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE('31/12/2017 13:53:59','dd/mm/yyyy hh24:mi:ss') AND A.USERID IN (SELECT ID FROM Schema1.CFG_USERS WHERE NAME = UPPER('CTHX8Y2G'));
这样合并后的结果集会包含所有列,用LOG_TYPE字段来区分是SOAP服务日志还是普通事件日志,方便你查看。
内容的提问来源于stack exchange,提问作者Pawan
相关产品推荐
相关产品推荐

