2012-09-30 52 views
1

本新論壇,新來的SQL。我正在嘗試清理一些數據並提取錯誤。我有兩個表,它們共享列FILENAME,TYPE,SEC,我想從兩個表中取出SEC和TYPE之間存在一對多關係的任何記錄,任何具有SEC和TYPE的記錄,其中只有一個到一個關係可以忽略,並被認爲是有效的。查詢查找兩個表和兩列之間的一對多關係(排除任何一對一)

例如, 我在table1中。

FILENAME TYPE SEC 

a----------------x----1 

b----------------x----2 

c----------------y----1 

d----------------y----3 

表2中我將有類似的東西,

FILENAME TYPE SEC 

e----------------x----1 

f----------------x----2 

g----------------z----1 

h----------------y----3 

,所以我想一個查詢,會發現

FILENAME TYPE SEC 

a----------------x----1 

c----------------y----1 

e----------------x----1 

g----------------z----1 

我的數據庫非常大,任何幫助,將不勝感激!

謝謝。

回答

0
select t1.sec, t1.type, count(*) from table1 as t1 
join table2 as t2 on t1.sec = t2.sec and t1.type = t2.type 
group by t1.sec, t1.type 
having count(*) > 1 

編輯:這不是什麼你問,這將顯示哪些人有多個記錄,但他們將被分組。

0

您需要查找具有多個type的值的sec。下面的查詢做到這一點,它應該在任何數據庫上運行:

select t.* 
from ((select t1.* 
     from t1 
    ) union all 
     (select t2.* 
     from t2 
    ) 
    ) t join 
    (select sec 
     from ((select t1.* 
      from t1 
      ) union all 
      (select t2.* 
      from t2 
      ) 
      ) t 
     group by sec 
     having count(distinct type) > 1 
    ) s 
    on t.sec = s.sec 

有可能是在做查詢的更有效的方法,取決於數據庫。

+0

我覺得這是關閉的,因爲它會列出SEC = 2和SEC = 2,因爲你是跨2個表 – RichardTheKiwi

+0

對其計數@ Richardakacyberkiwi。 。 。該查詢是正確的。 sec = 2的兩個記錄都有type = 1,所以'count(distinct type)= 1'。此外,提問者似乎並未將重複內容限制爲單個表格。 –

+0

感謝大家的幫助!我最終使用了gordon提供的查詢,它效果很好! –

0
select 'table1' which, t.* 
from (
    select sec, min(type) typea, max(type) typeb 
    from table1 
    group by sec 
    having min(type) <> max(type) 
) x 
join table1 t on t.sec = x.sec 
UNION ALL 
select 'table2', t.* 
from (
    select sec, min(type) typea, max(type) typeb 
    from table1 
    group by sec 
    having min(type) <> max(type) 
) x 
join table2 t on t.sec = x.sec 

第二個剛剛複製的第一,結合使用UNION ALL

相關問題