【问题标题】:Sql join, 2 tables, same fieldsSql 连接,2 个表,相同的字段
【发布时间】:2011-08-19 01:08:11
【问题描述】:

我有 2 张桌子。为了简化:

表 1,用户:


userId 整数, 用户名 nvarchar(50)


表 2,消息:


msgId 整数, msgFrom int, msgTo int...


msg1 和 msg2,都包含 userId。现在我想获取所有消息,但不是 msgFrom 我想要用户名。我知道在这里做什么:

    select tabMessages.*, tabUsers.userName as Sender 
      from tabMessages 
inner join tabUsers on msgFrom=userId 
where msgId = @someParameter;

一切正常,花花公子。获取用户名而不是 msgTo 相同。现在的问题是,如何在同一个调用中获取两个字段?我想把桌子弄成


msgId、msgFrom、msgTo、发件人、收件人。我尝试过:

    select tabMessages.*, tabUsers.userName as Sender, 
           tabUsers.userName as Recipient 
      from tabMessages 
inner join tabUsers on msgFrom=userId and msgTo=userId 
     where msgId = @someParameter;

但这不起作用。顺便说一句,我用的是Ms sql2000。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用不同的别名加入 users 表两次。首先加入from 列,其次加入to 列。

    select m.*, u1.userName as Sender, u2.userName as Recipient 
    from tabMessages as m 
      inner join tabUsers as u1 
        on u1.userId=m.msgFrom 
      inner join tabUsers as u2 
        on u2.userId=m.msgTo 
    where m.msgId = @someParameter;
    

    【讨论】:

    • +1。但请格式化您的 SQL,以便无需水平滚动即可看到它。
    【解决方案2】:

    您需要加入 tabUsers 两次。一个获取发件人,一个获取收件人:

    SELECT m.*, f.userName as Sender, t.userName as Recipient 
    FRPOM tabMessages AS m
        INNER JOIN tabUsers AS f on m.msgFrom = f.userId
        INNER JOIN tabUsers AS t on m.msgTo = t.userId 
    WHERE m.msgId = @someParameter;
    

    【讨论】:

      【解决方案3】:

      您尝试过 UNION 吗??

      http://www.w3schools.com/sql/sql_union.asp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        相关资源
        最近更新 更多