2011-02-24 118 views
1

我有一個查詢,用於搜索失敗測試的測試數據庫,並在特定測試集出現故障時返回某個代碼。我需要做的是僅在已經通過的數據庫中保存了該測試的新版本時才返回該代碼。這是一組查詢的一部分,給定某個項目編號,查詢該編號的每個子集(有5個測試子集),然後檢查並給出它4種不同狀態之一。下面是摘錄:基於較新條目的SQL查詢條件選擇

SELECT 
MAX(
CASE 
WHEN PROJECT.PARENT_ID IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM TESTRESULTS WHERE TESTRESULTS.RESULTID = '962'))) 
AND PROJECT.PROJECTNAME LIKE '%EMC%' 
THEN '4' 
ELSE..... 

我需要檢查相同的表具有相同名稱的新條目,屬於同一個項目,已通過他們的測試,而不是失敗,即RESULTID =「961」,而是讓它通過其他情況,而不是分配一個'4'。測試日期存儲在表中。我已經玩了一段時間,自己做了一些連接,但是這個父母的父母的等級讓人很難說。另外,我沒有設計這個數據庫,也沒有能力以任何方式改變模式。

編輯: 這是表的相關結構,以及一些示例記錄:

ID | PARENT_ID | TEST TYPE | RESULTID | TESTDATE 
------------------------------------------------- 
4 |  1  | ESD  | 962 | 01-01-11 
5 |  2  | CI  | 961 | 01-02-11 
6 |  3  | ESD  | 961 | 02-01-11 
7 |  8  | RI  | 962 | 02-02-11 

我需要一個查詢將返回失敗測試(resultid 962),除非有與同另一個測試名稱和上述查詢中描述的相同parent_id關係,但通過了測試(resultid 961)。所以,如果我在01-01-11上運行查詢,我會得到ID爲4的行,但如果我在02-01-11上運行它,它將不返回行,並且在02-02-11它將返回ID爲7的行。此外,對於異常等,還有多重數據> 962,以及對於還沒有發生的測試重新編號< 961。

再次

編輯:對象表結構

ID | PARENT_ID | Description | 
-------------------------------- 
50 |  0  | Product Level | (Very Top) 
51 | 50  | Project Level | (The PROJECT table describes this lvl) 
52 | 51  | Work Request | 
1 | 52  | Work Order | 
2 | 52  | Work Order | 
3 | 52  | Work Order | 
8 | 52  | Work Order | 

因此,參考上面的表格,在TestResult中表中的每個測試是一名工人,這是把一個工作請求,這是孩子的孩子一個項目的孩子,這是一個產品的孩子。我需要能夠將每個單獨的測試結果重新綁定到項目級別,這就是爲什麼我將所有內容都運行到PROJECT表格而不是工作請求表格。

+0

數據結構和樣本記錄? – RichardTheKiwi 2011-02-24 23:16:02

+0

哪個數據庫。如果它的oracle,那麼有一個簡單的方法來處理像這樣使用Connect By Prior的父層次結構。 – 2011-02-24 23:16:35

+0

它使用interbase,並得到一個準確的數據結構的想法,ID必須顯示幾個樣本記錄,我沒有時間去匿名足夠的他們,但基本的想法是這樣的: 對象表包含每個對象(項目,測試集,測試,工作順序等),並且有幾個屬性表,這些屬性表保存與對象相關的信息,由對象ID鏈接。對象也有其他對象作爲他們的父母,所以這是一個父對象,一個產品,然後它有幾個子對象,這些對象又可以有自己的幾個子對象,以及其他表中的屬性 – TheJubilex 2011-02-24 23:18:40

回答

0

我重寫了查詢(供參考,原始答案如下)。

WHEN PROJECT.PARENT_ID IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM TESTRESULTS t1 WHERE t1.RESULTID = '962' 
and not exists 
(select * from object o2 
WHERE PROJECT.PARENT_ID = o2.id and o2.id IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM object WHERE object.id IN 
(SELECT parent_id FROM TESTRESULTS t2 WHERE t2.RESULTID = '961' 
and t1.testtype = t2.testtype and t2.testdate > t1.testdate))))))) 
AND PROJECT.PROJECTNAME LIKE '%EMC%' 

測試場景來達到這個結果:

