2012-02-16 1 views
7

Tôi biết điều này có lẽ rất cơ bản, nhưng tôi đã phải ngủ khi họ dạy điều đó ở trường :)Kết hợp hai bảng trong Chọn (SQL Server 2008)

Nếu tôi có hai bảng, ví dụ như:

Bảng 1 (sản phẩm)

id 
name 
price 
agentid 

Bảng 2 (đại lý)

userid 
name 
email 

làm thế nào để có được kết quả a se t từ các sản phẩm bao gồm tên đại lý và email, có nghĩa là products.agentid = agent.userid

Cảm ơn bạn đã trả lời nhanh, nhưng tôi quên WHERE. Làm thế nào để tham gia ví dụ SELECT WHERE price < 100

+0

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

+0

-1 thì phải có một triệu hướng dẫn trên web cho việc này. –

Trả lời

18

Edited để hỗ trợ lọc giá

Bạn có thể sử dụng mệnh đề INNER JOIN tham gia những bảng. Nó được thực hiện theo cách này:

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 

Một cách khác để làm điều này là bởi một điều khoản 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 

Lưu ý trong trường hợp thứ hai bạn đang làm cho một sản phẩm tự nhiên của tất cả các dòng từ hai bảng và sau đó lọc kết quả. Trong trường hợp đầu tiên bạn lọc trực tiếp kết quả trong khi tham gia cùng một bước. DBMS sẽ hiểu ý định của bạn (bất kể cách bạn chọn để giải quyết điều này) và xử lý nó theo cách nhanh nhất.

+0

Cảm ơn bạn đã chỉnh sửa. Và nó hoạt động như một sự quyến rũ. Đã đề xuất với định dạng thứ nhất :) – Jesper

+2

Tôi khuyên bạn nên chống lại định dạng thứ hai, vì hai lý do: (1) rất dễ dàng vô tình bỏ qua các tiêu chí tham gia, và tự hỏi tại sao bạn đột nhiên có một sản phẩm Descartes, và (2) Định dạng INNER JOIN' giúp dễ dàng tách biệt tiêu chí tham gia khỏi tiêu chí lọc, giúp truy vấn dễ dàng hơn để phân tích cú pháp cho những người khác. –

+0

Hoàn toàn đồng ý. Nó cũng dễ đọc hơn và do đó, nhanh hơn để hiểu cái đầu tiên hơn cái thứ hai –

6

Đây là một rất thô sơ INNER JOIN:

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

tôi khuyên bạn nên xem xét JOIN cú pháp cơ bản và khái niệm. Here's a link to Microsoft's documentation, mặc dù những gì bạn có ở trên khá phổ biến như SQL tiêu chuẩn.

Lưu ý rằng INNER JOIN ở đây giả định mỗi sản phẩm có một liên kết agentid không phải là NULL. Nếu có NULL agentid trong products, hãy sử dụng LEFT OUTER JOIN để trả lại ngay cả các sản phẩm không có tác nhân.

+0

Tôi nhận thấy bạn đã thay đổi câu trả lời của bạn từ JOIN thành INNER JOIN, bạn có thể giải thích ngắn gọn lý do tại sao? Và cũng giúp tôi về nơi để đưa vào mệnh đề WHERE ... – Jesper

+0

@ Jesper vì tôi đã quên mất một giây cho dù SQL Server giải thích một 'JOIN' trần như là một' INNER JOIN' hơn là cái gì khác. (Các RDBMS khác 'sẽ ngầm làm 'INNER JOIN' cho một' JOIN' trống. 'INNER JOIN' chỉ trả về các hàng có các giá trị khớp nhau từ cả hai bảng. –

+1

Từ khóa 'INNER' là tùy chọn cho tham gia bên trong. Tôi muốn bao gồm nó chỉ để được rõ ràng và làm cho mã mà nhiều hơn nữa tự tài liệu.Trong một truy vấn phức tạp với cả các kết nối bên trong và bên ngoài, rõ ràng là giữ tất cả các kiểu kết nối hiển thị nhiều hơn. –

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

Đây là sự tham gia của tôi đối với các bảng lớn hơn một chút trong Prod.Hope nó giúp.

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;