2012-02-16 14 views
7

Sé que esto es probablemente muy básico, pero debo haber estado durmiendo cuando enseñaban que en la escuela :)Combinar dos tablas de Select (SQL Server 2008)

Si tengo dos tablas, como este por ejemplo:

Tabla 1 (productos)

id 
name 
price 
agentid 

Tabla 2 (agente)

userid 
name 
email 

¿Cómo llego resultado se t de productos que incluyen el nombre de los agentes y el correo electrónico, lo que significa que products.agentid = agent.userid

Gracias por sus respuestas rápidas, pero olvidé WHERE. ¿Cómo me uno, por ejemplo, SELECT WHERE price < 100

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

+0

-1 tiene que haber un millón de tutoriales en la web para esto. –

Respuesta

18

Editado para apoyar filtro de precio

Puede utilizar la cláusula INNER JOIN para unirse a esas tablas. Se hace de esta manera:

select p.id, p.name as ProductName, a.userid, a.name as AgentName 
from products p 
inner join agents a on a.userid = p.agentid 
where p.price < 100 

Otra forma de hacerlo es mediante un WHERE cláusula:

select p.id, p.name as ProductName, a.userid, a.name as AgentName 
from products p, agents a 
where a.userid = p.agentid and p.price < 100 

Nota en el segundo caso que usted está haciendo un producto natural de todas las filas de ambas tablas y luego filtrando el resultado En el primer caso, filtra directamente el resultado mientras se une en el mismo paso. El DBMS comprenderá sus intenciones (independientemente de la forma en que elija resolver esto) y lo manejará de la manera más rápida.

+0

Gracias por la edición. Y funciona como un encanto. Fui a la primera versión :) – Jesper

+2

Recomiendo en contra del segundo formato, por dos razones: (1) es muy fácil omitir accidentalmente los criterios de combinación por completo, y se preguntan por qué de repente tiene un producto cartesiano, y (2) el ' El formato INNER JOIN' hace que sea mucho más fácil separar los criterios de unión de los criterios de filtro, haciendo que la consulta sea más fácil de analizar para otros. –

+0

Totalmente de acuerdo. También es mucho más fácil de leer y, por lo tanto, más rápido de entender el primero que el segundo –

6

Esta es una muy rudimentaria INNER JOIN:

SELECT 
    products.name AS productname, 
    price, 
    agent.name AS agentname 
    email 
FROM 
    products 
    INNER JOIN agent ON products.agentid = agent.userid 

Recomiendo revisar JOIN sintaxis y conceptos básicos. Here's a link to Microsoft's documentation, aunque lo que tiene encima es bastante universal como el estándar SQL.

Tenga en cuenta que el INNER JOIN aquí supone que cada producto tiene asociado agentid que no es NULO. Si hay NULL agentid en products, utilice LEFT OUTER JOIN lugar para volver incluso los productos sin agente.

+0

Noté que cambió su respuesta de JOIN para INNER JOIN, se puede explicar brevemente por qué? Y también me ayude en donde poner en la cláusula WHERE ... – Jesper

+0

@Jesper porque se me olvidó por un segundo si SQL Server interpreta un desnudo '' JOIN' como JOIN' interior más que otra cosa. (Otro RDBMS 'hará implícitamente 'INNER JOIN' para un' JOIN' desnudo). El 'INNER JOIN' solo devuelve filas que tienen valores coincidentes de ambas tablas. La palabra clave –

+1

'INNER' es opcional para una unión interna. Prefiero incluirlo solo para ser explícito y hacer que el código sea mucho más autodocumentado.En una consulta compleja con uniones internas y externas, ser explícito hace que todos los tipos de unión sean más visibles. –

0
select ProductName=p.[name] 
, ProductPrice=p.price 
, AgentName=a.[name] 
, AgentEmail=a.email 
from products p 
inner join agent a on a.userid=p.agentid 
1
select p.name productname, p.price, a.name as agent_name, a.email 
from products p 
inner join agent a on (a.userid = p.agentid) 
1

Este es mi unen para mesas un poco más grandes en Prod.Hope que ayuda.

SELECT TOP 1000 p.[id] 
     ,p.[attributeId] 
     ,p.[name] as PropertyName 
     ,p.[description] 
     ,p.[active], 
     a.[appId], 
     a.[activityId], 
     a.[Name] as AttributeName 
    FROM [XYZ.Gamification.V2B13.Full].[dbo].[ADM_attributeProperty] p 
    Inner join [XYZ.Gamification.V2B13.Full].[dbo].[ADM_activityAttribute] a 
    on a.id=p.attributeId 
    where a.appId=23098; 
Cuestiones relacionadas