0

ユーザーが時間の労力を入力するアプリケーションがあります。アプリケーションProductionにすべての本番タスクを入力するためのテーブルと、NonProduction本番に関連しないすべてのタスクを入力するためのテーブルの2つのテーブルがあります。UserInfoユーザーが報告しているeCode、Name、Designation、RoleID、ImmediateSupervisor ECodeなど、すべてのユーザー情報が格納されているテーブル。roleidが1より大きいユーザーができるように、このような方法でsqlクエリを作成しようとしています。彼の下でレポートしているユーザーのProductionおよびNonProduction情報をドリルダウンして抽出しますが、抽出されたレポートはRoleID1のみであることが条件です。たとえば、マネージャーのRoleIDは4であるため、最初にドリルダウンして、彼に報告しているすべてのユーザー(この情報はUserInfoテーブルのImmediateSupervisor列にあります)、つまりRoleID3またはRoleID4を見つけます。次に、これらのユーザーにドリルダウンして抽出します。彼らに報告し、ROleID 1にドリルダウンするまで、そしてそのレベルにドリルダウンすると、

以下は、テーブル作成形式のテーブル構造クエリです。

生産表

CREATE TABLE [dbo].[Production]
(
    [ProductionTimeEntryID]  [int] IDENTITY(100, 1) NOT NULL,
    [CalendarDate]           [datetime] NOT NULL,
    [UserID]                 [int] NOT NULL,
    [NatureOfWorkID]         [int] NOT NULL,
    [RegionProjectID]        [int] NOT NULL,
    [CountyID]               [int] NOT NULL,
    [WorkTypeID]             [int] NOT NULL,
    [TaskID]                 [int] NOT NULL,
    [VolumeProcessed]        [int] NOT NULL,
    [NosOfError]             [int] NULL,
    [NosOfVolumeAudited]     [int] NULL,
    [TimeSpent]              [varchar](25) NULL,
    [Comment]                [varchar](250) NULL,
    [IsTaskCompleted]        [int] NOT NULL,
    [isCurrentDayTask]       [bit] NOT NULL,
    [SupervisorECode]        [nvarchar](50) NULL,
    CONSTRAINT [PK_Production] PRIMARY KEY CLUSTERED([ProductionTimeEntryID] ASC)
    WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON
    ) ON [PRIMARY]
) ON [PRIMARY]
    GO

SET ANSI_PADDING OFF
    GO

    ALTER TABLE [dbo].[Production]  WITH NOCHECK ADD  CONSTRAINT 
[FK_Production_County] FOREIGN KEY([CountyID])
    REFERENCES [dbo].[County] ([CountyID])
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT [FK_Production_County]
    GO

    ALTER TABLE [dbo].[Production]  WITH NOCHECK ADD  CONSTRAINT 
[FK_Production_NatureOfWork] FOREIGN KEY([NatureOfWorkID])
    REFERENCES [dbo].[NatureOfWork] ([NatureOfWorkID])
    ON 
UPDATE CASCADE
       ON

DELETE CASCADE
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT [FK_Production_NatureOfWork]
    GO

    ALTER TABLE [dbo].[Production]  WITH NOCHECK ADD  CONSTRAINT 
[FK_Production_RegionAndProjectInfo] FOREIGN KEY([RegionProjectID])
    REFERENCES [dbo].[RegionAndProjectInfo] ([RegionProjectID])
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT 
[FK_Production_RegionAndProjectInfo]
    GO

    ALTER TABLE [dbo].[Production]  WITH CHECK ADD  CONSTRAINT 
[FK_Production_Task] FOREIGN KEY([TaskID])
    REFERENCES [dbo].[Task] ([TaskID])
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT [FK_Production_Task]
    GO

    ALTER TABLE [dbo].[Production]  WITH CHECK ADD  CONSTRAINT 
[FK_Production_USERINFO] FOREIGN KEY([UserID])
    REFERENCES [dbo].[USERINFO] ([UserID])
    ON 
UPDATE CASCADE
       ON

DELETE CASCADE
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT [FK_Production_USERINFO]
    GO

    ALTER TABLE [dbo].[Production]  WITH CHECK ADD  CONSTRAINT 
[FK_Production_WorkType] FOREIGN KEY([WorkTypeID])
    REFERENCES [dbo].[WorkType] ([WorkTypeID])
    ON 
UPDATE CASCADE
       ON

DELETE CASCADE
    GO

    ALTER TABLE [dbo].[Production] CHECK CONSTRAINT [FK_Production_WorkType]
    GO

    ALTER TABLE [dbo].[Production] ADD  DEFAULT((0)) FOR [IsTaskCompleted]
    GO

    ALTER TABLE [dbo].[Production] ADD  DEFAULT((0)) FOR [isCurrentDayTask]
    GO

UserInfoテーブル:

