2015-04-27 22 views
4

我有一個名爲PlayerScore包含玩家的名字和他們的平均成績表:查找與條件上相同的表值的組合在SQL服務器

Id Name  Average 
1 Sakib  80 
2 Tamim  70 
3 Mushfiq 60 
4 Sabbir  50 
5 Ashraful 20 
6 Aftab  40 
7 Rubel  30 
8 Kalu  10 

我想基於一個條件,找到自己的合作伙伴關係的組合, , 在線播放其平均分值大於40不能與球員,其分值低於40 我嘗試下面的查詢合作伙伴:

select a.Name,a.Average,b.Name,b.Average from ((select * from PlayerScore where Average<=40) as a inner join (select * from PlayerScore where Average<=40) as b on a.Id < b.Id) 

union 

select a.Name,a.Average,b.Name,b.Average from ((select * from PlayerScore where Average>=40) as a inner join (select * from PlayerScore where Average>=40) as b on a.Id < b.Id) 

導致:

Name Average Name Average 
Aftab 40  Kalu 10 
Aftab 40  Rubel 30 
Ashraful 20  Aftab 40 
Ashraful 20  Kalu 10 
Ashraful 20  Rubel 30 
Mushfiq 60  Aftab 40 
Mushfiq 60  Sabbir 50 
Rubel 30  Kalu 10 
Sabbir 50  Aftab 40 
Sakib 80  Aftab 40 
Sakib 80  Mushfiq 60 
Sakib 80  Sabbir 50 
Sakib 80  Tamim 70 
Tamim 70  Aftab 40 
Tamim 70  Mushfiq 60 
Tamim 70  Sabbir 50 

是他們不使用UNION

+2

所以結果是想要的? _「40不能與分數低於40的球員搭檔」_爲什麼選擇這種組合? –

+0

結果是期望的。但我想要一種不使用'union'的方法@Tim Schmelter – sajju217

+0

爲什麼你想避免'UNION'?如果你不想消除重複使用'UNION ALL',除了我沒有看到問題。如果你想要不同的排序,你可以在子查詢中做到這一點。 –

回答

2
select distinct a.Name,a.Average,b.Name,b.Average 
from PlayerScore a 
join PlayerScore b 
    on a.Id < b.Id 
    and ( a.Average<=40 and b.Average<=40 
      or a.Average>=40 and b.Average>=40 
     ) 

它可能會導致同一exceution計劃的任何解決方案。

1

也許你可以做這樣的事情:

SELECT 
    t.*, 
    t2.* 
FROM 
    PlayerScore AS t 
    CROSS JOIN PlayerScore AS t2 
WHERE t.Average>=40 AND t2.Average<40 
ORDER BY t.Name 
+1

該運動員希望至少有40個配對玩家,配對不超過40個。我無法看到您的查詢如何提供答案。 –

0

您可以根據您的病情2組,給他們不同的值,然後做一個聯接基於價值。像這樣的東西。

;WITH PlayerScore as 
(
SELECT 1 AS Id,'Sakib' AS Name,80 AS Average 
UNION ALL SELECT 2,'Tamim',70 
UNION ALL SELECT 3,'Mushfiq',60 
UNION ALL SELECT 4,'Sabbir',50 
UNION ALL SELECT 5,'Ashraful',20 
UNION ALL SELECT 6,'Aftab',40 
UNION ALL SELECT 7,'Rubel',30 
UNION ALL SELECT 8,'Kalu',10 
),PlayerCriteria AS 
(
SELECT *,CASE WHEN Average >= 40 THEN 1 ELSE 0 END joincondition 
FROM PlayerScore 
) 

SELECT * FROM PlayerCriteria C1 
INNER JOIN PlayerCriteria C2 ON C1.joincondition = C2.joincondition 
AND C1.Id > C2.Id 
+0

op希望40年代進入這兩個組。 –

相關問題