不使用UNION简化oracle查询

时间:2014-01-28 10:58:23

标签: sql oracle union

在此查询中是否可以避免使用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')

1 个答案:

答案 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');
相关问题