2012-04-19 14 views
6

Więc myślę, że widziałem rozwiązanie tego, jednak wszystkie są bardzo skomplikowane zapytania. Jestem w wyroczni 11g dla odniesienia.Jak ograniczyć liczbę wierszy zwróconych przez to LEWEGO DOŁĄCZ do jednego?

To, co mam, to proste połączenie wielu osób, które działa świetnie, ale nie potrzebuję wielu. Chcę tylko lewej tabeli (ten), aby po prostu dołączyć dowolny 1 wiersz, który spełnia kryteria łączenia ... nie wiele wierszy.

muszę to zrobić, ponieważ zapytanie jest w pakiecie zbiorczym który liczy więc jeśli robię normalne LEFT JOIN mam 5 wierszy, gdzie tylko ja powinien być coraz 1.

Więc przykład dane przedstawiają się następująco:

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 

co muszę zrobić, to połączyć te dwie tabele na ASSIGNMENT = ASSIGNMENT_GROUP, ale zwracany jest tylko jeden wiersz.

kiedy robię LEFT JOIN otrzymuję trzy rzędy powrócił beaucse że jest natura hte lewej przyłączyć

+3

Dlaczego to oznacza MySQL? –

+2

Mimo że opublikowano wiele odpowiedzi, nie można dowiedzieć się, czego potrzebujesz, jeśli nie wyjaśnisz, dlaczego chcesz mieć tylko jeden wiersz. Czy naprawdę chcesz losowego użytkownika na grupę przydziału? Po co? – winkbrace

Odpowiedz

7

Jeśli Oracle obsługuje numer wiersza (partycję) można utworzyć wybierający kwerendy sub gdzie rząd jest równy 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

można opublikować przykładową instrukcję SQL opartą na kwerendzie przeszukiwania. Wiem, że możesz wykonać podzapytanie, ale nie masz pewności co do składni. – BostonMacOSX

+3

Nie tak łatwo nagrać na telefon ... –

1

myślę, co potrzebne jest do korzystania GROUP BY na polu ASSIGNMENT_GROUP.

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

+0

Nie sądzę, że dostaną to, czego chcę, ponieważ potrzebuję innych informacji również w innych dziedzinach. Musiałbym robić dziwne rzeczy, jak je łączyć. – BostonMacOSX

-3

można użyć podzapytania - wybierz top 1

+1

, które działają tylko dla SQL Server –

+0

użyj limitu 1, a następnie. Nie ma sprawy. – ZERO

+3

Oracle również nie obsługuje klauzuli "LIMIT". –

1

W Oracle, jeśli chcesz uzyskać 1 wynik, możesz użyć instrukcji ROWNUM, aby uzyskać pierwsze wartości N zapytania, np .:

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

Problem z tym pojedynczym zapytaniem polega na tym, że Oracle nigdy nie zwraca danych w tej samej kolejności. Więc trzeba oder danych przed użyciem rownum:

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

Twoim przypadku, wygląda jak trzeba tylko 1 wynik, więc zapytanie powinno wyglądać następująco:

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

czy to też nie ograniczy do 1 wiersza z tabeli 1? Muszę tylko 1 wiersz z tabeli 2 przystąpić każdy, ale wszystkie wiersze z tabeli 1. – BostonMacOSX

+0

@BostonMacOSX Już edytowane moją odpowiedź –

+1

nie można odwołać 'T1.ASSIGNMENT' tak w widoku inline od' T1' jest zdefiniowany w wyższy poziom zapytania. Możesz dodać funkcję analityczną partycji według 'T2.ASSIGNMENT_GROUP', a następnie uwzględnić rangę w kryterium łączenia (przykład poniżej). Lub możesz przenieść zapytanie do 'T2' na podzapytanie skalarne na liście' WYBIERZ ', ale może być znacznie mniej wydajne. –

0

W MySQL może po prostu GROUP PRZEZ CESJA i gotowe. Oracle jest bardziej rygorystyczny i nie chce po prostu wybrać (w nieokreślony sposób), które wartości z trzech rzędów do wyboru. Oznacza to, że wszystkie zwrócone kolumny muszą być częścią GROUP BY lub podlegać funkcji agregującej (COUNT, MIN, MAX ...)

Oczywiście można po prostu nie obchodzić i używać funkcji agregacji na zwrócone kolumny.

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 

Jeśli to zrobisz, poważnie wątpię, że potrzebujesz JOIN w pierwszej kolejności.

MySQL może również pomóc w GROUP_CONCAT w przypadku, gdy chcesz uzyskać ciąg sumarycznych wartości grupowych dla kolumny (ludzie często tacy jak oni), ale z Oracle, który jest staggeringly complex.

Posługiwanie się podzapytaniem, jak już sugerowano, jest przykładem, na przykład look here. Pozwala także sortować podzapytanie przed wybraniem górnego wiersza.

+0

To pytanie jest o Oracle, więc wszystkie rzeczy można zrobić w innym db nie ma znaczenia – Forage

5

Możesz zrobić coś takiego.

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) 

ten dzieli dane w table2 przez assignment_group a następnie dowolnie porządkuje je wyciągnąć jeden dowolny wiersz za assignment_group. Jeśli zależy ci na tym, który wiersz zostanie zwrócony (lub jeśli chcesz, aby wiersz był zwrócony deterministycznie), możesz dodać do funkcji analitycznej klauzulę ORDER BY.

+0

mógłbyś dodać (być może wypowiedziało się w oddzielnym wierszu) zamówienia przez klauzula –

+1

@RuneJeppesen - Dodano przykład ' zamów przez. –

Powiązane problemy