2013-04-30 56 views
0

我有三個表是這樣的:發現在許多無關聯的數據一對多的關係

Person table: primary - PersonKey 
PersonFieldValue table: contains a PersonKey and a PersonFieldKey 
PersonField table: primary - PersonFieldKey. 

這也包含了描述字段和兩個位字段名爲IsRequired和IsLateRequirement

我一直在拉我的頭髮出來提出一個查詢,該查詢將給我一個PersonFieldValue表中沒有記錄的人員列表,該列表匹配來自PersonField表的記錄,其中兩個位字段之一是真的,並且字段的描述是失蹤。因此,考慮到這樣的數據:

PersonKey 
    1 
    2 

PersonField

PersonFieldKey Description  IsRequired  IsLateRequirement 
    1    Thing1    1     0 
    2    Thing2    0     1 
    3    Thing3    1     0 
    4    Thing4    0     0 

PersonFieldValue

PersonKey   PersonFieldKey 
    1     3 
    1     4 
    2     1 
    2     2 

我應該得到這樣的數據:

PersonKey   MissingFieldDescription 
    1    Thing1 
    1    Thing2 
    2    Thing3 

請注意,只檢查IsRequired或IsLateRequirement設置爲1的PersonField記錄是否缺失。

那麼,我該怎麼做?

+0

您正在使用哪個數據庫? – Lokesh 2013-05-01 00:52:14

回答

2
SELECT p.PersonKey, pf.Description as 'MissingFieldDescription' 
FROM Person p, PersonField pf 
    WHERE pf.PersonFieldKey NOT IN 
    (select PersonFieldKey FROM PersonFieldValue WHERE PersonKey = p.PersonKey) 
    AND (pf.IsRequired = 1 or pf.IsLateRequirement = 1) 
+0

這不起作用。這顯示了所有匹配的內容。並非所有事情都沒有。我正在嘗試查找PersonFields沒有匹配的PersonFieldValue記錄的人員記錄,該人員記錄的兩個位字段之一設置爲true。這給了我一切與位字段爲真的地方相匹配的東西。 – 2013-04-30 14:09:16

+1

對不起@布萊恩,我誤解了你最初的要求。嘗試上面的編輯 - 請徹底測試它。如果你想讓我解釋它是如何工作的,請告訴我。 – Rots 2013-05-01 00:31:41

+1

這是完美的。我能夠修改它的其他領域,並比我想出的解決方案(樞軸和動態SQL)短得多。獎勵! – 2013-05-01 18:39:18

0

下面的查詢將做的工作,我已經測試了它[假定其爲Oracle]:

SELECT a.KEY,description FROM(
SELECT decode(personKey,1,2,personKey) KEY,personFieldKey 
FROM PersonFieldValue 
UNION 
SELECT decode(personKey,2,1,personKey) KEY,personFieldKey 
FROM PersonFieldValue) a, PersonField c 
WHERE NOT EXISTS (SELECT 1 FROM PersonFieldValue b 
        WHERE a.KEY=b.personkey 
        AND a.personfieldkey = b.personfieldkey) 
and (isRequired=1 OR isLateRequirement=1) 
and c.personFieldKey=a.personFieldKey; 

對於那些誰想要測試,可你下面的腳本生成模式:

create table PersonFieldValue (personKey number, personFieldKey number); 

create table perseon(personKey number); 

create table personfield(personFieldKey number,description varchar2(100),isRequired number, isLateRequirement number); 

insert into personField values(1,'thing1',1,0); 
insert into personField values(2,'thing2',0,1); 
insert into personField values(3,'thing3',1,0); 
insert into personField values(4,'thing4',0,0); 

insert into PersonFieldValue values(1,3); 
insert into PersonFieldValue values(1,4); 
insert into PersonFieldValue values(2,1); 
insert into PersonFieldValue values(2,2);