SQL联合语法

SQL联合语法,sql,Sql,我正在试图找出UNION的正确语法。我的模式如下所示: Players (playerNum, playerName, team, position, birthYear) Teams = (teamID, teamName, home, leagueName) Games = (gameID, homeTeamNum, guestTeamNum, date) 我需要打印所有的teamid,其中球队与X队比赛,而不是与Y队比赛 所以我的第一个想法是检查hometeamNum,然后检查Guest

我正在试图找出
UNION
的正确语法。我的模式如下所示:

Players (playerNum, playerName, team, position, birthYear)
Teams = (teamID, teamName, home, leagueName)
Games = (gameID, homeTeamNum, guestTeamNum, date)
我需要打印所有的
teamid
,其中球队与X队比赛,而不是与Y队比赛

所以我的第一个想法是检查hometeamNum,然后检查GuestTeamNum,但我不确定home是否有正确的语法

SELECT DISTINCT hometeamNum 
FROM games 
WHERE 
    guestteamNum IN 
      (SELECT teamid FROM teams WHERE teamname = 'X') AND 
    guestteamNum NOT IN 
      (SELECT teamid FROM teams WHERE teamname = 'Y') 
UNION DISTINCT

如果你只需要主队,这就足够了:

SELECT DISTINCT hometeamnum
FROM games
WHERE guestteamnum NOT IN (SELECT teamid FROM teams WHERE teamname = 'Y')
如果您同时需要主队和客队:

选择所有不是“y”的球队,这些球队没有以“y”为主队,也没有以“y”为客队,以“x”为客队,或以“x”为主队

SELECT DISTINCT teamid
FROM teams
WHERE teamname != 'y' AND teamid NOT IN
 (SELECT hometeamnum
 FROM games INNER JOIN teams ON games.guestteamnum = teams.teamid 
 WHERE teamname = 'y'
 UNION
 SELECT guestteamnum
 FROM games INNER JOIN teams ON games.hometeamnum = teams.teamid 
 WHERE teamname = 'y')
AND teamid IN
 (SELECT guestteamnum
 FROM games INNER JOIN teams on games.hometeamnum = teams.teamid
 WHERE teamname = 'x'
 UNION
 SELECT hometeamnum
 FROM games INNER JOIN teams on games.guestteamnum = teams.teamid
 WHERE teamname = 'x');

希望这就是你想要的。可能会有一个更简洁的查询,但现在想起来已经太晚了:)

使用
不存在
可以定位不存在的行。也就是说,您需要与“X”进行过比赛的团队,X是确实存在的行,可以使用简单的join和where子句**定位这些行。然后从这些行中,您需要找到任何不存在于团队“Y”中的行

SELECT DISTINCT
        hometeamnum
FROM games
        INNER JOIN teams AS guests ON games.guestTeamNum = guests.teamID
WHERE guests.teamname = 'X'
AND NOT EXISTS (
        SELECT 1
        FROM games AS games2
                INNER JOIN teams AS guests2 ON games2.guestTeamNum = guests2.teamID
        WHERE games.hometeamnum = games2.hometeamnum
        AND guests2.teamname = 'Y'
        )
注释

存在
/
不存在
实际上不需要返回任何数据,因此可以使用
选择1
选择空
选择*
。我在这里使用了
select 1
,只是因为它可能更容易理解-但是我个人更喜欢“select null”,它强调exists子查询没有返回任何数据

存在
/
不存在
都相当有效,并且可以比(…)中的
执行得更好。


**为了提高性能,并且在不改变结果的情况下,在(子查询)

中优先使用连接,这无助于确定处理多个表和不同列时所需的语法。从您的示例中,您正在访问两个具有相同列的不同表。您的评论说,您正试图找出如何使用UNION的正确语法,而不是您希望为自己编写它,或者您不了解联接。您认为这为什么需要UNION?除了最后的
UNION DISTINCT
(这不是一件事-除非使用
UNION ALL
,否则联合是不同的)@LoztInSpace“UNION DISTINCT”可以存在,例如,请参阅MySQL文档-但我同意没有绝对必要使用任何联合here@Used_By_Already-啊,好的-好的。大多数方言没有这种语法,因为
UNION
是隐式不同的。那么可能需要一个MySQL标记。@LoztInSpace-是的,大多数方言不包括
union distinct
,是的,用MySQL标记这个问题可能是合适的(这是提示dorito777-将dbms供应商作为标记包括在内)
SELECT DISTINCT
        hometeamnum
FROM games
        INNER JOIN teams AS guests ON games.guestTeamNum = guests.teamID
WHERE guests.teamname = 'X'
AND NOT EXISTS (
        SELECT 1
        FROM games AS games2
                INNER JOIN teams AS guests2 ON games2.guestTeamNum = guests2.teamID
        WHERE games.hometeamnum = games2.hometeamnum
        AND guests2.teamname = 'Y'
        )