【问题标题】:Eliminating Duplicate Rows after Modifying Stored Procedure修改存储过程后消除重复行
【发布时间】:2013-07-19 04:02:46
【问题描述】:

我们的采购部门希望我修改我们的应用程序,以便可以使用零件编号搜索申请请求

每个申请请求至少包含一个部分,但也可以包含多个部分。

存储过程被设置成可以填充或不填充字段,因此它根据传入的内容提取数据。

在我修改之前,存储过程是如何工作的:

ALTER PROCEDURE [dbo].[GetRequisitions](@status_id int, @startdate varchar(50), @enddate varchar(50),
  @Vendor_Name varchar(200), @PO_Number varchar(50), @Req_ID int, @datesearch bit, @Part_ID varchar(50)) AS
BEGIN
  SET NOCOUNT ON;

  select
    a.Req_ID, a.Vendor_ID, a.Vendor_Name, a.Req_Date, a.PO_Number, a.Requested_Buy, a.approved,
    b.status,
    c.supervisor_login,
    case when d.req_id is not null then 1 else 0 end as HasDocs
  from Req as a
    join Status as b on (a.Status_ID=b.Status_ID)
    left outer join Supervisor as c on (a.Requested_Login=c.Emp_Login)
    left outer join req_doc as d on (a.Req_ID=d.req_id)
  where
    ((@datesearch is null or @datesearch=0) or (a.Req_Date between @startdate and @enddate))
    and ((@status_id is null or @status_id=0) or (a.Status_ID=@status_id))
    and ((@Vendor_Name is null or LEN(RTrim(@Vendor_Name))=0) or (a.Vendor_Name like '%'+@Vendor_Name+'%'))
    and ((@PO_Number is null or LEN(RTrim(@PO_Number))=0) or (a.PO_Number like @PO_Number+'%'))
    and ((@Req_ID is null or @Req_ID=0) or (a.Req_ID=@Req_ID))
END

要使用可选的零件编号 Part_ID 字段查询相同的DataSet,我添加了以下与Req_Part 连接的代码DataTable em>:

ALTER PROCEDURE [dbo].[GetRequisitions](@status_id int, @startdate varchar(50), @enddate varchar(50),
  @Vendor_Name varchar(200), @PO_Number varchar(50), @Req_ID int, @datesearch bit, @Part_ID varchar(50)) AS
BEGIN
  SET NOCOUNT ON;

  select
    a.Req_ID, a.Vendor_ID, a.Vendor_Name, a.Req_Date, a.PO_Number, a.Requested_Buy, a.approved,
    b.status,
    c.supervisor_login,
    case when d.req_id is not null then 1 else 0 end as HasDocs
  from Req as a
    join Status as b on (a.Status_ID=b.Status_ID)
    left outer join Supervisor as c on (a.Requested_Login=c.Emp_Login)
    left outer join req_doc as d on (a.Req_ID=d.req_id)
    join Req_Part e on (a.Req_ID=e.Req_ID)
  where
    ((@datesearch is null or @datesearch=0) or (a.Req_Date between @startdate and @enddate))
    and ((@status_id is null or @status_id=0) or (a.Status_ID=@status_id))
    and ((@Vendor_Name is null or LEN(RTrim(@Vendor_Name))=0) or (a.Vendor_Name like '%'+@Vendor_Name+'%'))
    and ((@PO_Number is null or LEN(RTrim(@PO_Number))=0) or (a.PO_Number like @PO_Number+'%'))
    and ((@Req_ID is null or @Req_ID=0) or (a.Req_ID=@Req_ID))
    and ((@Part_ID is null or LEN(RTrim(@Part_ID))=0) or (e.Part_ID like '%'+@Part_ID+'%'))
END

停止返回重复行的最佳方法是什么?

而且,作为一个仅供参考:我没有设计这个数据库!我知道列名Requested_Buy 将正确拼写为Requested_By,但数据库已经在生产中。拼错的单词真的让我很生气!

【问题讨论】:

  • 你需要从Req_Part返回什么,此时你修改后的SP没有从那个表返回任何东西。
  • 我不需要返回 Req_Part - 如果提供了 Part Number,我只需要包含这些部分的 Requests
  • 所以您不需要INNER JOIN,只需在其中检查IF EXISTS(SELECT * FROM ...
  • 您本身并没有得到重复,对于请求的每个部分,您都会得到一行/记录。那是因为加入
  • 你是对的,贾法尔。我需要有人写一个select distinct 声明,以便我可以接受他们的回答。一位同事已经向我展示了如何让我修改后的存储过程工作。

标签: sql-server-2008 tsql


【解决方案1】:

如果我理解正确,您可以像这样更新查询。

  select
    a.Req_ID, a.Vendor_ID, a.Vendor_Name, a.Req_Date, a.PO_Number, a.Requested_Buy, a.approved,
    b.status,
    c.supervisor_login,
    case when d.req_id is not null then 1 else 0 end as HasDocs
  from Req as a
    join Status as b on (a.Status_ID=b.Status_ID)
    left outer join Supervisor as c on (a.Requested_Login=c.Emp_Login)
    left outer join req_doc as d on (a.Req_ID=d.req_id)
  where
    ((@datesearch is null or @datesearch=0) or (a.Req_Date between @startdate and @enddate))
    and ((@status_id is null or @status_id=0) or (a.Status_ID=@status_id))
    and ((@Vendor_Name is null or LEN(RTrim(@Vendor_Name))=0) or (a.Vendor_Name like '%'+@Vendor_Name+'%'))
    and ((@PO_Number is null or LEN(RTrim(@PO_Number))=0) or (a.PO_Number like @PO_Number+'%'))
    and ((@Req_ID is null or @Req_ID=0) or (a.Req_ID=@Req_ID))
    and ( ISNULL(@Part_ID,0) = 0 
            OR 
          EXISTS(SELECT NULL FROM Req_Part e WHERE a.Req_ID=e.Req_ID AND e.Part_ID like '%'+@Part_ID+'%')
        )  

【讨论】:

  • 埃里克,也许可以。
  • 不知何故,这个版本正在提取一个没有对应的Part Number 字段的Request。那是因为ISNULL 函数吗?如果是这样,我需要删除它。
  • (SELECT NULL ...) 上调用 EXISTS 是什么意思? NULL 存在吗?
  • @jp2code,您可以选择 EXISTS 中的任何内容,个人而言,我使用 SELECT NULL,您可以将其替换为 SELECT 1 或 SELECT * 。没有区别。对于 ISNULL 部分,我更新了我的答案,它现在应该可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多