2012-02-16 20 views
7

So che questo è probabilmente molto semplice, ma devo aver dormito quando insegnavano che a scuola :)Combinare due tabelle in Select (SQL Server 2008)

Se ho due tabelle, come questo ad esempio:

Tabella 1 (prodotti)

id 
name 
price 
agentid 

Tabella 2 (agente)

userid 
name 
email 

Come faccio a ottenere un risultato in sé t dai prodotti che includono il nome e l'e-mail dell'agente, ovvero products.agentid = agent.userid

Grazie per le risposte veloci, ma ho dimenticato WHERE. Come posso far parte per esempio SELECT WHERE price < 100

+0

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

+0

-1 ci deve essere un milione di tutorial sul web per questo. –

risposta

18

modificato per supportare il filtro prezzo

È possibile utilizzare la clausola INNER JOIN di unirsi tali tabelle. E 'fatto in questo modo:

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 

Un altro modo per farlo è da una clausola WHERE:

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 nel secondo caso si stanno facendo un prodotto naturale di tutte le righe da entrambe le tabelle e poi filtrare il risultato. Nel primo caso stai filtrando direttamente il risultato mentre ti unisci allo stesso passo. Il DBMS capirà le tue intenzioni (indipendentemente dal modo in cui sceglierai di risolverlo) e lo gestirà nel modo più veloce.

+0

Grazie per la modifica. E funziona come un fascino. Sono andato per la prima versione :) – Jesper

+2

Mi raccomando contro il secondo formato, per due motivi: (1) è molto facile abbandonare del tutto i criteri di join, e chiedersi perché improvvisamente hai un prodotto cartesiano, e (2) il ' Il formato INNER JOIN' rende molto più semplice separare i criteri di join dai criteri di filtro, rendendo la query più facile da analizzare per gli altri. –

+0

Totalmente d'accordo. È anche molto più facile da leggere e, quindi, più veloce da capire il primo che il secondo –

6

Questo è molto rudimentale INNER JOIN:

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

vi consiglio di rivedere base JOIN sintassi e concetti. Here's a link to Microsoft's documentation, anche se quello che hai sopra è abbastanza universale come standard SQL.

Si noti che lo INNER JOIN presuppone che ogni prodotto sia associato a agentid che non è NULL. Se sono disponibili NULL agentid in products, utilizzare invece LEFT OUTER JOIN per restituire anche i prodotti senza alcun agente.

+0

Ho notato che hai cambiato la tua risposta da JOIN a INNER JOIN, puoi spiegare brevemente perché? E anche aiutarmi su dove inserire la clausola WHERE ... – Jesper

+0

@Jesper perché ho dimenticato per un secondo se SQL Server ha interpretato un semplice 'JOIN' come un' INNER JOIN' piuttosto che qualcos'altro. (Gli altri RDBMS "implicitamente faranno" INNER JOIN "per un semplice' JOIN'). Il 'INNER JOIN' restituisce solo le righe che hanno valori corrispondenti da entrambe le tabelle. –

+1

La parola chiave 'INTERO' è facoltativa per un join interno. Preferisco includerlo solo per essere esplicito e rendere il codice molto più auto-documentante.In una query complessa con join interni ed esterni, l'esplicitazione mantiene tutti i tipi di join più visibili. –

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

Questo è il mio join per i tavoli leggermente più grandi in Prod.Hope aiuta.

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;