2011-09-16 16 views
-3

我正在尋找解決方案,因爲小時,但貓得到它。SQL自加入沒有雙交叉結果

我的表:

ID   name   value1  value2 
1   Meyer   20   _ 
2   Schmitt  20   _ 
3   Berger  _   20 
4   Chief   _   20 

我的查詢:

SELECT A.ID, A.name AS nameA, B.name AS nameB, A.value1 
FROM table AS A INNER JOIN table AS B 
ON A.value1 = B.value2 

結果:

ID  nameA  nameB  value1 
1  Meyer  Berger  20 
1  Meyer  Chief  20 
2  Schmitt Berger  20 
2  Schmitt Chief  20 

這應該是這樣的:

ID  nameA  nameB  value1 
1  Meyer  Berger  20 
2  Schmitt  Chief  20 

我怎樣才能得到這個結果?

我也嘗試了GROUP BY A.name,但得到錯誤的結果:

ID  nameA  nameB  value1 
1  Meyer  Berger 20 
2  Schmitt Berger 20 
+0

究竟是什麼你想在這裏做什麼?你應該閱讀數據庫規範化。 – fluffy

+3

我不理解你如何關聯記錄。如果「value1」和「value2」的所有值都是20,那麼你如何確定「Meyer」只屬於「Berger」,而「Schmitt」只屬於「Chief」? –

+0

您將需要一些其他條件來完成此項工作。例如,爲什麼查詢只返回Meyer Berger而不是Meyer Chief? – Phil

回答

2

您還沒有指定的DBMS。這是在SQL Server的測試:

with C as 
(
    select *, 
     row_number() over(partition by value1 order by ID) as rn1, 
     row_number() over(partition by value2 order by ID) as rn2 
    from YourTable 
) 
select A.ID, 
     A.name as nameA, 
     B.name as nameB, 
     A.value1 
from C as A 
    inner join C as B 
    on A.value1 = B.value2 and 
     A.rn1 = B.rn2 

可測試樣品:

declare @T table 
(
    ID int, 
    name varchar(10), 
    value1 int, 
    value2 int 
) 
insert into @T values 
(1,   'Meyer',   20,   null), 
(2,   'Schmitt',  20,   null), 
(3,   'Berger',  null,  20), 
(4,   'Chief',   null,  20) 

;with C as 
(
    select *, 
     row_number() over(partition by value1 order by ID) as rn1, 
     row_number() over(partition by value2 order by ID) as rn2 
    from @T 
) 
select A.ID, 
     A.name as nameA, 
     B.name as nameB, 
     A.value1 
from C as A 
    inner join C as B 
    on A.value1 = B.value2 and 
     A.rn1 = B.rn2 
+0

Hej!先謝謝你。它看起來像一個解決方案,但對不起,我只是與sqlite合作!還有可能嗎?我從未見過WITH C AS(...)您能向我解釋一下嗎?也可以在sqlite中? – airfrank

+0

@airfrank - 'with c as'是一個常見的表格表達式。不知道這是否在sqlite中可用。如果不是,你應該可以使用兩個子查詢。您還需要排名函數row_number(),因爲我不知道關於sqlite的任何信息,所以我無法告訴您這是否適合您。 –

+0

謝謝!你的提示與row_number讓我得到正確的答案! – airfrank

2

根據這一連接標準A.value1 = B.value2和您輸入表,邁耶都相關Berger和行政和施密特與伯傑和首席有關。所以,一個嫌疑犯更多的是關於你沒有告訴我們這些關係的標準/商業規則。 它看起來像你只是使用value1和value2作爲一些時髦的外鍵。你不明白爲什麼你認爲邁耶不會與酋長有關,或者爲什麼施密特不會與伯傑有關。

ID   name   value1  value2 
1   Meyer   20   _ 
2   Schmitt  20   _ 
3   Berger  _   20 
4   Chief   _   20 

因此,這不是你的查詢問題,但與數據結構的問題,讓我們修正值1和值2

ID   name   value1  value2 
1   Meyer   10   _ 
2   Schmitt  20   _ 
3   Berger  _   10 
4   Chief   _   20 

現在,您將得到正確的結果。但是,一個更加傳統的設計應該是這樣的:

PersonId PersonName BossPersonId 
1   Meyer   3 
2   Schmitt  4 
3   Berger  _ 
4   Chief   _ 

與此查詢:

Select A.Id, A.PersonName, B.PersonName as BossName 
FROM table AS A INNER JOIN table AS B 
ON A.BossPersonId= B.PersonId 
+0

Hej!先謝謝你!我不在乎配對!我只想要沒有配對兩次。正如上面的評論中所解釋的。有任何想法嗎? – airfrank

0

我解決它現在。

TABLE:

ID  name   value1   value2 
1  Meyer  20    _ 
2  Muster  10    _ 
3  Heinz  20    _ 
4  Karl   _    20 
5  Max   _    20 
6  Zack   _    10 

拆分它在臨時表和爲了它由值

表A:

ID  name  value1  value2 
1  Muster  10   _ 
2  Meyer  20   _ 
3  Heinz  20   _ 

表B:

ID  name  value1  value2 
1  Zack  _    10 
2  Karl  _    20 
3  Max   _    20 

然後再加入A.ID = B.ID和A.value1 = B 。值2

郵政與ROWNUMBER幫了我很多,THX 問候