2012-02-16 25 views
7

我知道這可能是很基本的,但我必須教他們的時候都在睡覺,在學校:)將兩分表中選擇(SQL Server 2008中)

如果我有兩個表,像這樣的例子:

表1(產品)

id 
name 
price 
agentid 

表2(代理)

userid 
name 
email 

我如何得到一個結果本身包括代理商名稱和電子郵件,意思是products.agentid = agent.userid

謝謝你的快速答案,但我忘了WHERE。我如何加入例如SELECT WHERE price < 100

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ – 2012-07-26 08:17:16

+0

-1必須有網絡這個上萬元的教程。 – 2012-07-26 08:19:03

回答

18

編輯,以支持價格過濾

可以使用INNER JOIN條款加入這些表。它這樣做的方式:

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 

另一種方式做,這是一個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 

注意,在你從兩個表,然後讓所有行的天然產物第二種情況過濾結果。在第一種情況下,您在加入同一步驟時直接過濾結果。 DBMS將理解你的意圖(不管你選擇解決這個問題的方式)並以最快的方式處理它。

+0

感謝您的編輯。它就像一個魅力。第一個版本:) – Jesper 2012-02-16 03:37:00

+2

我建議不要使用第二種格式,原因有兩個:(1)很容易意外地忽略了加入標準,並想知道爲什麼你突然有一個笛卡爾積,(2) INNER JOIN'格式使得從過濾標準中分離連接標準變得更加容易,使查詢更容易解析其他標準。 – 2012-02-16 03:39:33

+0

完全同意。它也更容易閱讀,因此,更快地理解第一個而不是第二個 – 2012-02-16 03:42:01

6

這是一個非常基本的INNER JOIN

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

建議您查看基本JOIN語法和概念。 Here's a link to Microsoft's documentation,儘管上面的標準SQL非常普遍。

請注意,INNER JOIN此處假定每個產品都有一個不爲NULL的關聯agentid。如果products中存在NULL agentid,則使用LEFT OUTER JOIN代替即使沒有代理的產品也會返回。

+0

我注意到你把答案從JOIN改爲INNER JOIN,你能簡單解釋一下爲什麼嗎?並幫助我在何處放置WHERE子句...... – Jesper 2012-02-16 03:16:50

+0

@Jesper,因爲我忘記了SQL Server是否將一個裸JOIN'解釋爲INNER JOIN而不是別的東西。 (其他RDBMS'將隱含地爲''JOIN'完成'INNER JOIN')。 INNER JOIN只返回兩個表中具有匹配值的行。 – 2012-02-16 03:19:22

+1

對於內部聯接,「INNER」關鍵字是可選的。我更喜歡將它包含在內,以使代碼更加自我記錄。在具有內連接和外連接的複雜查詢中,顯式保持所有連接類型更加可見。 – 2012-02-16 03:41:38

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

這是我加入Prod.Hope中稍大的表格它幫助。

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;