SQL UNION语法

时间:2016-03-21 23:45:20

标签: sql

我想弄清楚UNION的正确语法是什么。我的架构如下所示:

Players (playerNum, playerName, team, position, birthYear)
Teams = (teamID, teamName, home, leagueName)
Games = (gameID, homeTeamNum, guestTeamNum, date)

我需要打印队伍对阵X队的所有teamIDs,但不能打击Y队。

所以我的第一个想法是检查hometeamNum,然后检查guesteamNum,但我不确定回家做正确的语法。

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

3 个答案:

答案 0 :(得分:1)

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

SELECT DISTINCT hometeamnum
FROM games
WHERE guestteamnum NOT IN (SELECT teamid FROM teams WHERE teamname = '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');

希望这就是你所追求的。那里可能有一个更简洁的问题,但是我想到一个晚上为时已晚:)

答案 1 :(得分:0)

使用public Rigidbody projectile; //GameObject prefab = Resources.Load ("sphere") as GameObject; public float speed = 20; /*// Use this for initialization void Start () { }*/ // Update is called once per frame void Update () { if (Input.GetButtonDown("Fire1")) { Rigidbody instantiatedProjectile = Instantiate(projectile, projectile.position, projectile.rotation) as Rigidbody; instantiatedProjectile.velocity = transform.TransformDirection(new Vector3(0, 0,speed)); } } 可以查找不存在的行。也就是说,您希望与“X”对战的团队是存在的行,这些团队可以使用简单的连接和where子句**来定位。然后从那些行中你需要找到任何对队伍'Y'不存在的行。

NOT EXISTS

注释

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' ) / EXISTS实际上不需要返回任何数据,因此可以使用NOT EXISTSselect 1select null。我在这里使用select *只是因为它可能更容易理解 - 但我个人更喜欢`select null',它强调存在子查询没有返回任何数据。

select 1 / EXISTS效率相当高,效果可能优于NOT EXISTS

**表示性能,如果不改变结果,请优先使用IN (...)

加入

答案 2 :(得分:-1)

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;