2012-04-19 8 views
6

Also ich denke, ich habe eine Lösung für diese gesehen, aber sie sind alle sehr komplizierte Abfragen. Ich bin in Orakel 11g als Referenz.Wie beschränke ich die Anzahl der von diesem LINKEN JOIN zurückgegebenen Zeilen auf eins?

Was ich habe, ist eine einfache zu viele beizutreten, die funktioniert gut, aber ich brauche nicht die vielen. Ich möchte nur die linke Tabelle (die eine), um nur eine 1 Zeile zu verbinden, die die Join-Kriterien erfüllt ... nicht viele Zeilen.

ich brauche, dies zu tun, da die Abfrage in einem Rollup ist, die so ZäHLT wenn ich den normalen LEFT JOIN ich 5 Zeilen, in denen ich nur 1.

So Beispieldaten sind immer wie folgt:

TABLE 1: 
------------- 
TICKET_ID  ASSIGNMENT 
5    team1 
6    team2 

TABLE 2: 
------------- 
MANAGER_NAME ASSIGNMENT_GROUP USER 
joe   team1    sally 
joe   team1    stephen 
joe   team1    louis 
harry   team2    ted 
harry   team2    thelma 

was ich tun muss, ist diese beiden Tabellen auf ASSIGNMENT = ASSIGNMENT_GROUP beizutreten, aber nur 1 Zeile zurückgegeben.

, wenn ich ein linkes trete ich drei Reihen zurückerhalten Beaucse, dass die Art der hte Join links

+3

Warum ist dies mit MySQL markiert? –

+2

Obwohl es viele Antworten gibt, ist es unmöglich zu wissen, was Sie brauchen, wenn Sie nicht erklären, warum Sie nur 1 Reihe wollen. Wollen Sie wirklich einen zufälligen Benutzer pro Zuweisungsgruppe? Wozu? – winkbrace

Antwort

7

Wenn Oracle unterstützt Zeilennummer (Partition) können Sie eine Sub-Abfrage Auswahl erstellen können, wo Zeile 1.

SELECT * FROM table1 
LEFT JOIN 
(SELECT * 
FROM (SELECT *, 
      ROW_NUMBER() 
      OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq 
    FROM table2) a 
WHERE Seq = 1) v 
ON assignmet = v.assignmentgroup 
+0

könnten Sie eine Beispiel-SQL-Anweisung basierend auf der Abfrage abover posten. Ich weiß, dass Sie eine Unterabfrage nur nicht sicher von der Syntax machen können. – BostonMacOSX

+3

nicht so einfach auf ein Telefon tippen ... –

1

Ich denke, was Sie brauchen, ist GROUP BY auf das ASSIGNMENT_GROUP Feld zu verwenden.

http://www.w3schools.com/sql/sql_groupby.asp

+0

Ich glaube nicht, dass das bekommen wird, was ich will, weil ich auch die anderen Informationen in den anderen Bereichen brauche. Ich würde komische Sachen machen müssen, wie sie verketten. – BostonMacOSX

-3

können Sie Unterabfrage verwenden - wählen top 1

+1

, die nur für SQL Server –

+0

arbeiten, verwenden Sie dann Limit 1. Keine große Sache. – ZERO

+3

Oracle unterstützt auch nicht die 'LIMIT'-Klausel. –

1

gleich In Oracle, wenn Sie 1 Ergebnis wollen, können Sie die ROWNUM Anweisung verwenden, um die ersten N Werte einer Abfrage zu erhalten, zB:

SELECT * 
FROM TABLEX 
WHERE 
ROWNUM = 1 --gets the first value of the result 

Das Problem mit dieser einzelnen Abfrage besteht darin, dass Oracle die Daten nie in derselben Reihenfolge zurückgibt. So müssen Sie Ihre Daten vor dem Gebrauch rownum oder:

SELECT * 
FROM 
    (SELECT * FROM TABLEX ORDER BY COL1) 
WHERE 
ROWNUM = 1 

