繁体   English   中英

连接两个表,仅从第二个表返回一行

[英]Join two tables returning only one row from the second table

我有这个查询:

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_ticket表中的每一行返回t_actionTicket表中的最新记录,即t_actionTicket.userID_FK <> @userid。 但是我有这个错误:

无法绑定多部分标识符“ t_actionTicket.userID_FK”。

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

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

您查询的问题是

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

您不能在inner join t_actionTicket选择查询中使用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 

试试这个查询

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM