【发布时间】:2012-03-07 11:30:26
【问题描述】:
如果我有两个表,例如:
表 1(产品)
id
name
price
agentid
表2(代理)
userid
name
email
如何从包含代理姓名和电子邮件(即products.agentid = agent.userid)的产品中获取结果集?
我如何加入例如SELECT WHERE price < 100?
【问题讨论】:
标签: sql sql-server select
如果我有两个表,例如:
表 1(产品)
id
name
price
agentid
表2(代理)
userid
name
email
如何从包含代理姓名和电子邮件(即products.agentid = agent.userid)的产品中获取结果集?
我如何加入例如SELECT WHERE price < 100?
【问题讨论】:
标签: sql sql-server select
如果您不想使用内部联接(或没有可能这样做!)并且想要合并行,您可以使用交叉联接:
SELECT *
FROM table1
CROSS JOIN table2
或者干脆
SELECT *
FROM table1, table2
【讨论】:
这是我对 Prod 中稍大的表的联接。希望它有所帮助。
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;
【讨论】:
已编辑以支持价格过滤器
您可以使用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 将了解您的意图(无论您选择何种方式来解决此问题)并以最快的方式处理它。
【讨论】:
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)
【讨论】:
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
【讨论】:
这是一个非常初级的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。如果products中有NULL agentid,则使用LEFT OUTER JOIN代替,即使是没有代理的产品也可以返回。
【讨论】:
JOIN 解释为 INNER JOIN 而不是其他东西。 (其他 RDBMS 将隐含地执行 INNER JOIN 以获取裸露的 JOIN)。 INNER JOIN 仅返回两个表中具有匹配值的行。
INNER 关键字对于内部联接是可选的。我更喜欢包含它只是为了明确并使代码更具自我记录性。在具有内部和外部联接的复杂查询中,显式使所有联接类型更加可见。