【问题标题】:Join two tables returning only one row from the second table加入两个表,仅从第二个表返回一行
【发布时间】:2015-09-02 10:54:04
【问题描述】:

我有这个问题:

SELECT   t_ticket.ticketID, t_ticket.addedDate, t_ticket.question,
t_ticket.code, t_ticket.priority, t_actionTicket.addedDateAction, t_actionTicket.title 

FROM            t_actionTicket INNER JOIN
                     t_ticket ON t_actionTicket.ticketID_FK = t_ticket.ticketID INNER JOIN
                         (SELECT        ticketID_FK, MAX(addedDateAction) AS maxDate
                            FROM            t_actionTicket AS t_actionTicket_1
                            WHERE        (t_actionTicket.userID_FK <> @userid)
                            GROUP BY ticketID_FK) AS b ON t_actionTicket.ticketID_FK = b.ticketID_FK AND t_actionTicket.addedDateAction = b.maxDate
WHERE        (t_ticket.supporterID_FK IN
                         (SELECT        supporterID
                            FROM            t_Supporter
                            WHERE        (userID_FK = @userid)))

我只想返回 t_actionTicket 表中 t_actionTicket.userID_FK @userid 的 t_ticket 表中每一行的最新记录。 但我有这个错误:

多部分标识符“t_actionTicket.userID_FK”不能 绑定。

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    您的查询存在问题

    FROM            t_actionTicket AS t_actionTicket_1
    WHERE        t_actionTicket.userID_FK <> @userid -- here
    

    您不能在 inner join 选择查询中使用 t_actionTicket 别名。您需要使用t_actionTicket_1。只有sub-query才有可能

    试试这个更好的方法

    ;WITH cte
         AS (SELECT t_ticket.ticketID,
                    t_ticket.addedDate,
                    t_ticket.question,
                    t_ticket.code,
                    t_ticket.priority,
                    t_actionTicket.addedDateAction,
                    t_actionTicket.title,
                    Row_number()
                      OVER(
                        partition BY ticketID_FK
                        ORDER BY addedDateAction DESC) RN
             FROM   t_actionTicket
                    INNER JOIN t_ticket
                            ON t_actionTicket.ticketID_FK = t_ticket.ticketID
             WHERE  t_ticket.supporterID_FK IN (SELECT supporterID
                                                FROM   t_Supporter
                                                WHERE  userID_FK = @userid))
    SELECT *
    FROM   cte
    WHERE  rn = 1 
    

    【讨论】:

      【解决方案2】:

      您可以使用row_number() 代替额外的嵌套查询来编写此逻辑:

      SELECT t.ticketID, t.addedDate, t.question, t.code, t.priority,
             ta.addedDateAction, ta.title AS Expr1
      FROM  t_Ticket t INNER JOIN
            (SELECT ta.*,
                    ROW_NUMBER() OVER (PARTITION BY ta.ticketID_FK ORDER BY ta.addedDateAction DESC) as seqnum
             FROM t_actionTicket ta
            ) ta
            ON t.ticketId = ta.ticketId_FK and ta.seqnum = 1
      WHERE t.supporterID_FK IN (SELECT supporterID
                                 FROM t_Supporter
                                 WHERE userID_FK = @userid
                                );
      

      请注意,表别名使查询更易于编写和阅读。

      【讨论】:

        【解决方案3】:

        试试这个查询

        SELECT   t_ticket.ticketID, t_ticket.addedDate, t_ticket.question,
        t_ticket.code, t_ticket.priority, t_actionTicket.addedDateAction, t_actionTicket.title 
        
        FROM            t_actionTicket
         INNER JOIN t_ticket ON t_actionTicket.ticketID_FK = t_ticket.ticketID 
         INNER JOIN (SELECT        ticketID_FK, MAX(addedDateAction) AS maxDate
                                    FROM            t_actionTicket AS t_actionTicket_1
                                    WHERE        (t_actionTicket_1.userID_FK <> @userid)
                                    GROUP BY ticketID_FK) AS b ON t_actionTicket.ticketID_FK = b.ticketID_FK AND t_actionTicket.addedDateAction = b.maxDate
        
        WHERE        (t_ticket.supporterID_FK IN
                                 (SELECT        supporterID
                                    FROM            t_Supporter
                                    WHERE        (userID_FK = @userid)))
        

        【讨论】:

          猜你喜欢
          • 2018-04-24
          • 2012-11-25
          • 1970-01-01
          • 2019-03-18
          • 1970-01-01
          • 2020-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多