create table #tmpObj (ident int primary key, parent_id int, description varchar(20)); 
insert into #tmpObj (ident, parent_id, description) values (50, 0, 'Product Level'); 
insert into #tmpObj (ident, parent_id, description) values (60, 50, 'Project X'); 
insert into #tmpObj (ident, parent_id, description) values (70, 60, 'Work request 1'); 
insert into #tmpObj (ident, parent_id, description) values (101, 70, 'Work order 1a'); 
insert into #tmpObj (ident, parent_id, description) values (102, 70, 'Work order 1b'); 
insert into #tmpObj (ident, parent_id, description) values (103, 70, 'Work order 1c'); 
insert into #tmpObj (ident, parent_id, description) values (71, 60, 'Work request 2'); 
insert into #tmpObj (ident, parent_id, description) values (111, 71, 'Work order 2a'); 
insert into #tmpObj (ident, parent_id, description) values (112, 71, 'Work order 2b'); 
insert into #tmpObj (ident, parent_id, description) values (113, 71, 'Work order 2c'); 
insert into #tmpObj (ident, parent_id, description) values (61, 50, 'Project Z'); 
insert into #tmpObj (ident, parent_id, description) values (80, 61, 'Work request 1'); 
insert into #tmpObj (ident, parent_id, description) values (201, 80, 'Work order 1a'); 
insert into #tmpObj (ident, parent_id, description) values (202, 80, 'Work order 1b'); 
insert into #tmpObj (ident, parent_id, description) values (203, 80, 'Work order 1c'); 
insert into #tmpObj (ident, parent_id, description) values (81, 61, 'Work request 2'); 
insert into #tmpObj (ident, parent_id, description) values (211, 81, 'Work order 2a'); 
insert into #tmpObj (ident, parent_id, description) values (212, 81, 'Work order 2b'); 
insert into #tmpObj (ident, parent_id, description) values (213, 81, 'Work order 2c'); 

create table #tmpTest (ident int primary key, parent_id int, name1 varchar(10), resultid int, testdate date); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2001, 101, 'ESD', 962, '2011-01-01'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2002, 102, 'CI', 961, '2011-01-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2003, 103, 'RI', 961, '2011-01-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2004, 111, 'ESD', 961, '2011-02-01'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2005, 112, 'CI', 962, '2011-02-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2006, 113, 'RI', 961, '2011-02-03'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2007, 201, 'ESD', 961, '2011-01-01'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2008, 202, 'CI', 961, '2011-01-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (2009, 203, 'RI', 961, '2011-01-02'); 

SELECT * FROM #tmpObj o1 WHERE o1.ident IN 
(SELECT parent_id FROM #tmpObj WHERE #tmpObj.ident IN 
(SELECT parent_id FROM #tmpObj WHERE #tmpObj.ident IN 
(SELECT parent_id FROM #tmpTest t1 WHERE t1.RESULTID = 962 
and not exists 
(select * from #tmpObj o2 
WHERE o1.ident = o2.ident and o2.ident IN 
(SELECT parent_id FROM #tmpObj WHERE #tmpObj.ident IN 
(SELECT parent_id FROM #tmpObj WHERE #tmpObj.ident IN 
(SELECT parent_id FROM #tmpTest t2 WHERE t2.RESULTID = 961 
and t1.name1 = t2.name1 and t2.testdate > t1.testdate))))))); 

原來的答覆:

好,所提供的資料讓我困惑了一點,但它好像這需要一個EXISTS()子查詢(我希望在interbase中可用),如下所示(簡化,沒有父 - 母)例如:

create table #tmpTest (ident int primary key, parent_id int, name1 varchar(10), resultid int, testdate date); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (4, 1, 'ESD', 962, '2011-01-01'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (5, 2, 'CI', 961, '2011-01-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (6, 1, 'ESD', 961, '2011-02-01'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (7, 8, 'RI', 962, '2011-02-02'); 
insert into #tmpTest (ident, parent_id, name1, resultid, testdate) values (9, 8, 'RI', 962, '2011-02-03'); 

select * from #tmpTest t1 
where resultid = 962 and not exists 
(select ident from #tmpTest t2 
where t2.parent_id = t1.parent_id 
and t2.resultid = 961 
and t2.testdate > t1.testdate); 

我假設testresults表中的parent_id可以用來標識測試類別,但這可能不準確。 我希望這至少可以幫助您優化您的查詢。

+0

問題是,失敗的parent_id與重複的不一樣。它被組織成一個樹形結構,測試有一個工作單作爲他們的父母,每一個新的測試都是一個新的工作單。我將添加對象表的結構,以便它更有意義。 – TheJubilex 2011-02-27 19:22:20

+0

@TheJubilex我重寫了我的答案。它應該更接近你所需要的。順便說一句,你的'PROJECT.PARENT_ID'引用'OBJECT.ID',對吧? – 2011-02-28 12:39:28