SQL Server CTE hierarchy issue - sql-server
i have an application serve multilevel of permissions and roles
i have this HIERARCHY :
Country
....Region
........City
............Association
................Center
....................School
........................Class
this HIERARCHY i name it "EntityLevels"
| ID | Name | ParentID |
|----|-------------|----------|
| 1 | Country | Null |
| 2 | Region | 1 |
| 3 | City | 2 |
| 4 | Association | 3 |
| 5 | Center | 4 |
| 6 | School | 5 |
| 7 | Class | 6 |
i have also a Groups Table which means Jobs
| ID | Name | EntityLevels |
|----|--------------------|--------------|
| 1 | CountryAdmins | 1 |
| 2 | Region Supervisors | 2 |
the user table is as following
| ID | Name |
|----|-------|
| 1 | User1 |
| 2 | User2 |
now i have a UserJobs Table or UserGroups
| ID | UserID | GroupdID | EntityID |
|----|--------|----------|----------|
| 1 | User1 | 1 | 1 |
| 2 | User2 | 2 | 2 |
| 3 | User3 | 4 | 38 |
now the problem is how i can get each user and his responsibilites depending on what it's under his level
for eaxmple :
user1 must have all the roles and permissoins to see all users under his level because he is in Group (1) and Group1 it resides on EntityLevel (1) which it's on the Country Level.
i've try to do something like that, but it's not working as Expected it's Only give me the root without any other child under that root
;WITH MyCTE AS (
SELECT T1.ID, UserId, 0 AS TreeLevel, CAST(T1.ID AS VARCHAR(255)) AS TreePath FROM UserJobs T1
inner join EntityLevel el on t1.GroupId = el.Id WHERE EL.ParentID IS NULL
UNION ALL
SELECT T2.ID, T2.UserId, TreeLevel + 1, CAST(TreePath + '.' + CAST(T2.ID AS VARCHAR(255)) AS VARCHAR(255)) AS TreePath
FROM UserJobs T2
inner join EntityLevel el on T2.GroupId = el.Id
INNER JOIN
MyCTE itms ON itms.ID = EL.ParentID
)
SELECT ID, TreeLevel, TreePath
FROM MyCTE
ORDER BY TreePath;
Script for Schema And DATA
dbfiddle here
CREATE TABLE [dbo].[Assocation](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CityID] [int] NULL,
CONSTRAINT [PK_Assocation] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Center] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Center](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[AssociationID] [int] NULL,
CONSTRAINT [PK_Center] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[City] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[City](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[RegionID] [int] NULL,
CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Class] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[SchoolID] [int] NULL,
CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Country] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Country](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[EntityLevel] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EntityLevel](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[ParentID] [int] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Group] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Group](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[EntityLevelID] [int] NULL,
CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Region] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Region](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CountryID] [int] NULL,
CONSTRAINT [PK_Region] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[School] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[School](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CenterID] [int] NULL,
CONSTRAINT [PK_School] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[User] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[Mobile] [varchar](50) NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[UserJobs] Script Date: 2017-04-03 6:07:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserJobs](
[ID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[GroupID] [int] NOT NULL,
[EntityID] [int] NOT NULL,
CONSTRAINT [PK_UserJobs] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[UserID] ASC,
[GroupID] ASC,
[EntityID] 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
INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (1, N'KH', 1)
GO
INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (2, N'mkh_ass', 2)
GO
INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (1, N'NorthCenter', 1)
GO
INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (2, N'SouthCenter', 1)
GO
INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (1, N'Jeddah', 1)
GO
INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (2, N'MakkahCiry', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (1, N'Class1-Ahmed', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (2, N'Class2-omar', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (3, N'class3_khaled', 2)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (4, N'class4_fahd', 2)
GO
INSERT [dbo].[Country] ([ID], [Name]) VALUES (1, N'KSA')
GO
INSERT [dbo].[Country] ([ID], [Name]) VALUES (2, N'UAE')
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (1, N'Country', NULL)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (2, N'Region', 1)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (3, N'City', 2)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (4, N'Association', 3)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (5, N'Center', 4)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (6, N'School', 5)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (7, N'Class', 6)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (1, N'SA', 1)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (2, N'country admin', 1)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (3, N'region admin', 2)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (4, N'region Supervisor', 2)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (5, N'manager', 4)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (6, N'supervisor', 5)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (7, N'teacher', 7)
GO
INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (1, N'Makkah', 1)
GO
INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (2, N'Riyadh', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (1, N'School1', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (2, N'School2', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (3, N'School3', 2)
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (1, N'Loai', N'000000')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (2, N'User1', N'1111')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (3, N'User2', N'2222')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (4, N'User3', N'3333')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (5, N'User4', N'4444')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (6, N'user5', N'5555')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (7, N'user6', N'6548')
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (1, 1, 1, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (2, 2, 2, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (3, 3, 3, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (4, 4, 4, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (5, 5, 5, 2)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (6, 6, 6, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (7, 7, 7, 2)
GO
(EDIT) : The Expected Result will be :
SCRIPT AND DATA VERSION #2
CREATE TABLE [dbo].[Assocation](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CityID] [int] NULL,
CONSTRAINT [PK_Assocation] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Center] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Center](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[AssociationID] [int] NULL,
CONSTRAINT [PK_Center] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[City] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[City](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[RegionID] [int] NULL,
CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Class] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[SchoolID] [int] NULL,
CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Country] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Country](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[EntityLevel] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EntityLevel](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[ParentID] [int] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Group] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Group](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[EntityLevelID] [int] NULL,
CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[Region] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Region](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CountryID] [int] NULL,
CONSTRAINT [PK_Region] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[School] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[School](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[CenterID] [int] NULL,
CONSTRAINT [PK_School] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[User] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[Mobile] [varchar](50) NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[ID] 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
/****** Object: Table [dbo].[UserJobs] Script Date: 2017-04-04 3:47:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserJobs](
[ID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[GroupID] [int] NOT NULL,
[EntityID] [int] NOT NULL,
CONSTRAINT [PK_UserJobs] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[UserID] ASC,
[GroupID] ASC,
[EntityID] 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
INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (1, N'KH', 1)
GO
INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (2, N'mkh_ass', 2)
GO
INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (1, N'NorthCenter', 1)
GO
INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (2, N'SouthCenter', 1)
GO
INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (1, N'Jeddah', 1)
GO
INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (2, N'MakkahCiry', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (1, N'Class1', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (2, N'Class2', 1)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (3, N'class3', 2)
GO
INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (4, N'class4', 2)
GO
INSERT [dbo].[Country] ([ID], [Name]) VALUES (1, N'KSA')
GO
INSERT [dbo].[Country] ([ID], [Name]) VALUES (2, N'UAE')
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (1, N'Country', NULL)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (2, N'Region', 1)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (3, N'City', 2)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (4, N'Association', 3)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (5, N'Center', 4)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (6, N'School', 5)
GO
INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (7, N'Class', 6)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (1, N'Country Manager', 1)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (2, N'Region Manager', 2)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (3, N'City Manager', 3)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (4, N'Association Manager', 4)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (5, N'Center Manager', 5)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (6, N'School Manager', 6)
GO
INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (7, N'Teacher', 7)
GO
INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (1, N'Makkah', 1)
GO
INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (2, N'Riyadh', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (1, N'School1', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (2, N'School2', 1)
GO
INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (3, N'School3', 2)
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (1, N'UserA', N'000000')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (2, N'UserB', N'1111')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (3, N'UserC', N'2222')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (4, N'UserD', N'3333')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (5, N'UserE', N'4444')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (6, N'UserF', N'5555')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (7, N'UserG', N'6548')
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (8, N'UserH', NULL)
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (9, N'UserI', NULL)
GO
INSERT [dbo].[User] ([ID], [Name], [Mobile]) VALUES (10, N'UserJ', NULL)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (1, 1, 1, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (2, 2, 2, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (3, 3, 3, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (4, 4, 4, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (5, 5, 5, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (6, 6, 6, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (7, 7, 7, 1)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (8, 8, 2, 2)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (9, 9, 3, 2)
GO
INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (10, 10, 4, 2)
GO
any solution for that ?
IMHO you must build the whole Entities tree and then use it to JOIN with the other tables.
Having a look at your desired result it is not clear to me what is the relation between Entities and Cities, Regions, Class, etc.
Obviously according to the Name of the entity, I know that 1 = Country, 2 = Region and so on, but I can't find out any field on your table schema that allow to get this information other than:
CASE WHEN Entity.ID = 1 (SELECT Name FROM Country WHERE ID = Entity.ID) END
WHEN Entity.ID = 2 (SELECT Name FROM Region WHERE ID = Entity.ID) END
WHEN Entity.ID = 3 (SELECT Name FROM City WHERE ID = Entity.ID) END
...
END as EntityName
I'd suggest you to build a UDF or SP to get the name of the Entity and use it on the next script.
;WITH tree AS
(
SELECT e1.ID, e1.Name, e1.ParentID, [level] = 1
FROM EntityLevel e1
WHERE e1.ParentID = (SELECT EntityID FROM UserJobs WHERE UserID = 1)
UNION ALL
SELECT e2.ID, e2.Name, e2.ParentID, [level] = tree.[level] + 1
FROM EntityLevel e2
INNER JOIN tree
ON e2.ParentID = tree.ID
)
SELECT EntityLevelID, UserName, GroupID, GroupName, EntityID, EntityName
FROM tree t
INNER JOIN (SELECT gr.entitylevelid,
us.Name UserName,
gr.Name GroupName,
el.Name as EntityName,
gr.ID as GroupID,
el.ID as EntityID
FROM userjobs uj
INNER JOIN [group] gr
ON gr.id = uj.groupid
INNER JOIN entitylevel el
ON el.id = gr.entitylevelid
INNER JOIN [user] us
ON us.id = uj.userid) t1
ON t.ID = t1.EntityLevelID
OPTION (MAXRECURSION 0)
;
GO
EntityLevelID | UserName | GroupID | GroupName | EntityID | EntityName
------------: | :------- | ------: | :---------------- | -------: | :----------
2 | User2 | 3 | region admin | 2 | Region
2 | User3 | 4 | region Supervisor | 2 | Region
4 | User4 | 5 | manager | 4 | Association
5 | user5 | 6 | supervisor | 5 | Center
7 | user6 | 7 | teacher | 7 | Class
dbfiddle here
Can you try this? (edited after comments)
;WITH MyCTE AS (
SELECT T1.ID, UserId, NULL AS PARENT_ID, T1.GroupID, G.EntityLevelID
FROM UserJobs T1
INNER JOIN [GROUP] G ON T1.GROUPID = G.ID
inner join EntityLevel el on G.EntityLevelID = el.Id
WHERE T1.UserID = 1 /* Write here the user id you want */
UNION ALL
SELECT T2.ID, T2.UserId, EL.ParentID, T2.GroupID, G.EntityLevelID
FROM UserJobs T2
INNER JOIN [GROUP] G ON T2.GROUPID = G.ID
inner join EntityLevel el on G.EntityLevelID = el.Id
INNER JOIN MyCTE itms ON EL.ParentID >= itms.ID
)
SELECT B.*, C.*, A.*
FROM (SELECT DISTINCT * FROM MyCTE) A
INNER JOIN [USER] B ON A.UserID = B.ID
INNER JOIN [Group] C ON A.GroupID = C.ID
;
Output:
ID Name Mobile ID Name EntityLevelID ID UserId PARENT_ID GroupID EntityLevelID
1 1 Loai 000000 1 SA 1 1 1 NULL 1 1
2 3 User2 2222 3 region admin 2 3 3 1 3 2
3 4 User3 3333 4 region Supervisor 2 4 4 1 4 2
4 5 User4 4444 5 manager 4 5 5 3 5 4
5 6 user5 5555 6 supervisor 5 6 6 4 6 5
6 7 user6 6548 7 teacher 7 7 7 6 7 7
Related
T-SQL: Can I query one view for values and then query a second view only for values that don't exist in the first?
DROP TABLE IF EXISTS ..Players DROP TABLE IF EXISTS ..FreeAgents CREATE TABLE [dbo].[FreeAgents]( [Id] [int] IDENTITY(1,1) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [Position] [nvarchar](50) NOT NULL, CONSTRAINT [PK_FreeAgents] PRIMARY KEY CLUSTERED ( [Id] 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 CREATE TABLE [dbo].[Players]( [Id] [int] IDENTITY(1,1) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [Position] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Players] PRIMARY KEY CLUSTERED ( [Id] 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 IDENTITY_INSERT [dbo].[FreeAgents] ON GO INSERT [dbo].[FreeAgents] ([Id], [FirstName], [LastName], [Position]) VALUES (2, N'Julian', N'Edelman', N'WideReceiver') GO INSERT [dbo].[FreeAgents] ([Id], [FirstName], [LastName], [Position]) VALUES (3, N'Dez', N'Bryant', N'WideReceiver') GO INSERT [dbo].[FreeAgents] ([Id], [FirstName], [LastName], [Position]) VALUES (4, N'Brandon', N'Jacobs', N'DefensiveEnd') GO SET IDENTITY_INSERT [dbo].[FreeAgents] OFF GO SET IDENTITY_INSERT [dbo].[Players] ON GO INSERT [dbo].[Players] ([Id], [FirstName], [LastName], [Position]) VALUES (1, N'Tom', N'Brady', N'Quarterback') GO INSERT [dbo].[Players] ([Id], [FirstName], [LastName], [Position]) VALUES (2, N'Cam', N'Newton', N'Quarterback') GO INSERT [dbo].[Players] ([Id], [FirstName], [LastName], [Position]) VALUES (3, N'Julian', N'Edelman', N'WideReceiver') GO SET IDENTITY_INSERT [dbo].[Players] OFF GO SELECT FirstName, LastName, Position FROM ..Players UNION SELECT FirstName, LastName, Position FROM ..FreeAgents The code above returns five rows. This is correct. FirstName LastName Position Brandon Jacobs DefensiveEnd Cam Newton Quarterback Dez Bryant WideReceiver Julian Edelman WideReceiver Tom Brady Quarterback My Problem: The above code snippet queries and unions two physical tables. My real-world situation involves two computation-intense views. Conceptually, I'd like to return the same result set that a UNION returns. Except that I don't want to query the second table for rows that already exist in the first table. Emphasis: For small tables, this makes no perceptible difference. The SQL Server engine is perfectly capable of filtering out duplicates with the UNION clause. But in my real-world situation, I'm not querying two small physical tables. I'm querying two computation-intense views.
If you have some set of keys that are not computation intensive (like id col in your example) I think you best bet would be to use temp table to store results from first view and then union ALL it with second with where check it does not exists in temp table. SELECT * FROM view1 INTO #v1; SELECT * FROM #v1 UNITON ALL SELECT * FROM view2 WHERE NOT EXISTS(SELECT 1 FROM #v1 WHERE #v1.id = view2.id) The second view should perform computations only for missing records. Using a WITH statement can be even better but I'm not sure - that needs to be tested on real data. WITH v1 AS (SELECT * FROM view1) SELECT * FROM v1 UNION ALL SELECT * FROM view2 WHERE NOT EXISTS ( SELECT 1 FROM v1 WHERE v1.id = view2.id -- Set duplicate condition here )
Is there any way to insert all relationships at once?
I have a table for a N:N relationship: MyTable(IDTable1, IDTable2) I have to collections with IDs, one collection with IDs from table 1 and another collection with IDs from table 2. I have to relation each id from collection 1 with all the IDs from collection 2. Is it possible to do it with one T-Sql query or I need to create one T-Sql query for each relationship? Thanks. EDIT: I add the script to generate the 3 tables. Table01 with 3 rows, table02 with 6 rows and the N:N table with 6 records. USE [Dummy01] GO /****** Object: Table [dbo].[Table01] Script Date: 15/07/2018 16:43:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table01]( [IDTable01] [bigint] IDENTITY(1,1) NOT NULL, [Description] [varchar](50) NOT NULL, CONSTRAINT [PK_Tabl01] PRIMARY KEY CLUSTERED ( [IDTable01] 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 /****** Object: Table [dbo].[Table01_Table02_Relationship] Script Date: 15/07/2018 16:43:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table01_Table02_Relationship]( [IDTable01] [bigint] NOT NULL, [IDTable02] [bigint] NOT NULL, CONSTRAINT [PK_Table01_Table02_Relationship] PRIMARY KEY CLUSTERED ( [IDTable01] ASC, [IDTable02] 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 /****** Object: Table [dbo].[Table02] Script Date: 15/07/2018 16:43:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table02]( [IDTable02] [bigint] IDENTITY(1,1) NOT NULL, [Description] [varchar](50) NOT NULL, CONSTRAINT [PK_Table02] PRIMARY KEY CLUSTERED ( [IDTable02] 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 IDENTITY_INSERT [dbo].[Table01] ON INSERT [dbo].[Table01] ([IDTable01], [Description]) VALUES (1, N'Description 01') INSERT [dbo].[Table01] ([IDTable01], [Description]) VALUES (2, N'Description 02') INSERT [dbo].[Table01] ([IDTable01], [Description]) VALUES (3, N'Description 03') INSERT [dbo].[Table01] ([IDTable01], [Description]) VALUES (4, N'Description 04') SET IDENTITY_INSERT [dbo].[Table01] OFF INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (2, 4) INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (2, 5) INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (2, 6) INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (3, 4) INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (3, 5) INSERT [dbo].[Table01_Table02_Relationship] ([IDTable01], [IDTable02]) VALUES (3, 6) SET IDENTITY_INSERT [dbo].[Table02] ON INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (1, N'Description 01') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (2, N'Description 02') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (3, N'Description 03') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (4, N'Description 04') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (5, N'Description 05') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (6, N'Description 06') INSERT [dbo].[Table02] ([IDTable02], [Description]) VALUES (7, N'Description 07') SET IDENTITY_INSERT [dbo].[Table02] OFF
You could achieve it with single query: INSERT INTO MyTable(IdTable1, IDTable2) SELECT t1.IDTable1, t2.IDTable2 FROM table1 t1 CROSS JOIN table2 t2
How to copy records from parent to child in same table using MS SQL CTE
I have requirement like copy same parent records to N child with same table. The only difference in the data is Parent Id and Client Id, I have to copy Parent records as it is to child with only ParentId and ClientId value change. - Parent records may be 1 to 2000 which need to be moved for each client. - Child records (repeat 1 to 1000) different child. I have implemented the requirement using SQL Server Cursor but this is extensively very slow if we have parent records more than 1000 and Child (repeat entries) more than 1500. So i would like to know whether it is possible to use CTE instead cursor to gain performance for the bulk insertion. I am using following code to copy parent records to each client: DECLARE #id bigint; --Get list of client which will repeat the rows from Master entries --This will return three rows Id:1,5,7 DECLARE client_cursor CURSOR FOR SELECT Id FROM Client WHERE ClientName like 'info%' OPEN client_cursor FETCH NEXT FROM client_cursor INTO #id; WHILE ##FETCH_STATUS = 0 BEGIN /*....*/ /* Other business logic performed here */ /*....*/ INSERT INTO Resources (ParentId,ClientId,Location,Title,[Status],Alert) --This will return two rows Id:1,2 SELECT Id,#id,Location,Title,[Status],Alert FROM Resources WHERE ParentId IS NULL AND ClientId IS NULL FETCH NEXT FROM client_cursor INTO #id END CLOSE client_cursor; DEALLOCATE client_cursor; Following are the screen shot before and after adding bulk Parent records to Child using above code snippet. -- Table Creation CREATE TABLE [dbo].[Client]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [ClientName] [varchar](50) NULL, CONSTRAINT [PK_Client] PRIMARY KEY CLUSTERED ( [Id] 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 CREATE TABLE [dbo].[Resources]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [ParentId] [bigint] NULL, [ClientId] [bigint] NULL, [Location] [varchar](50) NULL, [Title] [varchar](50) NULL, [Status] [varchar](50) NULL, [Alert] [varchar](50) NULL, CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED ( [Id] 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 -- Default Data Insertion SET IDENTITY_INSERT [dbo].[Client] ON INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (1, N'Infosstretch') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (2, N'Microsoft') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (3, N'Sun System') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (4, N'IBM') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (5, N'Infosys') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (6, N'TCS') INSERT [dbo].[Client] ([Id], [ClientName]) VALUES (7, N'Infomatica') SET IDENTITY_INSERT [dbo].[Client] OFF SET IDENTITY_INSERT [dbo].[Resources] ON INSERT [dbo].[Resources] ([Id], [ParentId], [ClientId], [Location], [Title], [Status], [Alert]) VALUES (1, NULL, NULL, N'India', N'Master A', N'New', N'Issue with location') INSERT [dbo].[Resources] ([Id], [ParentId], [ClientId], [Location], [Title], [Status], [Alert]) VALUES (2, NULL, NULL, N'Australia', N'Master B', N'Updated', N'No major issue') SET IDENTITY_INSERT [dbo].[Resources] OFF
There are probably some reasons from your business rules that are removed for brevity here, but why not something like this? INSERT #Resources SELECT R.Id AS ParentId, C.Id AS ClientId, R.Location, R.Title, R.Status, R.Alert FROM #Resources R CROSS JOIN #Client C WHERE R.ParentId IS NULL AND R.ClientId IS NULL -- Root level AND NOT EXISTS (SELECT * FROM #Resources WHERE ParentId = R.Id) -- Not already populated -- AND /* Other business logic performed here */
Wrong Result in the CTE Hierarchical Tree
I've this Tree Country Region City Association Center School Class i have this Query here ;WITH MyCTE AS ( SELECT T1.ID, UserId, NULL AS PARENT_ID, T1.GroupID, G.EntityLevelID FROM UserJobs T1 INNER JOIN [GROUP] G ON T1.GROUPID = G.ID inner join EntityLevel el on G.EntityLevelID = el.Id WHERE T1.UserID = 1 UNION ALL SELECT T2.ID, T2.UserId, EL.ParentID, T2.GroupID, G.EntityLevelID FROM UserJobs T2 INNER JOIN [GROUP] G ON T2.GROUPID = G.ID inner join EntityLevel el on G.EntityLevelID = el.Id INNER JOIN MyCTE itms ON EL.ParentID >= itms.ID ) SELECT B.*, C.*, A.* FROM (SELECT DISTINCT * FROM MyCTE) A INNER JOIN [USER] B ON A.UserID = B.ID INNER JOIN [Group] C ON A.GroupID = C.ID order by a.GroupID ; if i run this query for userID = 1 it will gives me correct Data (it will bring all the users that are under UserA = UserID = 1) 1 UserA 1 Country Manager 1 1 1 NULL 1 1 2 UserB 2 Region Manager 2 2 2 1 2 2 8 UserH 2 Region Manager 2 8 8 1 2 2 3 UserC 3 City Manager 3 3 3 2 3 3 9 UserI 3 City Manager 3 9 9 2 3 3 4 UserD 4 Association Manager 4 4 4 3 4 4 10 UserJ 4 Association Manager 4 10 10 3 4 4 5 UserE 5 Center Manager 5 5 5 4 5 5 6 UserF 6 School Manager 6 6 6 5 6 6 7 UserG 7 Teacher 7 7 7 6 7 7 this is actually what i looking for, but the problem comes when i need to get the user under UserI ID equal 9 The Result is : 9 UserI 3 City Manager 3 9 9 NULL 3 3 and that's wrong because UserI has one user Under him which is UserJ so, the result must looks like 9 UserI 3 City Manager 3 9 9 NULL 3 3 10 UserJ 4 Association Manager 4 10 10 NULL 4 4 same error Occurs in UserID = 3 which gives me a UserJ which is out of tree Script And Data is Here : CREATE TABLE [dbo].[Assocation]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [CityID] [int] NULL, CONSTRAINT [PK_Assocation] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[Center] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Center]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [AssociationID] [int] NULL, CONSTRAINT [PK_Center] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[City] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[City]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [RegionID] [int] NULL, CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[Class] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Class]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [SchoolID] [int] NULL, CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[Country] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Country]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[EntityLevel] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[EntityLevel]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [ParentID] [int] NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[Group] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Group]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [EntityLevelID] [int] NULL, CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[Region] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Region]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [CountryID] [int] NULL, CONSTRAINT [PK_Region] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[School] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[School]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, [CenterID] [int] NULL, CONSTRAINT [PK_School] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[User] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[User]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NULL, CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ( [ID] 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 /****** Object: Table [dbo].[UserJobs] Script Date: 2017-04-04 8:33:43 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UserJobs]( [ID] [int] NOT NULL, [UserID] [int] NOT NULL, [GroupID] [int] NOT NULL, [EntityID] [int] NOT NULL, CONSTRAINT [PK_UserJobs] PRIMARY KEY CLUSTERED ( [ID] ASC, [UserID] ASC, [GroupID] ASC, [EntityID] 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 INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (1, N'KH', 1) GO INSERT [dbo].[Assocation] ([ID], [Name], [CityID]) VALUES (2, N'mkh_ass', 2) GO INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (1, N'NorthCenter', 1) GO INSERT [dbo].[Center] ([ID], [Name], [AssociationID]) VALUES (2, N'SouthCenter', 1) GO INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (1, N'Jeddah', 1) GO INSERT [dbo].[City] ([ID], [Name], [RegionID]) VALUES (2, N'MakkahCiry', 1) GO INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (1, N'Class1', 1) GO INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (2, N'Class2', 1) GO INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (3, N'class3', 2) GO INSERT [dbo].[Class] ([ID], [Name], [SchoolID]) VALUES (4, N'class4', 2) GO INSERT [dbo].[Country] ([ID], [Name]) VALUES (1, N'KSA') GO INSERT [dbo].[Country] ([ID], [Name]) VALUES (2, N'UAE') GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (1, N'Country', NULL) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (2, N'Region', 1) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (3, N'City', 2) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (4, N'Association', 3) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (5, N'Center', 4) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (6, N'School', 5) GO INSERT [dbo].[EntityLevel] ([ID], [Name], [ParentID]) VALUES (7, N'Class', 6) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (1, N'Country Manager', 1) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (2, N'Region Manager', 2) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (3, N'City Manager', 3) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (4, N'Association Manager', 4) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (5, N'Center Manager', 5) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (6, N'School Manager', 6) GO INSERT [dbo].[Group] ([ID], [Name], [EntityLevelID]) VALUES (7, N'Teacher', 7) GO INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (1, N'Makkah', 1) GO INSERT [dbo].[Region] ([ID], [Name], [CountryID]) VALUES (2, N'Riyadh', 1) GO INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (1, N'School1', 1) GO INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (2, N'School2', 1) GO INSERT [dbo].[School] ([ID], [Name], [CenterID]) VALUES (3, N'School3', 2) GO INSERT [dbo].[User] ([ID], [Name]) VALUES (1, N'UserA') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (2, N'UserB') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (3, N'UserC') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (4, N'UserD') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (5, N'UserE') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (6, N'UserF') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (7, N'UserG') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (8, N'UserH') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (9, N'UserI') GO INSERT [dbo].[User] ([ID], [Name]) VALUES (10, N'UserJ') GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (1, 1, 1, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (2, 2, 2, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (3, 3, 3, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (4, 4, 4, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (5, 5, 5, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (6, 6, 6, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (7, 7, 7, 1) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (8, 8, 2, 2) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (9, 9, 3, 2) GO INSERT [dbo].[UserJobs] ([ID], [UserID], [GroupID], [EntityID]) VALUES (10, 10, 4, 2) GO any solution for that ...
I will repeat that your PARENT_ID values are incorrect. Let us look in detail on the UserI (ID = 9) query to see why. SELECT T1.ID, UserId, NULL AS PARENT_ID, T1.GroupID, G.EntityLevelID FROM #UserJobs T1 INNER JOIN #GROUP G ON T1.GROUPID = G.ID inner join #EntityLevel el on G.EntityLevelID = el.Id WHERE T1.UserID = 9 This would be the base query when processing UserI, as defined in your data (NOTE: I used temp tables instead of permanent tables to simplify cleanup after the tests) The output of this query fragment looks like this: ID UserId PARENT_ID GroupID EntityLevelID 9 9 NULL 3 3 No problem so far. So, the recursion portion of your CTE is: UNION ALL SELECT T2.ID, T2.UserId, EL.ParentID, T2.GroupID, G.EntityLevelID FROM #UserJobs T2 INNER JOIN #GROUP G ON T2.GROUPID = G.ID inner join #EntityLevel el on G.EntityLevelID = el.Id INNER JOIN MyCTE itms ON EL.ParentID >= itms.ID -- <<<< PROBLEM!! As we see above, the value in itms.ID for the first part of this query is [9]. This needs to join to a value in the #EntityLevel.ParentID field. But if you look in the values you are inserting into the #EntityLevel table, your highest ParentID value is a [6]. Since there is no record matching the itms.ID value, no additional records are linked. A similar problem comes with the UserID = 3 record (Examine the output of the queries to figure out why). To recap - If you want an item to be linked to another item in a tree, there must be a specific, unique link between the items. You need to ensure that the specific, unique link exists. Note that it does not need to be a single data value, but every time your tree forks, the elements on one branch must be identifiably distinct from the elements on the other branch based on their data values.
SQL SERVER Duplicated Row Data in Subquery
I want to extract the result of a person in a poll by type of poll and a determined year, group by area. This is the tables scripts and some sample data: /****** Object: Table [dbo].[ANSWERS] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[ANSWERS]( [FK_QUESTION] [int] NOT NULL, [CHOICE] [smallint] NOT NULL, [TYPE_POLL] [bit] NOT NULL, [FK_ID_PERSON] [decimal](18, 0) NOT NULL, CONSTRAINT [PK_ANSWERS] PRIMARY KEY CLUSTERED ( [FK_QUESTION] ASC, [TYPE_POLL] ASC, [FK_ID_PERSON] 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 /****** Object: Table [dbo].[AREA] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[AREA]( [ID_AREA] [int] IDENTITY(1,1) NOT NULL, [FK_POLL] [int] NULL, [NAME_AREA] [varchar](100) NULL, CONSTRAINT [PK_AREA] PRIMARY KEY CLUSTERED ( [ID_AREA] 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 /****** Object: Table [dbo].[JOBS] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[JOBS]( [ID_JOB] [int] NOT NULL, [NAME_JOB] [varchar](50) NOT NULL, CONSTRAINT [PK_srh3100t] PRIMARY KEY CLUSTERED ( [ID_JOB] 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 /****** Object: Table [dbo].[PERSON] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[PERSON]( [ID_PERSON] [decimal](18, 0) NOT NULL, [JOB_PERSON] [int] NOT NULL, [NAME] [varchar](200) NOT NULL, [LAST_NAME] [varchar](200) NOT NULL, CONSTRAINT [PK_PERSON] PRIMARY KEY CLUSTERED ( [ID_PERSON] 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 /****** Object: Table [dbo].[POINTS] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[POINTS]( [FK_JOB] [int] NOT NULL, [FK_QUESTION] [int] NOT NULL, [POINT] [numeric](4, 2) NOT NULL, CONSTRAINT [PK_POINTS_1] PRIMARY KEY CLUSTERED ( [FK_JOB] ASC, [FK_QUESTION] 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 /****** Object: Table [dbo].[POLL] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[POLL]( [ID_POLL] [int] IDENTITY(1,1) NOT NULL, [YEARS] [smallint] NOT NULL, [NAME] [varchar](100) NOT NULL, [DATE_BEG] [date] NOT NULL, [DATE_END] [date] NOT NULL, [AUTO] [numeric](4, 2) NOT NULL, [BOSS] [numeric](4, 2) NOT NULL, CONSTRAINT [PK_POLL_1] PRIMARY KEY CLUSTERED ( [ID_POLL] 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 /****** Object: Table [dbo].[QUESTION] Script Date: 09/09/2015 7:08:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[QUESTION]( [ID_QUESTION] [int] IDENTITY(1,1) NOT NULL, [FK_AREA] [int] NULL, [NAME] [varchar](50) NULL, [DESCRIPTION] [varchar](400) NULL, CONSTRAINT [PK_QUESTION] PRIMARY KEY CLUSTERED ( [ID_QUESTION] 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 INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (1, 1, 0, CAST(1 AS Decimal(18, 0))) INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (1, 1, 1, CAST(1 AS Decimal(18, 0))) INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (2, 1, 0, CAST(1 AS Decimal(18, 0))) INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (2, 2, 1, CAST(1 AS Decimal(18, 0))) INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (3, 3, 0, CAST(1 AS Decimal(18, 0))) INSERT [dbo].[ANSWERS] ([FK_QUESTION], [CHOICE], [TYPE_POLL], [FK_ID_PERSON]) VALUES (3, 1, 1, CAST(1 AS Decimal(18, 0))) SET IDENTITY_INSERT [dbo].[AREA] ON INSERT [dbo].[AREA] ([ID_AREA], [FK_POLL], [NAME_AREA]) VALUES (1, 1, N'AREA 1') INSERT [dbo].[AREA] ([ID_AREA], [FK_POLL], [NAME_AREA]) VALUES (2, 1, N'AREA 2') INSERT [dbo].[AREA] ([ID_AREA], [FK_POLL], [NAME_AREA]) VALUES (3, 1, N'AREA 3') INSERT [dbo].[AREA] ([ID_AREA], [FK_POLL], [NAME_AREA]) VALUES (4, 1, N'AREA 4') SET IDENTITY_INSERT [dbo].[AREA] OFF INSERT [dbo].[JOBS] ([ID_JOB], [NAME_JOB]) VALUES (1, N'JOB 1') INSERT [dbo].[JOBS] ([ID_JOB], [NAME_JOB]) VALUES (2, N'JOB 2') INSERT [dbo].[JOBS] ([ID_JOB], [NAME_JOB]) VALUES (3, N'JOB 3') INSERT [dbo].[JOBS] ([ID_JOB], [NAME_JOB]) VALUES (4, N'JOB 4') INSERT [dbo].[PERSON] ([ID_PERSON], [JOB_PERSON], [NAME], [LAST_NAME]) VALUES (CAST(1 AS Decimal(18, 0)), 1, N'MATT', N'TUCK') INSERT [dbo].[PERSON] ([ID_PERSON], [JOB_PERSON], [NAME], [LAST_NAME]) VALUES (CAST(2 AS Decimal(18, 0)), 2, N'MATT', N'HEAFY') INSERT [dbo].[PERSON] ([ID_PERSON], [JOB_PERSON], [NAME], [LAST_NAME]) VALUES (CAST(3 AS Decimal(18, 0)), 3, N'SYNISTER', N'GATES') INSERT [dbo].[PERSON] ([ID_PERSON], [JOB_PERSON], [NAME], [LAST_NAME]) VALUES (CAST(4 AS Decimal(18, 0)), 4, N'THOMAS', N'YOUNGBLOOD') INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (1, 1, CAST(1.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (1, 2, CAST(2.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (1, 3, CAST(3.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (1, 4, CAST(4.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (2, 1, CAST(1.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (2, 2, CAST(2.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (2, 3, CAST(3.00 AS Numeric(4, 2))) INSERT [dbo].[POINTS] ([FK_JOB], [FK_QUESTION], [POINT]) VALUES (2, 4, CAST(4.00 AS Numeric(4, 2))) SET IDENTITY_INSERT [dbo].[POLL] ON INSERT [dbo].[POLL] ([ID_POLL], [YEARS], [NAME], [DATE_BEG], [DATE_END], [AUTO], [BOSS]) VALUES (1, 2015, N'POLL 1', CAST(0x693A0B00 AS Date), CAST(0xD23A0B00 AS Date), CAST(20.00 AS Numeric(4, 2)), CAST(80.00 AS Numeric(4, 2))) SET IDENTITY_INSERT [dbo].[POLL] OFF SET IDENTITY_INSERT [dbo].[QUESTION] ON INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (1, 1, N'QUESTION 1', N'aaa') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (2, 1, N'QUESTION 2', N'bbb') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (3, 2, N'QUESTION 3', N'ccc') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (4, 2, N'QUESTION 4', N'ddd') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (5, 3, N'QUESTION 5', N'eee') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (6, 3, N'QUESTION 6', N'fff') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (7, 4, N'QUESTION 7', N'ggg') INSERT [dbo].[QUESTION] ([ID_QUESTION], [FK_AREA], [NAME], [DESCRIPTION]) VALUES (8, 4, N'QUESTION 8', N'hhh') SET IDENTITY_INSERT [dbo].[QUESTION] OFF USE [master] GO And this is the query I have tried: SELECT AREA.NAME_AREA, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 0) AS RESULT_PERSON, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 1) AS RESULT_BOSS FROM POLL INNER JOIN AREA ON POLL.ID_POLL = AREA.FK_POLL INNER JOIN QUESTION ON AREA.ID_AREA = QUESTION.FK_AREA INNER JOIN POINTS ON QUESTION.ID_QUESTION = POINTS.FK_QUESTION INNER JOIN JOBS INNER JOIN PERSON ON JOBS.ID_JOB = PERSON.JOB_PERSON ON POINTS.FK_JOB = JOBS.ID_JOB INNER JOIN ANSWERS ON QUESTION.ID_QUESTION = ANSWERS.FK_QUESTION AND PERSON.ID_PERSON = ANSWERS.FK_ID_PERSON WHERE (POLL.YEARS = 2015) AND (PERSON.ID_PERSON = 1) GROUP BY AREA.NAME_AREA , ANSWERS.TYPE_POLL And I want the output be like this: +------------+---------------+---------------+ | NAME_AREA | RESULT_PERSON | RESULT_BOSS | +------------+---------------+---------------+ | AREA 1 | 0.6 | 1 | | AREA 2 | 1.8 | 0.6 | +------------+---------------+---------------+ But I'm getting the result like this: +------------+---------------+---------------+ | NAME_AREA | RESULT_PERSON | RESULT_BOSS | +------------+---------------+---------------+ | AREA 1 | 0.6 | NULL | | AREA 2 | 1.8 | NULL | | AREA 1 | NULL | 1 | | AREA 2 | NULL | 0.6 | +------------+---------------+---------------+ It is something I am missing...?
Without reading your query and finding better solution: SELECT t.NAME_AREA, MAX(t.RESULT_PERSON) AS RESULT_PERSON, MAX(t.RESULT_BOSS) AS RESULT_BOSS FROM ( SELECT AREA.NAME_AREA, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 0) AS RESULT_PERSON, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 1) AS RESULT_BOSS FROM POLL INNER JOIN AREA ON POLL.ID_POLL = AREA.FK_POLL INNER JOIN QUESTION ON AREA.ID_AREA = QUESTION.FK_AREA INNER JOIN POINTS ON QUESTION.ID_QUESTION = POINTS.FK_QUESTION INNER JOIN JOBS INNER JOIN PERSON ON JOBS.ID_JOB = PERSON.JOB_PERSON ON POINTS.FK_JOB = JOBS.ID_JOB INNER JOIN ANSWERS ON QUESTION.ID_QUESTION = ANSWERS.FK_QUESTION AND PERSON.ID_PERSON = ANSWERS.FK_ID_PERSON WHERE (POLL.YEARS = 2015) AND (PERSON.ID_PERSON = 1) GROUP BY AREA.NAME_AREA , ANSWERS.TYPE_POLL) AS t GROUP BY NAME_AREA; I am aware there are more efficient and secure ways, this is just quick workaround.
You can pass It to subquery and add only NAME_AREA to GROUP BY clause in following: SELECT NAME_AREA, MAX(RESULT_PERSON) AS RESULT_PERSON, MAX(RESULT_BOSS) AS RESULT_BOSS FROM( SELECT AREA.NAME_AREA, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 0) AS RESULT_PERSON, (SELECT SUM(ANSWERS.CHOICE * POINTS.POINT / 5) WHERE ANSWERS.TYPE_POLL= 1) AS RESULT_BOSS FROM POLL INNER JOIN AREA ON POLL.ID_POLL = AREA.FK_POLL INNER JOIN QUESTION ON AREA.ID_AREA = QUESTION.FK_AREA INNER JOIN POINTS ON QUESTION.ID_QUESTION = POINTS.FK_QUESTION INNER JOIN JOBS INNER JOIN PERSON ON JOBS.ID_JOB = PERSON.JOB_PERSON ON POINTS.FK_JOB = JOBS.ID_JOB INNER JOIN ANSWERS ON QUESTION.ID_QUESTION = ANSWERS.FK_QUESTION AND PERSON.ID_PERSON = ANSWERS.FK_ID_PERSON WHERE (POLL.YEARS = 2015) AND (PERSON.ID_PERSON = 1) GROUP BY AREA.NAME_AREA , ANSWERS.TYPE_POLL )x GROUP BY NAME_AREA OUTPUT NAME_AREA RESULT_PERSON RESULT_BOSS AREA 1 0.600000 1.000000 AREA 2 1.800000 0.600000
Try this SELECT AREA.NAME_AREA, Sum(CASE WHEN ANSWERS.TYPE_POLL = 0 THEN ANSWERS.CHOICE * POINTS.POINT / 5 ELSE 0 END) AS RESULT_PERSON, Sum(CASE WHEN ANSWERS.TYPE_POLL = 1 THEN ANSWERS.CHOICE * POINTS.POINT / 5 ELSE 0 END) AS RESULT_BOSS FROM POLL INNER JOIN AREA ON POLL.ID_POLL = AREA.FK_POLL INNER JOIN QUESTION ON AREA.ID_AREA = QUESTION.FK_AREA INNER JOIN POINTS ON QUESTION.ID_QUESTION = POINTS.FK_QUESTION INNER JOIN JOBS ON POINTS.FK_JOB = JOBS.ID_JOB INNER JOIN PERSON ON JOBS.ID_JOB = PERSON.JOB_PERSON INNER JOIN ANSWERS ON QUESTION.ID_QUESTION = ANSWERS.FK_QUESTION AND PERSON.ID_PERSON = ANSWERS.FK_ID_PERSON WHERE ( POLL.YEARS = 2015 ) AND ( PERSON.ID_PERSON = 1 ) GROUP BY AREA.NAME_AREA