2013-05-29 170 views
3

我想知道「TX」中的哪個團隊沒有玩過遊戲。 (換句話說進出口尋找一個選擇的記錄,其中有在許多表中沒有相關的記錄。)獲取沒有相關記錄的記錄列表MySQL

這裏是SQL:

(或者,如果你喜歡SQL小提琴是在這裏:http://sqlfiddle.com/#!2/14106

CREATE TABLE `Team` (
    `ID` INT NOT NULL AUTO_INCREMENT , 
    `Name` VARCHAR(45) NULL , 
    `State` VARCHAR(45) NULL , 
    PRIMARY KEY (`ID`)); 

CREATE TABLE `Games` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Team_ID` INT NULL , 
    `Game_Day` DATE NULL , 
    PRIMARY KEY (`ID`)); 

    INSERT INTO `Team` (`Name`, `State`) VALUES ('Rams', 'TX'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Rockets', 'OK'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Bombers', 'TX'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Yellow Jackets', 'NV'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Wildcats', 'CT'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Miners', 'CO'); 
    INSERT INTO `Team` (`Name`, `State`) VALUES ('Bolts', 'TX'); 

    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('2', '2013-03-16'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('2', '2013-01-01'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('3', '2013-04-16'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('5', '2013-02-02'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('4', '2013-02-12'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('6', '2013-01-09'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('6', '2013-01-01'); 
    INSERT INTO `Games` (`Team_ID`, `Game_Day`) VALUES ('3', '2013-05-01'); 

我應該得到的結果是:

ID  Name  
1  Rams 
7  Bolts 

回答

3
SELECT `ID`, `Name` FROM `TEAM` 
    WHERE `ID` NOT IN (SELECT DISTINCT(`Team_ID`) from `Games`) 
    AND `State` = 'TX'; 

SqlFi狗here

+0

那真是太棒了...... – argentum47

1

希望這會有所幫助。

select t.ID,t.NAME 
FROM Team t 
WHERE t.state = 'TX' 
AND t.id NOT IN (SELECT g.TEAM_ID FROM Games g) 
4

使用外連接,只選擇那些比賽

SELECT t.* 
FROM TEAM t 
LEFT JOIN GAMES g ON g.team_id = t.id 
WHERE t.state = 'TX' 
AND g.team_id is null -- return only rows that *don't* join 

這這SQL Fiddle

注意,使用連接將出執行副行排列 - 查詢方法,特別是當數據集變大時。

+0

從性能的角度來看,這是一個更好的答案。 MySQL不能很好地滿足子查詢(現在使用的兩個其他答案)。從長遠來看,'LEFT OUTER JOIN'會表現更好。 –

+0

@CodyCaughlan絕對。子查詢應儘可能避免,並且可以經常轉換爲正確的SQL功能 – Bohemian

+0

我同意,我的答案是不是一個非常有效的一個。這應該是被接受的答案。 – vidit

3

您也可以左連接到Games表並篩選沒有對應的Games行的位置。這是通常比NOT IN快當表有很多行:

SELECT Team.ID, Team.Name 
FROM Team 
LEFT JOIN Games ON Team.ID = Games.Team_ID 
WHERE Team.State = 'TX' AND Games.ID IS NULL; 

如果沒有一個Games排去與Teams排,Games.ID列將在結果無效,因此,如果您過濾器Games.ID IS NULL你會得到一個團隊沒有遊戲的所有行。

有一個SQL小提琴here

+0

非常感謝所有! – JVMX

+0

你的答案得到了答案和更多upvotes,與我的答案相同,但在我的3分鐘後發佈。你必須分享你如何做到這一點! – Bohemian

+0

@波希米亞 - 抱歉,我甚至沒有看到你的答案。我從Oracle的多年工作中瞭解到這一點。 –