使用内部连接将两个或多个条件定义到存储过程中?

Posted

技术标签:

【中文标题】使用内部连接将两个或多个条件定义到存储过程中?【英文标题】:Define two or more conditions into a stored procedure with inner join? 【发布时间】:2021-03-01 04:01:03 【问题描述】:

首先,我需要通过变量@company_id 过滤表TbTaxCompaniestbCompany 中的数据...并且可以工作!

CREATE PROCEDURE taxcompany_importTaxes
    @company_id int
AS
    SELECT 
        tc.idtaxcompany, tc.company_id, c.nameCompany, 
        ct.tax1, ct.tax2, ct.tax3, ct.dateUpgrade
    FROM 
        tbTaxCompanies tc
    INNER JOIN 
        tbCompany c ON tc.company_id = c.idcompany
    WHERE 
        tc.company_id = @company_id
    ORDER BY 
        tc.idtaxcompany ASC

其次,我需要再次过滤之前使用 @company_id 选择的公司的日志集,但现在只获取最新更新的税款(只有一行)......这不起作用!

CREATE PROCEDURE taxcompany_importTaxes
    @company_id int
AS
    SELECT 
        tc.idtaxcompany, tc.company_id, c.nameCompany, 
        ct.tax1, ct.tax2, ct.tax3, ct.dateUpdate
    FROM 
        tbTaxCompanies tc
    INNER JOIN 
        tbCompany c ON tc.company_id = c.idcompany
    WHERE 
        tc.company_id = @company_id 
        AND (tc.dateUpdate = (SELECT MAX (dateUpdate) FROM tbTaxCompanies))
    ORDER BY 
        tc.idtaxcompany ASC

非常感谢任何帮助。

【问题讨论】:

请提供一些示例数据和预期结果。 别名ct 未定义。 【参考方案1】:

如果您想要第一个结果集中的最新行,只需使用 order bytop

SELECT TOP (1) WITH TIES
    tc.idtaxcompany, tc.company_id, c.nameCompany, 
    tc.tax1, tc.tax2, tc.tax3, tc.dateUpgrade
FROM tbTaxCompanies tc
INNER JOIN tbCompany c on tc.company_id = c.idcompany
WHERE tc.company_id = @company_id
ORDER BY tc.dateUpdate DESC

如果您想要每组的最新行,例如每个tc.idtaxcompany,那么您只需将ORDER BY 子句更改为:

ORDER BY RANK() OVER(PARTITION BY tc.idtaxcompany ORDER BY tc.dateUpdate DESC)

【讨论】:

以上是关于使用内部连接将两个或多个条件定义到存储过程中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 codeigniter 代码中使用两个或多个存储过程?

MYSQL 存储过程 - 如果满足某些条件,则更新多个列

VB.NET是如何使用ADO让存储过程返回数据表中的值呢?求解!

MySQL存储过程变量定义

MySQL 存储过程错误处理

oracle在写存储过程时怎样将变量和字符串进行连接