在此查询中是否可以避免使用UNION?我没有足够的知识来简化这个查询。任何人都可以帮助这个查询吗?提前致谢
SELECT A.M_TITLE, A.M_NUMBER, B.M_NAME, B.M_DESCRIPTION, A.FORM_TYPE, B.SUBMISSION_DATE, B.CREATON_DATE, A.R_OBJECT_ID AS FORM_ID,
B.R_OBJECT_ID AS
FORMDATA_ID, '' AS ATTACHMENTS
FROM M_FORM A, M_FORMDATA B
WHERE A.M_NUMBER = B.M_NUMBER
AND ANY B.ATTACHMENTS IN (SELECT ATTACHMENTS FROM M_FORMDATA C WHERE B.M_NUMBER = C.M_NUMBER)
AND ACTION_ID = 'XXXX'
AND SUBMISSION_DATE >= DATE('XXXX')
AND SUBMISSION_DATE <= DATE('XXXX')
UNION
SELECT A.M_TITLE, A.M_NUMBER, B.M_NAME, B.M_DESCRIPTION, A.FORM_TYPE, B.SUBMISSION_DATE, B.CREATION_DATE, A.R_OBJECT_ID AS FORM_ID,
B.R_OBJECT_ID AS
FORMDATA_ID, 'null' AS ATTACHMENTS
FROM M_FORM A, M_FORMDATA
WHERE A.M_NUMBER = B.M_NUMBER
AND NOT ANY B.ATTACHMENTS IN (SELECT ATTACHMENTS FROM M_FORMDATA C WHERE B.M_NUMBER = C.M_NUMBER)
AND ACTION_ID= 'XXXX'
AND SUBMISSION_DATE >= DATE('XXXX')
AND SUBMISSION_DATE <= DATE('XXXX')
答案 0 :(得分:1)
首先,这是相同的查询重新格式化了一下,看看它实际上做了什么:
SELECT A.M_TITLE,
A.M_NUMBER,
B.M_NAME,
B.M_DESCRIPTION,
A.FORM_TYPE,
B.SUBMISSION_DATE,
B.CREATON_DATE,
A.R_OBJECT_ID AS FORM_ID,
B.R_OBJECT_ID AS FORMDATA_ID,
'' AS ATTACHMENTS
FROM M_FORM A,
M_FORMDATA B
WHERE A.M_NUMBER = B.M_NUMBER
AND ANY B.ATTACHMENTS IN
(SELECT ATTACHMENTS FROM M_FORMDATA C WHERE B.M_NUMBER = C.M_NUMBER)
AND ACTION_ID = 'XXXX'
AND SUBMISSION_DATE >= DATE('XXXX')
AND SUBMISSION_DATE <= DATE('XXXX')
UNION
SELECT A.M_TITLE,
A.M_NUMBER,
B.M_NAME,
B.M_DESCRIPTION,
A.FORM_TYPE,
B.SUBMISSION_DATE,
B.CREATION_DATE,
A.R_OBJECT_ID AS FORM_ID,
B.R_OBJECT_ID AS FORMDATA_ID,
'' AS ATTACHMENTS
FROM M_FORM A,
M_FORMDATA
WHERE A.M_NUMBER = B.M_NUMBER
AND NOT ANY B.ATTACHMENTS IN
(SELECT ATTACHMENTS FROM M_FORMDATA C WHERE B.M_NUMBER = C.M_NUMBER
)
AND ACTION_ID = 'XXXX'
AND SUBMISSION_DATE >= DATE('XXXX')
AND SUBMISSION_DATE <= DATE('XXXX')
我的第一个问题是,这个查询实际上运行了吗?我的SQL Developer告诉我两个ANY语句附近有语法错误。您可能必须重写查询以使用[..] AND B.ATTACHMENTS = ANY (...) [..]
。
其次,如果可以,请始终使用UNION ALL
。一个简单的UNION
必须对结果进行排序,以删除任何可能相对较慢的重复项。如果可能,请使用UNION ALL
。
最后,我不知道这个查询是做什么的,但似乎有两个查询,唯一的区别在于附件谓词。在上面的查询中,您查询附件是否在子查询中,在第二个查询中检查附件是否在子查询中。为什么不删除这个谓词呢?检查以下查询是否返回相同的结果:
SELECT A.M_TITLE,
A.M_NUMBER,
B.M_NAME,
B.M_DESCRIPTION,
A.FORM_TYPE,
B.SUBMISSION_DATE,
B.CREATON_DATE,
A.R_OBJECT_ID AS FORM_ID,
B.R_OBJECT_ID AS FORMDATA_ID,
'' AS ATTACHMENTS
FROM M_FORM A,
M_FORMDATA B
WHERE A.M_NUMBER = B.M_NUMBER
AND ACTION_ID = 'XXXX'
AND SUBMISSION_DATE >= DATE('XXXX')
AND SUBMISSION_DATE <= DATE('XXXX');