Für Ihren Fall sieht aus wie Sie nur 1 Ergebnis benötigen, so dass Ihre Abfrage sollte wie folgt aussehen:

SELECT * 
FROM 
    TABLE1 T1 
    LEFT JOIN 
    (SELECT * 
    FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP 
    AND 
    ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP 
+0

wird dies nicht mich auf 1 Zeile von Tabelle 1 auch begrenzen? Ich brauche nur 1 Zeile aus der Join-Tabelle 2 jeweils aber alle Zeilen aus Tabelle 1. – BostonMacOSX

+0

@BostonMacOSX Meine Antwort bereits bearbeitet –

+1

Sie können nicht so "T1.ASSIGNMENT" wie in Ihrer Inline-Ansicht verweisen, da 'T1' definiert ist eine höhere Ebene der Abfrage. Sie könnten eine analytische Funktion hinzufügen, die durch 'T2.ASSIGNMENT_GROUP' partitioniert und dann den Rang in die Join-Kriterien einfügt (ein Beispiel dafür ist unten). Oder Sie könnten die Abfrage gegen 'T2' in eine skalare Unterabfrage in Ihrer' SELECT'-Liste verschieben, obwohl dies möglicherweise weniger effizient ist. –

0

In MySQL konnte man nur GROUP DURCH ZUWEISUNG und getan werden. Oracle ist strenger und weigert sich, (in einer undefinierten Weise) zu wählen, welche Werte der drei Zeilen zu wählen sind. Das bedeutet, dass alle zurückgegebenen Spalten Teil von GROUP BY sein müssen oder einer Aggregatfunktion (COUNT, MIN, MAX ...) unterliegen.

Sie können sich natürlich dafür entscheiden, sich einfach nicht zu interessieren und eine Aggregatfunktion zu verwenden die zurückgegebenen Spalten.

select TICKET_ID, ASSIGNMENT, MAX(MANAGER_NAME), MAX(USER) 
from T1 
left join T2 on T1.ASSIGNMENT=T2.ASSIGNMENT_GROUP 
group by TICKET_ID, ASSIGNMENT 

Wenn Sie das tun, würde ich ernsthaft bezweifeln, dass Sie das JOIN an erster Stelle benötigen.

MySQL könnte auch mit GROUP_CONCAT in dem Fall, dass Sie eine Zeichenfolge Verkettung von Gruppenwerten für eine Spalte (Menschen oft so), aber mit Oracle, die staggeringly complex ist.

Unter Verwendung einer Unterabfrage wie bereits vorgeschlagen, ist eine Option, look here für ein Beispiel. Außerdem können Sie die Unterabfrage sortieren, bevor Sie die oberste Zeile auswählen.

+0

Diese Frage bezieht sich auf Oracle, also sind alle Dinge, die Sie in einer anderen DB tun können, egal – Forage

5

Sie könnten so etwas tun.

SELECT t1.ticket_id, 
     t1.assignment, 
     t2.manager_name, 
     t2.user 
    FROM table1 t1 
     LEFT OUTER JOIN (SELECT manager_name, 
           assignment_group, 
           user, 
           row_number() over (partition by assignment_group 
                --order by <<something>> 
               ) rnk 
          FROM table2) t2 
        ON ( t1.assignment = t2.assignment_group 
         AND t2.rnk = 1) 

Diese unterteilt die Daten in table2 von assignment_group und dann ordnet sie willkürlich pro assignment_group eine beliebige Zeile zu ziehen. Wenn Sie sich darum kümmern, welche Zeile zurückgegeben wird (oder wenn die Zeile deterministisch zurückgegeben werden soll), können Sie der Analysefunktion eine ORDER BY-Klausel hinzufügen.

+0

Könnten Sie bitte (vielleicht auskommentiert in einer eigenen Zeile) die Reihenfolge von Klausel –

+1

@RuneJeppesen - Hinzugefügt ein Beispiel für die ' Ordnen nach ". –

Verwandte Themen