2012-04-19 25 views
6

Así que creo que he visto una solución a esto, pero todas son consultas muy complicadas. Estoy en Oracle 11g como referencia.¿Cómo limito la cantidad de filas devueltas por esta UNIÓN IZQUIERDA a una?

Lo que tengo es uno simple para muchos que funciona bien pero no necesito muchos. Solo quiero que la tabla de la izquierda (la única) se una a cualquier fila que cumpla los criterios de unión ... no muchas filas.

Necesito hacer esto porque la consulta se encuentra en un paquete de continuación que cuenta por lo que si hago la izquierda normal unirse a recibo 5 filas donde sólo debería llegar 1.

Así ejemplo datos es el siguiente:

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 

lo que tengo que hacer es unir estas dos tablas en ASSIGNMENT = ASSIGNMENT_GROUP pero solo tengo 1 fila devuelta.

cuando hago una combinación izquierda consigo tres filas devueltas beaucse que es la naturaleza de HTE combinación izquierda

+3

¿Por qué está etiquetado MySQL? –

+2

Aunque hay muchas respuestas publicadas, es imposible saber lo que necesita si no explica por qué solo quiere 1 fila. ¿Realmente quieres un usuario aleatorio por grupo de asignación? ¿Para qué? – winkbrace

Respuesta

7

Si Oracle es compatible con el número de fila (partición) puede crear una selección sub consulta en la fila es igual a 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

podría publicar una declaración SQL de ejemplo basada en la consulta anterior. Sé que puedes hacer una subconsulta sin estar seguro de la sintaxis. – BostonMacOSX

+3

no tan fácil de tocar en un teléfono ... –

-3

puede utilizar subconsulta - seleccione la parte superior 1

+1

que solo funciona para SQL Server –

+0

use el límite 1 a continuación. No es gran cosa. – ZERO

+3

Oracle tampoco admite la cláusula 'LIMIT'. –

1

En Oracle, si quiere 1 resultado, puede usar la declaración ROWNUM para obtener los primeros N valores de una consulta, por ejemplo:

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

El problema con esta única consulta es que Oracle nunca devuelve los datos en el mismo orden. Por lo tanto, debe oder sus datos antes de su uso rownum:

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

Para su caso, parece que sólo necesita 1 resultado, por lo que la consulta debe verse como:

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

¿no me limitará esto a 1 fila de la tabla 1 también? Solo necesito 1 fila de la tabla de unión 2, pero todas las filas de la tabla 1. – BostonMacOSX

+0

@BostonMacOSX Ya he editado mi respuesta –

+1

No se puede hacer referencia 'T1.ASIGNMENT' como esa en su vista en línea ya que' T1' se define en un nivel más alto de la consulta. Puede agregar una función analítica que particione por 'T2.ASSIGNMENT_GROUP' y luego incluya el rango en los criterios de unión (un ejemplo de esto está más abajo). O puede mover la consulta contra 'T2' en una subconsulta escalar en su lista' SELECT' aunque eso puede ser mucho menos eficiente. –

0

En MySQL sólo podría GRUPO POR ASIGNACIÓN y listo. Oracle es más estricto y se niega a elegir (de forma indefinida) qué valores de las tres filas elegir. Eso significa que todas las columnas devueltas deben ser parte de GROUP BY o estar sujetas a una función agregada (COUNT, MIN, MAX ...)

Por supuesto, puede elegir no preocuparse y usar alguna función agregada en las columnas devueltas

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 

Si haces eso, seriamente dudo que necesites el JOIN en primer lugar.

MySQL también podría ayudar con GROUP_CONCAT en el caso de que desea una concatenación de cadenas de valores del grupo para una columna (seres humanos a menudo por el estilo), pero con Oracle que es staggeringly complex.

Usando una subconsulta como ya se sugirió es una opción, look here para un ejemplo. También le permite ordenar la subconsulta antes de seleccionar la fila superior.

+0

Esta pregunta es sobre Oracle, por lo que todas las cosas que puede hacer en un db diferente no importan – Forage

5

Podría hacer algo como esto.

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) 

Este particiones los datos en table2 por assignment_group y luego los ordena de forma arbitraria para tirar de una fila arbitraria por assignment_group. Si le importa qué fila se devuelve (o si desea que la fila sea determinística), puede agregar una cláusula ORDER BY a la función analítica.

+0

¿Podría agregar (tal vez comentado en su propia línea) el orden por la cláusula –

+1

@RuneJeppesen? Agregó un ejemplo de ' ordenar por' –

Cuestiones relacionadas