Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL与最新记录左连接_Sql_Sql Server_Tsql - Fatal编程技术网

SQL与最新记录左连接

SQL与最新记录左连接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我只想左键联接一个具有最新记录的表。 我有Customer1表: +----+-----+ |CustID | CustName| +----+-----+ |1 | ABC123| |2 | 456XYZ| |3 | 5PQR3| |4 | 789XYZ| |5 | 789A| +----+-----+ 销售发票表: +------+----+------+ |投资日期|客户ID |投资编号| +------+----+------+ |2020-03-01 | 1 | IV236| |202

我只想左键联接一个具有最新记录的表。 我有Customer1表:

+----+-----+ |CustID | CustName| +----+-----+ |1 | ABC123| |2 | 456XYZ| |3 | 5PQR3| |4 | 789XYZ| |5 | 789A| +----+-----+ 销售发票表:

+------+----+------+ |投资日期|客户ID |投资编号| +------+----+------+ |2020-03-01 | 1 | IV236| |2020-04-07 | 1 | IV644| |2020-06-13 | 2 | IV869| |2020-03-29 | 3 | IV436| |2020-02-06 | 3 | IV126| +------+----+------+ 我想要这个必需的输出:

+----+------+------+ |客户ID |投资日期|投资编号| +----+------+------+ |1 | 2020-04-07 | IV644| |2 | 2020-06-13 | IV869| |3 | 2020-03-29 | IV436| | 4 | | | | 5 | | | +----+------+------+ 为了方便快捷,下面是示例代码

如果存在Customer1,则删除表 创建表Customer1CustID int,CustName varchar 100 插入到Customer1值中 1、‘ABC123’, 2,'456XYZ', 3、'5PQR3', 4,'789XYZ', 5,'789A' 如果存在销售发票,则删除表 创建表SalesInvoiceInvDate DATE,CustID INT,InvNumber varchar 100 插入到SalesInvoice值中 “2020-03-01”,1,“IV236”, '2020-04-07',1,'IV644', “2020-06-13”,2,“IV869”, “2020-03-29”,3,“IV436”, '2020-02-06',3,'IV126' 我建议你:

外部应用实现一种称为横向连接的特殊类型的连接。这是一个非常强大的构造。但在了解它们时,您可以将横向联接视为一个相关子查询,它可以返回多个列和多个行。

我建议您:

外部应用实现一种称为横向连接的特殊类型的连接。这是一个非常强大的构造。但是,当了解它们时,您可以将横向联接视为一个相关子查询,它可以返回多个列和多个行。

在这种情况下,我喜欢使用带连接的TOP 1:

SELECT TOP 1 WITH TIES c.CustID, i.InvDate, i.InvNumber
FROM #Customer1 c
LEFT JOIN #Invoices i ON c.CustID = i.CustID
ORDER BY ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY i.InvDate DESC);
这里的第一个技巧是按行号订购,为每个客户分配一个序列,序列按发票日期递减。然后,这种方法只保留每个客户的最新发票记录。

在这种情况下,我喜欢使用带领带的TOP 1:

SELECT TOP 1 WITH TIES c.CustID, i.InvDate, i.InvNumber
FROM #Customer1 c
LEFT JOIN #Invoices i ON c.CustID = i.CustID
ORDER BY ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY i.InvDate DESC);

这里的第一个技巧是按行号订购,为每个客户分配一个序列,序列按发票日期递减。然后,这种方法只保留每个客户的最新发票记录。

您可以尝试使用行数窗口功能,而不是使用这个简单的自我解释的T-SQL进行横向联接

SELECT      c.CustID
            , d.InvDate
            , d.InvNumber
FROM        #C c
LEFT JOIN   (
            SELECT  *
                    , ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY InvDate DESC) AS RowNo
            FROM    #D
            ) d
ON          c.CustID = d.CustID
            AND d.RowNo = 1

基本上,行号用于在一次表扫描中过滤最后一张发票,而不是执行选择前1。。。相关查询中的ORDER BY必须执行多次,次数与客户数相同。

您可以使用此简单的自解释T-SQL尝试行数窗口功能,而不是横向联接

SELECT      c.CustID
            , d.InvDate
            , d.InvNumber
FROM        #C c
LEFT JOIN   (
            SELECT  *
                    , ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY InvDate DESC) AS RowNo
            FROM    #D
            ) d
ON          c.CustID = d.CustID
            AND d.RowNo = 1
基本上,行号用于在一次表扫描中过滤最后一张发票,而不是执行选择前1。。。必须多次执行的相关查询中的ORDER BY-与客户数量相同