2016-09-18 57 views
0

是否有可能找到留下外連接,右外連接和完全外連接返回的記錄數。給定左手邊桌和右手邊桌的記錄數和匹配記錄。找到左外連接,右外連接和全外連接返回的記錄數

我想關聯它們之間的關係。我已經嘗試了兩個輸入樣本數據的表格。無法獲得他們之間的任何關係。 如果我知道左手邊桌中不匹配條目的數量。我將這個數字添加到匹配的記錄中,然後我將得到左邊的外部連接輸出。如果我知道右手邊的不匹配記錄的數量,那麼我會將該數字添加到匹配的記錄中。它會給我們正確的外部連接輸出。

是否有可能不知道不匹配的記錄。我們可以找到留下外連接,右外連接和完全外連接返回的記錄數。

CREATE table table1(
    id integer, 
    name varchar(40)   
); 

CREATE table table2(
     id integer, 
    name varchar(40)   
); 

insert into table1(id,name)values(1,'ABC'); 
insert into table1(id,name)values(2,'DEF'); 
insert into table1(id,name)values(3,'GHI'); 
insert into table1(id,name)values(4,'JKL'); 
insert into table1(id,name)values(5,'JKL'); 
insert into table1(id,name)values(6,'JKL'); 

insert into table2(id,name)values(2,'ABC'); 
insert into table2(id,name)values(2,'ABC'); 
insert into table2(id,name)values(1,'ABC'); 
insert into table2(id,name)values(1,'ABC'); 
insert into table2(id,name)values(3,'ABC'); 
insert into table2(id,name)values(3,'ABC'); 
insert into table2(id,name)values(4,'ABC'); 
insert into table2(id,name)values(4,'ABC'); 
insert into table2(id,name)values(5,'ABC'); 
insert into table2(id,name)values(5,'ABC'); 

insert into table2(id,name)values(11,'ABC'); 
insert into table2(id,name)values(12,'ABC'); 
insert into table2(id,name)values(13,'ABC'); 
insert into table2(id,name)values(14,'ABC'); 
select count(*) from table1;//6 
select count(*) from table2; //14 

select count(*) from table1 inner join table2 
on table1.id=table2.id; //10 

select count(*) from table1 left outer join table2 
on table1.id=table2.id;//11 


select count(*) from table1 right outer join table2 
on table1.id=table2.id;//14 

select count(*) from table1 full outer join table2 
on table1.id=table2.id;//15 


//Unmatched records`enter code here` 
select count(*) from table1 left outer join table2 
on table1.id=table2.id 
where table2.id is null;//1 

select count(*) from table1 right outer join table2 
on table1.id=table2.id 
where table1.id is null;//4 
+0

你需要它在一個單一的查詢或三個不同的查詢? –

+1

我不明白這個問題。您正在顯示使用不同連接類型獲得的記錄數量,並且還顯示如何計數不匹配的記錄。那麼你還在尋找什麼? –

+0

獲取這些數字的唯一方法是運行JOIN查詢。運行FULL JOIN以立即獲得全部3個。 – Serg

回答

0

既然你知道總記錄數,知道的不匹配的記錄數相當於知道匹配記錄的數量。 (也許!)

您的問題的答案是否定的,您不能確定不同類型連接中的記錄數量,只知道基表的基數,而不知道有多少記錄匹配(或不匹配)。簡單的心理練習:兩張表都有100條記錄。如果所有匹配都完全匹配,則一對一,那麼所有連接都與內部連接相同,並且它們都有100條記錄。如果根本沒有匹配,則內部聯接有零行,單向聯接有100行,完整外部聯接有200行。而這些情況之間的唯一區別是匹配(或不匹配)記錄的數量,絕對沒有其他可以讓你在沒有這些信息的情況下得到答案的東西。

後添加的任擇議定書要求的後續問題:

其實知道「多少記錄匹配」沒有明確定義,並不足以反正。假設兩個表中的所有記錄都匹配。在某種極端情況下,匹配可能是成對的:兩個表中都有一個id列,兩個表中的值都是從1到100的所有可能值。然後結果爲100行。另一方面,假設「id」在兩個表中都不是唯一的。相反,它在所有100列的表中都有值1。然後第一個表中的每一行都匹配第二個表中的每一行,結果集將有100 x 100 = 10,000行。

這只是建議如下:「有多少行匹配」不是一個明確定義的概念。要計算所產生的連接(不同種類),需要知道連接的內容,並且對於連接條件中的每個元組,每個表中具有該特定元組的行數。然後,內部聯接的結果集中的行數是這些元組分組計數的乘積的總和,以及用於外部聯接的左側(或右側或兩個)表中的不匹配行的附加行。

+0

假設,即使我們知道匹配記錄,我們如何導出co關係。讓我們看一個示例表A有100條記錄,表B有200條記錄,並且A和B之間的匹配記錄是150條。如何知道留下外部聯接,右外部聯接和完全外部聯接返回的記錄數,而不運行查詢。 – nag

0

表2中的id不是唯一的,但table1中的id是。
所以我猜測table2.id是table1.id的外鍵。

在這種情況下,這個SQL用FULL JOIN可以結合計數的匹配和不匹配:

select 
count(distinct case when t2.id is null then t1.id end) as total_unmatched_t1, 
count(case when t1.id is null then t2.id end) as total_unmatched_t2, 
count(distinct case when t2.id is not null then t1.id end) as total_matched_t1, 
count(case when t1.id is not null then t2.id end) as total_matched_t2 
from table1 t1 
full outer join table2 t2 on (t1.id = t2.id);