2017-08-11 244 views
0

我想知道是否可以內部連接與另一個內部連接的內部連接。內部連接與另一個內部連接的內部連接

我有3個表的數據庫:

運動員
教練

每一位運動員或教練必須存在於百姓餐桌,但也有一些人誰是既不教練員或運動員。

我想要做的是找到一份在至少3種不同的運動中活躍(意思是玩法或教練)的人列表。活躍的定義是他們既是教練,運動員也是教練和運動員。

表將包括(ID高度)的 的運動員表會(ID運動) 的教練表會(編號,運動

我創建了3個內部聯接,告訴我誰是教練和運動員,誰是教練,誰只是一名運動員。

這是通過內部連接完成的。

例如,

1)誰既是教練和運動員

select 
person.id, 
person.name, 
coach.sport as 'Coaches and plays this sport' 
from coach 
inner join athlete 
    on coach.id = athlete.id 
    and coach.sport = athlete.sport 
inner join person 
    on athlete.id = person.id 

這帶來了大家誰雙方教練的名單,並播放相同的運動。

2)要找出誰是唯一的體育教練,我已經使用內部連接如下:

select 
person.id, 
person.name, 
coach.sport as 'Coaches this sport' 
from coach 
inner join person 
    on coach.id = person.id 

3)然後找出誰只是扮演體育,我已經得到了相同2),但只是調整了詞語

select 
person.id, 
person.name, 
athlete.sport as 'Plays this sport' 
from athlete 
inner join person 
    on athlete.id = person.id 

最終的結果是,現在我已經得到了: 1)人誰既發揮和教練相同的運動 2)人誰執教運動誰發揮體育 3)人

我想知道的是如何找到至少參加3種不同體育運動的教練的名單?我想不出來,因爲如果有人在表1中扮演和指導曲棍球運動,那麼我不想在表2和表3中計算它們。

我嘗試使用這3個內部聯接來製作一個大量的連接表,以便我可以選擇不同的值,但它不工作。

有沒有更簡單的方法去做這個而不做子查詢?

+1

您是否收到任何錯誤? – nacho

+1

你需要什麼實際輸出?你最初說你需要找到至少有3項運動活躍的人,但是你現有的查詢會產生額外的細節(例如*他們在這些運動中的活躍程度)。最終輸出中是否需要這些細節? –

+0

請閱讀並在[mcve]上採取行動。 – philipxy

回答

0
CREATE TABLE #person (Id INT, Name VARCHAR(50)); 
CREATE TABLE #athlete (Id INT, Sport VARCHAR(50)); 
CREATE TABLE #coach (Id INT, Sport VARCHAR(50)); 

INSERT INTO #person (Id, Name) VALUES(1, 'Bob'); 
INSERT INTO #person (Id, Name) VALUES(2, 'Carol'); 
INSERT INTO #person (Id, Name) VALUES(2, 'Sam'); 

INSERT INTO #athlete (Id, Sport) VALUES(1, 'Golf'); 
INSERT INTO #athlete (Id, Sport) VALUES(1, 'Football'); 
INSERT INTO #coach (Id, Sport) VALUES(1, 'Tennis'); 
INSERT INTO #athlete (Id, Sport) VALUES(2, 'Tennis'); 
INSERT INTO #coach (Id, Sport) VALUES(2, 'Tennis'); 
INSERT INTO #athlete (Id, Sport) VALUES(2, 'Swimming'); 

-- so Bob has 3 sports, Carol has only 2 (she both coaches and plays Tennis) 

SELECT p.Id, p.Name 
FROM 
(
    SELECT Id, Sport 
    FROM #athlete 
    UNION -- this has an implicit "distinct" 
    SELECT Id, Sport 
    FROM #coach 
) a 
INNER JOIN #person p ON a.Id = p.Id 
GROUP BY p.Id, p.Name 
HAVING COUNT(*) >= 3 

-- returns 1, Bob 
+0

謝謝James!因爲我無法弄清楚如何代表那些參加過並且執教過一項運動的人,所以我一直在努力。 – slick

+0

@philipxy我需要知道這些活躍在至少x項運動中的人的ID。所以不用擔心列混淆。 – slick

1

我想知道的是如何找到一個誰玩/主教練至少3種不同的運動的人名單?我不出來,因爲如果有人 表1起和教練運動像曲棍球,那麼我不希望 表2和3指望他們

你可以做這樣的事情

select p.id,min(p.name) name 
from 
person p inner join 
(
select id,sport from athlete 
union 
select id,sport from coach 
) 
ca 
on ca.id=p.id 
group by p.id 
having count(ca.sport)>2 
0

我已經創建了一些測試數據的SQL - 應該在你的情況下工作:

UNION連接兩個結果在子選擇:
UNION將只返回非重複值。所以每項運動都會被計算一次。

最後只是將person.Person_id和person.name分組結果集。 由於HAVING條款,只用3個或更多的體育人將不退還─

CREATE TABLE person 
(
    Person_id int 
    ,name varchar(50) 
    ,height int 
) 

CREATE TABLE coach 
(
    id int 
    ,sport varchar(50) 
) 

CREATE TABLE athlete 
(
    id int 
    ,sport varchar(50) 
) 

INSERT INTO person VALUES 
(1,'John', 130), 
(2,'Jack', 150), 
(3,'William', 170), 
(4,'Averel', 190), 
(5,'Lucky Luke', 180), 
(6,'Jolly Jumper', 250), 
(7,'Rantanplan ', 90) 

INSERT INTO coach VALUES 
(1,'Football'), 
(1,'Hockey'), 
(1,'Skiing'), 
(2,'Tennis'), 
(2,'Curling'), 
(4,'Tennis'), 
(5,'Volleyball') 


INSERT INTO athlete VALUES 
(1,'Football'), 
(1,'Hockey'), 
(2,'Tennis'), 
(2,'Volleyball'), 
(2,'Hockey'), 
(4,'Tennis'), 
(5,'Volleyball'), 
(3,'Tennis'), 
(6,'Volleyball'), 
(6,'Tennis'), 
(6,'Hockey'), 
(6,'Football'), 
(6,'Cricket') 


      SELECT person.Person_id 
       ,person.name 
      FROM person 
     INNER JOIN (
        SELECT id 
          ,sport 
         FROM athlete 
        UNION 
        SELECT id 
          ,sport 
         FROM coach   
       ) sports 
       ON sports.id = person.Person_id 
     GROUP BY person.Person_id 
       ,person.name 
      HAVING COUNT(*) >= 3 
     ORDER BY Person_id 
0

教練&運動員,即人誰是教練還是運動員,相關的答案。這是聯合(在另一個行中),而不是(內部)連接在另一個中的行)。 (儘管外部聯盟涉及到一個聯盟,所以在這裏有一個複雜的方式來使用它。)但是通過工會只有教練,只有運動員才能獲得這種聯盟是沒有意義的。

地道是&算上運動員聯盟&教練。

select id 
from (select * from Athletes union select * from Coaches) as u 
group by id 
having COUNT(*) >= 3 

或者,你想要的人誰的教練或玩月1日體育和教練或玩第二運動,教練或玩一個第三運動,其中的運動都是不同的ID。

with u as (select * from Athletes union select * from Coaches) 
select u1.id 
from u u1 
join u u2 on u1.id = u2.id 
join u u3 on u2.id = u3.id 
where u1.sport <> u2.sport and u2.sport <> u3.sport and u1.sport <> u3.sport 

如果你想要名字,你可以加入人名。

有沒有從人類可讀的描述構建SQL查詢拇指任何規則?(https://stackoverflow.com/a/33952141/3404097