2016-03-19 13 views
1

Ich möchte eine Suche in einer Tabelle durchführen, die einen Wert zurückgibt, der bei der Suche nach einer anderen Tabelle verwendet wird.Durchsuchen Sie eine Tabelle und verwenden Sie das Ergebnis, um eine andere Tabelle zu suchen.

Ich habe diesen Code, die für ein Team-Code in der Clubtisch aussieht:

SELECT Team, Teamcode 
    FROM epl.club 
    WHERE Teamcode = 
    (SELECT Teamcode 
     FROM epl.club 
     WHERE Team='Manchester City'); 

Jetzt möchte ich auf die Spiele Tabelle die resultierende Teamcode für eine ausgewählte verwenden.

Ich habe diesen Code, der die Matchtabelle durchsucht und alle Übereinstimmungen mit einem gegebenen Teamcode findet, aber ich brauche ihn, um den Code von der ersten Suche oben zu bekommen.

Select * 
    from epl.matches 
    where HomeTeam = 35 
    or AwayTeam = 35 
     and FTR like "A" 
    or FTR like "H"; 

Eine andere Sache, die ich nicht verstehe, ist, dass ich machen möchte, dass es nur die Linie nur zurück, wenn HomeTeam=35'= and '=FTR is A or FTR is H oder wenn AwayTeam=35 and FTR is A or FTR is H, aber der Code, was tut, ist, dass es alle Zeilen zurückgibt, selbst wenn sie enthalten die 35 enthalten aber nur das H oder A in der FTR-Spalte.

+0

Siehe über Joins. – Strawberry

Antwort

0

erste Abfrage könnte nur sein:

SELECT 
Team, 
Teamcode 
FROM epl.club 
WHERE Team='Manchester City'; 

Warum eine Unterabfrage auf dem gleichen Tisch, wenn Sie direkt mit dem Team-Feld zugreifen können?

Dann können Sie tun:

SELECT * 
FROM epl.matches 
WHERE HomeTeam = (SELECT Teamcode FROM epl.club WHERE Team='Manchester City') 
    OR AwayTeam = (SELECT Teamcode FROM epl.club WHERE Team='Manchester City') 
    AND FTR like "A" 
    OR FTR like "H"; 
+0

Ich habe Ihr Problem nicht auf der wo. @ventiseis hat es perfekt gemacht! –

1

Sie haben Klammern in Ihrem Booleschen Ausdruck verwenden:

SELECT * 
    FROM epl.matches 
    WHERE (HomeTeam = 35 or AwayTeam = 35) 
    AND (FTR like "A" or FTR like "H") 

Dies liegt daran, AND has a higher operator precedence as OR.

Sie können die Abfragen kombinieren mit einem Join:

SELECT Team, Teamcode FROM epl.club c 
INNER JOIN epl.matches m ON (m.HomeTeam = c.Teamcode or m.AwayTeam = c.Teamcode) 
    WHERE (c.Team = 'Manchester City') 
     AND (m.FTR like "A" or m.FTR like "H") 

Zusatzinfo:

Hier ist eine sehr einfache Erklärung, wie ein 'INNER JOIN' verstanden werden kann - nur, wenn Sie don‘ Das weiß ich schon. Wenn Sie zwei Tabellen haben:

{ Table: Club }----------------| { Table: Matches }----------| 
|        | |       | 
| Teamcode | Team    | | HomeTeam | AwayTeam | FTR | 
|----------+-------------------| |----------+----------+-----| 
| 35  | Manchester City | | 38  | 39  | A | 
| 38  | Arsenal London | | 38  | 35  | A | 
| 39  | Leeds United  | | 35  | 39  | H | 
|----------+-------------------| | 38  | 35  | A | 
           | 39  | 38  | H | 
           |----------+----------+-----| 

ein INNER JOIN zwischen den Tabellen club und matches bedeutet, dass alle Zeilenkombinationen der beiden Tabellen nur die Zeilen im Ergebnis enthalten sind, wenn die Bedingung beitreten m.HomeTeam = c.Teamcode or m.AwayTeam = c.Teamcode erfüllt ist. Wenn Sie club.Team zu 'Manchester City' beschränken würden Sie das folgende Ergebnis für die haben beitreten:

{ Table: Join Result }------| 
|       | 
| HomeTeam | AwayTeam | FTR | 
|----------+----------+-----| 
| 38  | 35  | A | 
| 35  | 39  | H | 
| 38  | 35  | A | 
|----------+----------+-----| 

Es dauert einige Zeit, um deklarative Stil der Join-Syntax zu gewöhnen, aber es hilft Ihnen, Ihre Fragen zu strukturieren (im Gegensatz zu mehreren FROM Tabellen und verschachtelte SELECT Unterabfragen). Darüber hinaus kann der SQL-Abfrageoptimierer in den meisten Fällen besser eine INNER JOIN als geschachtelte Unterabfragen behandeln.

+0

aus irgendeinem Grund, wenn ich den kombinierten Abfragecode verwende, gibt es 0 Einträge zurück, aber wenn ich das 'WHERE (c.Teamcode = 'Manchester City')' zu 'WHERE (c.Teamcode = '35')' es zeigt sich gut . –

+0

Ich brauche Ihren Anfangscode, um zu arbeiten, weil es keinen Sinn macht, ihn auf 35 zu ändern, ich könnte stattdessen nur den ersten Code verwenden. –

+0

@EligijusTrembelis Hoppla! Ich habe 'Team' und' Teamcode' gemischt. Ich korrigierte die Antwort und fügte eine kleine Erklärung hinzu. Sie sollten wirklich über Joins lesen, wie Joins funktionieren und wie sie nützlich sein können, um Quieries zu erstellen. – ventiseis

Verwandte Themen