SQL LEFT JOIN solo en la primera fila

Supongamos que tenemos ese set de datos:

Tabla: DataTable1

ID ExperienceId LanguageId ... ------------------------------------------- 1 1 1 2 1 2 3 1 3 4 2 1 5 2 2 6 2 3 7 3 1 8 3 2 9 3 3 ... 

Tabla: DataTable2

 ID SomeId OtherId LanguageId ... ------------------------------------------- 1 459 1 1 2 459 1 2 3 459 1 3 4 245 2 1 5 245 2 2 6 245 2 3 7 295 3 1 8 295 3 2 9 295 3 3 ... 

Quiero unirme a esas tablas y get solo la columna SomeId ignorando la columna LanguageId. Para hacerlo más claro:

 SELECT t2.SomeId AS RequinetworkingId -- ...other data mainly from t2 FROM DataTable1 AS t1 LEFT JOIN DataTable2 AS t2 ON t2.OtherId = t1.ExperienceId AND t2.LanguageId = (SELECT TOP 1 t1.LanguageId ORDER BY t1.LanguageId) 

Esta consulta debería devolver (si no estaba mal, claramente) las filas:

 SomeId ... ---------------- 459 ... 245 ... 295 ... ... 

Ahora devuelve tres veces datos idénticos (con solo LanguageId diferente).

Intentaría filtrarlo con WHERE t1.LanguageId = 1 si estaba seguro de que siempre existe, pero no estoy seguro. Las filas pueden estar con LanguageId de 1 a 3, también pueden ser solo con ID 2, etc. Las filas seguramente tendrán al less un ID de LanguageId .

Ahora mi pregunta es: ¿cómo puedo unir tablas con valores únicos con una columna completamente ignorada ?

Envolverlo en otra consulta ¿funciona?

 SELECT RequinetworkingId, <all_the_other_fields> from ( SELECT t2.SomeId AS RequinetworkingId -- ...other data mainly from t2 FROM DataTable1 AS t1 LEFT JOIN DataTable2 AS t2 ON t2.OtherId = t1.ExperienceId AND t2.LanguageId = (SELECT TOP 1 t1.LanguageId ORDER BY t1.LanguageId) ) group by RequinetworkingId, <all_the_other_fields> 

o incluso no extraer la columna en primer lugar?

 SELECT distinct t2.SomeId AS RequinetworkingId -- ...other data mainly from t2 BUT not the Language id FROM DataTable1 AS t1 LEFT JOIN DataTable2 AS t2 ON t2.OtherId = t1.ExperienceId AND t2.LanguageId = (SELECT TOP 1 t1.LanguageId ORDER BY t1.LanguageId) 

Para tales cosas cuando necesita seleccionar top en la subconsulta CROSS APPLY O ' OUTER APPLY ' es muy útil

 t2.SomeId AS RequinetworkingId -- ...other data mainly from t2 FROM DataTable1 AS t1 OUTER APPLY ( SELECT TOP 1 t1.LanguageId FROM DataTable2 WHERE DataTable2 .OtherId = t1.ExperienceId AND t2.LanguageId = t1.LanguageId ORDER BY t1.LanguageId ) AS t2 

Prueba esto:

 ;with cte as (select *, row_number() over (partition by someid order by languageid) rn from datatable2) select * from datatable1 dt left join cte c on dt.experienceid = c.otherid and c.rn = 1 

Prueba esto:

 SELECT DISTINCT t2.SomeId AS RequinetworkingId -- ...other data mainly from t2 FROM DataTable1 AS t1 LEFT JOIN DataTable2 AS t2 ON t2.OtherId = t1.ExperienceId WHERE t2.LanguageId = t1.LanguageId 

¿Estás buscando esto (Fiddle: http://sqlfiddle.com/#!3/811b8/12 ) ?:

 SELECT dt2.* FROM DataTable1 dt1 INNER JOIN DataTable2 dt2 ON dt1.ExperienceID = dt2.OtherID AND dt1.LanguageID = dt2.LanguageID WHERE dt2.LanguageID = (SELECT MIN(LanguageID) FROM DataTable1); 

produce:

 ID SOMEID OTHERID LANGUAGEID 1 459 1 1 4 245 2 1 7 295 3 1 

Si está utilizando LanguageID con tipo int , puede probar la function MAX o MIN para seleccionar

ex:

 SELECT MIN(LanguageID)