2012-02-16 5 views
7

Я знаю, что это, вероятно, очень простой, но я должен был спать, когда они учили, что в школе :)Объединение двух таблиц в Select (SQL Server 2008)

Если у меня есть две таблицы, как это, например:

Таблица 1 (продукты)

id 
name 
price 
agentid 

Таблица 2 (агент)

userid 
name 
email 

Как получить результат С.Е. t от продуктов, которые включают имя агента и адрес электронной почты, что означает, что products.agentid = agent.userid

Спасибо за ваши быстрые ответы, но я забыл WHERE. Как присоединиться к примеру SELECT WHERE price < 100

+0

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

+0

-1 должно быть миллион учебников в Интернете для этого. –

ответ

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 

Примечание во втором случае вы делаете естественный продукт всех строк из обеих таблиц, а затем фильтруя результат. В первом случае вы напрямую фильтруете результат, присоединяясь к тому же шагу. СУБД будет понимать ваши намерения (независимо от того, как вы решите это решить) и обрабатывать его самым быстрым способом.

+0

Спасибо за редактирование. И это работает как шарм. Пошел на первую версию :) – Jesper

+2

Я рекомендую использовать второй формат по двум причинам: (1) очень легко случайно исключить критерии присоединения и задаться вопросом, почему у вас вдруг есть декартово произведение, и (2) INNER JOIN' значительно упрощает разделение критериев отбора по критериям фильтра, что упрощает анализ запроса для других. –

+0

Полностью согласен. Это также намного легче читать и, следовательно, быстрее понять первый, чем второй –

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 предполагает, что каждый продукт имеет ассоциированный agentid, который не является NULL. Если NULL agentid в products, используйте LEFT OUTER JOIN вместо этого, чтобы вернуть даже продукты без агента.

+0

Я заметил, что вы изменили свой ответ от JOIN до INNER JOIN, можете ли вы вкратце объяснить, почему? А также помогите мне в том, где положить предложение WHERE ... – Jesper

+0

@ Jesper, потому что я забыл на секунду, не интерпретировал ли SQL Server «JOIN» как «INNER JOIN», а не что-то еще. (Другие РСУБД будут неявно делать 'INNER JOIN' для голого' JOIN'). «INNER JOIN» возвращает строки, имеющие соответствующие значения из обеих таблиц. –

+1

Ключевое слово 'INNER' является необязательным для внутреннего соединения. Я предпочитаю включать его только для того, чтобы быть явным и сделать код более самодокументированным.В сложном запросе с внутренним и внешним соединениями, будучи явным, все типы соединений становятся более видимыми. –

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; 
Смежные вопросы