CREATE TABLE [dbo].[USERINFO](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserECode] [nvarchar](50) NOT NULL,
[UserName] [nvarchar](250) NOT NULL,
[CCCode] [nvarchar](50) NULL,
[CCName] [nvarchar](50) NULL,
[Password] [varchar](50) NULL,
[IsFlagEnabled] [bit] NULL,
[IsFirstTimeUserLoggedIn] [bit] NULL,
[EmailAddress] [nvarchar](250) NULL,
[Designation] [varchar](50) NULL,
[ShiftStartTime] [varchar](8) NULL,
[ShiftEndTime] [varchar](8) NULL,
[WeekendShiftStartTime] [varchar](8) NULL,
[WeekendShiftEndTime] [varchar](8) NULL,
[RoleID] [int] NULL,
[ShiftEndFlagStatus] [int] NOT NULL,
[ShiftStartTimeWithTimeStamp] [datetime] NULL,
[ShiftEndTimeWithTimeStamp] [datetime] NULL,
[LoggedInDateTime] [datetime] NULL,
[FirstLoggedInOnthedayflag] [int] NOT NULL,
[ImmediateSupervisor] [nvarchar](50) NULL,
 CONSTRAINT [PK_USER] PRIMARY KEY CLUSTERED 
(
    [UserID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[USERINFO] ADD  DEFAULT ((1)) FOR [RoleID]
GO
ALTER TABLE [dbo].[USERINFO] ADD  DEFAULT ((1)) FOR [ShiftEndFlagStatus]
GO
ALTER TABLE [dbo].[USERINFO] ADD  DEFAULT ((1)) FOR [FirstLoggedInOnthedayflag]
GO

そのようなクエリまたはクエリのタイプを作成して、同じものをアプリケーションに組み込むにはどうすればよいですか?

4

2 に答える 2

2

ツリー構造のテーブルがあります。これを抽出する標準的な方法は、次のような再帰cteを使用することです。

;with UserTree as
(
    select UserECode, UserID
      from USERINFO
     where UserID = <the managers user-id>
    union all
    select UserECode, UserID
      from UserTree parent
           inner join USERINFO child
                   on child.ImmediateSupervisor = parent.UserECode
)
select * --change this to the specific columns that you need
  from UserTree ut
       inner join Production p
               on p.UserID = ut.UserID
 where RoleId = 1

このコードをテストすることはできませんが、小さな問題は自分で修正できると確信しています。

再帰cte:sに関する詳細情報。

また、ツリーデータ構造に関するいくつかの潜在的な問題に気付かずにはいられませんでした。ImmediateSupervisorはUserECodeを参照しているようで、投稿したテーブル構造に2つの問題があります。

  1. ImmediateSupervisorからUserECodeへの外部キーはありません。これにより、スーパーバイザーが存在しないユーザーが発生する可能性があります。
  2. UserECodeは一意ではありません。これにより、同じコードを持つ複数のユーザーが発生する可能性があります。つまり、ユーザーごとに複数のスーパーバイザーが発生する可能性があり、再帰cteクエリが実際に台無しになります。

ここに全体像はありませんが、私が持っているものを使用して、代わりにPKUserIdを参照するようにImmediateSupervisor-columnを変更します。

于 2013-01-17T09:27:06.830 に答える
-1
with
ProductionCTE(CalendarDate,RoleID,UserID,UserECode,UserName,ImmediateSupervisor,NatureOfWorkName,RegionProjectName,CountyName,WorkTypeName,TaskName,VolumneProcessed,TimeSpent,Comment)
as
(
select P.CalendarDate,U.RoleID,U.UserID,U.UserECode,U.UserName,U.ImmediateSupervisor,N.NatureofWorkName,
R.RegionProjectName,C.Countyname,W.WorktypeName,T.TaskName,P.VolumeProcessed,P.Timespent,P.Comment
from production P inner join NatureOfWork N
on N.NatureofWorkID=P.natureofworkid
inner join dbo.RegionAndProjectInfo R
on R.RegionProjectID=P.RegionProjectID
inner join county C
on C.countyid=P.countyid
inner join worktype W
on W.Worktypeid=P.worktypeID
inner join task T
on T.taskid=P.TaskID
inner join UserInfo U
on U.Userid=P.userid
where P.userid=952

    union all

        select P.CalendarDate,U.RoleID,U.UserID,U.UserECode,U.UserName,U.ImmediateSupervisor,N.NatureofWorkName,
        R.RegionProjectName,C.Countyname,W.WorktypeName,T.TaskName,P.VolumeProcessed,P.Timespent,P.Comment
        from production P inner join NatureOfWork N
        on N.NatureofWorkID=P.natureofworkid
        inner join dbo.RegionAndProjectInfo R
        on R.RegionProjectID=P.RegionProjectID
        inner join county C
        on C.countyid=P.countyid
        inner join worktype W
        on W.Worktypeid=P.worktypeID
        inner join task T
        on T.taskid=P.TaskID
        inner join UserInfo U
        on U.Userid=P.userid
        inner join ProductionCTE
        on U.ImmediateSupervisor=ProductionCTE.UserECode
)
select distinct CalendarDate,RoleID,UserID,UserECode,UserName,ImmediateSupervisor,NatureOfWorkName,RegionProjectName,CountyName,WorkTypeName,TaskName,VolumneProcessed,TimeSpent,Comment from ProductionCTE order by UserECode

Recursive CTEを実装すると問題が修正され、階層ごとにレコードを抽出できるようになりました。

于 2013-01-18T09:12:21.757 に答える