【发布时间】:2014-09-11 07:36:06
【问题描述】:
使用 Oracle 10g,我有一个如下所示的表(为简洁起见,缩短了语法):
CREATE TABLE "BUZINESS"."CATALOG"
( "ID" NUMBER PRIMARY KEY,
"ENTRY_ID" VARCHAR2(40 BYTE) NOT NULL,
"MSG_ID" VARCHAR2(40 BYTE) NOT NULL,
"PUBLISH_STATUS" VARCHAR2(30 BYTE) NOT NULL, /* Can be NEW or PUBLISHED */
CONSTRAINT "CATALOG_UN1" UNIQUE (ENTRY_ID, MSG_ID)
)
一个进程,进程 A,写入目录条目,其 PUBLISH_STATUS 为“新”。第二个进程,进程 B,然后进来,获取所有“新”消息,然后将 PUBLISH_STATUS 更改为“PUBLISHED”。
我需要编写一个查询来获取所有 PUBLISH_STATUS='NEW' 行,但是
我试图防止乱序获取,因此如果进程 B 将行标记为 PUBLISH_STATUS='PUBLISHED' 且 MSG_ID 为“1000”,然后进程 A 将乱序行写入为 PUBLISH_STATUS='NEW ' 使用 MSG_ID '999',查询在抓取所有 'NEW' 行时将永远不会获取该行。
所以,如果我从数据开始:
INSERT INTO BUZINESS.CATALOG VALUES (1, '1000', '999', 'NEW');
INSERT INTO BUZINESS.CATALOG VALUES (2, '1000', '1000', 'PUBLISHED');
INSERT INTO BUZINESS.CATALOG VALUES (3, '1000', '1001', 'NEW');
INSERT INTO BUZINESS.CATALOG VALUES (4, '2000', '1999', 'NEW');
INSERT INTO BUZINESS.CATALOG VALUES (5, '2000', '2000', 'PUBLISHED');
INSERT INTO BUZINESS.CATALOG VALUES (6, '2000', '2001', 'NEW');
INSERT INTO BUZINESS.CATALOG VALUES (7, '3000', '3001', 'NEW');
然后我的查询应该只抓取具有 ID 的行: 3、6、7
然后我必须将这些行与其他数据连接起来,因此结果需要是 JOINable。
到目前为止,我有一个非常大、丑陋的查询 UNIONing 两个相关的子查询来做到这一点。有人可以帮我写一个更好的查询吗?
【问题讨论】: