0

当社の購買部門は、部品番号を使用して要求要求を検索できるようにアプリケーションを変更するように私に求めています。

要求リクエストには少なくとも 1 つのパーツが含まれますが、複数のパーツが含まれる場合もあります。

ストアド プロシージャは、フィールドにデータが入力される場合と入力されない場合があるように設定されているため、渡された内容に基づいてデータを取得します。

変更前のストアド プロシージャの動作は次のとおりです。

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 Numberフィールドを使用してこの同じDataSetを照会するために、 DataTableと結合する次のコードを追加しました。 Part_IDReq_Part

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ていますが、データベースは既に運用されています。スペルミスのある単語は本当にイライラします。

4

1 に答える 1

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+'%')
        )  
于 2013-07-18T15:24:34.860 に答える