【发布时间】:2012-01-19 16:22:37
【问题描述】:
我被困在一个查询中,需要您的帮助和建议。情况是:
我有一个结构为
的表JOB_ID、ITEM_ID、NEW_ITEM_ID、状态
其中job_id是主键,status可以是AC,SB。
现在我想编写一个查询,它只从表中选择那些状态为 AC 并且 ITEM_ID 或 NEW_ITEM_ID 都不在状态为 SB 的行中的行。我已经编写了一个查询,但它需要一个很多时间所以请帮我写优化查询。这就是我写的
SELECT * FROM (
SELECT JOB_ID,NEW_ITEM_ID,ITEM_ID,STATUS
FROM X1
WHERE STATUS='AC'
AND NEW_ITEM_ID IS NOT NULL
MINUS
( SELECT T1.JOB_ID,T1.NEW_ITEM_ID ,T1.ITEM_ID ,T1.STATUS
FROM ( SELECT *
FROM X1
WHERE STATUS IN 'AC'
AND NEW_ITEM_ID IS NOT NULL ) T1
, ( SELECT *
FROM X1
WHERE STATUS IN ('PR','SB')
AND NEW_ITEM_ID IS NOT NULL ) T2
WHERE ( T2.ITEM_ID IN (T1.ITEM_ID,T1.NEW_ITEM_ID)
OR T2.NEW_ITEM_ID IN (T1.ITEM_ID,T1.NEW_ITEM_ID)
)
AND T1.STATUS!=T2.STATUS
)
) T
编辑
此表将包含数百万条记录,例如大约 30M。
【问题讨论】:
-
您忘记在标签中指定
firebird和db2 -
嘿。 @Algorithmist:您实际使用的是哪个 DBMS?
-
@Algorithmist:那么,请告诉我,为什么要使用 MySQL 和 PostgreSQL 标签?
-
@Tomalak 我只想要逻辑。这就是为什么。你有什么建议吗。
-
我建议以过于本地化来结束这个问题。
标签: sql performance oracle oracle11g query-optimization