连接两个表,只返回第二个表中的一行

时间:2015-09-02 10:54:05

标签: sql sql-server join

我有这个问题:

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表中的每一行返回t_actionTicket.userID_FK&lt;&gt;中的每一行的最新记录。 @用户身份。 但我有这个错误:

  

多部分标识符“t_actionTicket.userID_FK”不可能   界。

3 个答案:

答案 0 :(得分:0)

您可以使用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
                          );

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

答案 1 :(得分:0)

您的查询中的问题是

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

您无法在t_actionTicket选择查询中使用inner join别名。您需要使用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 :(得分:0)

尝试此查询

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)))