【问题标题】:Combine Two Tables in Select (SQL Server 2008)在 Select 中合并两个表 (SQL Server 2008)
【发布时间】: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】:

    如果您不想使用内部联接(或没有可能这样做!)并且想要合并行,您可以使用交叉联接:

    SELECT *
    FROM table1
    CROSS JOIN table2
    

    或者干脆

    SELECT *
    FROM table1, table2
    

    【讨论】:

    • 这将带来第一个表中的重复列表。
    【解决方案2】:

    这是我对 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;
    

    【讨论】:

      【解决方案3】:

      已编辑以支持价格过滤器

      您可以使用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 将了解您的意图(无论您选择何种方式来解决此问题)并以最快的方式处理它。

      【讨论】:

      • 感谢您的编辑。它就像一个魅力。去了第一个版本:)
      • 我建议不要使用第二种格式,原因有两个:(1) 很容易完全不小心遗漏连接条件,并且想知道为什么突然有了笛卡尔积,以及 (2) @ 987654325@ 格式可以更轻松地将连接条件与过滤条件分开,从而更容易为其他人解析查询。
      • 完全同意。它也更容易阅读,因此理解第一个比第二个更快
      【解决方案4】:
      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)
      

      【讨论】:

        【解决方案5】:
        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
        

        【讨论】:

          【解决方案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。如果products中有NULL agentid,则使用LEFT OUTER JOIN代替,即使是没有代理的产品也可以返回。

          【讨论】:

          • 我注意到您将答案从 JOIN 更改为 INNER JOIN,您能简单解释一下原因吗?并且还帮助我将 WHERE 子句放在哪里...
          • @Jesper 因为我暂时忘记了 SQL Server 是否将裸露的 JOIN 解释为 INNER JOIN 而不是其他东西。 (其他 RDBMS 将隐含地执行 INNER JOIN 以获取裸露的 JOIN)。 INNER JOIN 仅返回两个表中具有匹配值的行。
          • INNER 关键字对于内部联接是可选的。我更喜欢包含它只是为了明确并使代码更具自我记录性。在具有内部和外部联接的复杂查询中,显式使所有联接类型更加可见。
          猜你喜欢
          • 1970-01-01
          • 2017-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-30
          • 2010-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多