Asp.net 仅选择SQL Server 2014中通过表继承实现的表列的名称
我有一个问题,关于在SQL Server 2014中仅选择表继承实现的表列的名称 也就是说,有四种类型的人(学生、教师、员工和主管),所有这些人都包含从Asp.net 仅选择SQL Server 2014中通过表继承实现的表列的名称,asp.net,sql-server,listview,inheritance,sqldatasource,Asp.net,Sql Server,Listview,Inheritance,Sqldatasource,我有一个问题,关于在SQL Server 2014中仅选择表继承实现的表列的名称 也就是说,有四种类型的人(学生、教师、员工和主管),所有这些人都包含从人员表继承的每种类型人员的id,以及必须选择和显示的姓名 表TypePerson: CREATE TABLE [TypesPerson] ( [typePersonID] INT NOT NULL, [typePerson] VARCHAR(50) NOT NULL, CONSTRAINT [PK_TypesPerson
人员
表继承的每种类型人员的id
,以及必须选择和显示的姓名
表TypePerson
:
CREATE TABLE [TypesPerson]
(
[typePersonID] INT NOT NULL,
[typePerson] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_TypesPerson] PRIMARY KEY CLUSTERED ([typePersonID] ASC)
);
CREATE TABLE [Person]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] INT NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
);
CREATE TABLE [Students]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 1 PERSISTED, --type person = 1
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Students] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Teachers]
(
[PersonID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 2 PERSISTED, --type person = 2
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Teachers ] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Teachers ] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Employers]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 3 PERSISTED, --type person = 3
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Employers] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Employers] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
为人员类型插入
:
INSERT INTO [TypesPerson]
SELECT 1,'students' UNION ALL
SELECT 2,'teachers' UNION ALL
SELECT 3,'employer' UNION ALL
SELECT 4,'supervisor'
表人员
:
CREATE TABLE [TypesPerson]
(
[typePersonID] INT NOT NULL,
[typePerson] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_TypesPerson] PRIMARY KEY CLUSTERED ([typePersonID] ASC)
);
CREATE TABLE [Person]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] INT NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
);
CREATE TABLE [Students]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 1 PERSISTED, --type person = 1
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Students] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Teachers]
(
[PersonID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 2 PERSISTED, --type person = 2
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Teachers ] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Teachers ] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Employers]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 3 PERSISTED, --type person = 3
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Employers] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Employers] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
表学生
扩展人
:
CREATE TABLE [TypesPerson]
(
[typePersonID] INT NOT NULL,
[typePerson] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_TypesPerson] PRIMARY KEY CLUSTERED ([typePersonID] ASC)
);
CREATE TABLE [Person]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] INT NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
);
CREATE TABLE [Students]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 1 PERSISTED, --type person = 1
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Students] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Teachers]
(
[PersonID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 2 PERSISTED, --type person = 2
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Teachers ] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Teachers ] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Employers]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 3 PERSISTED, --type person = 3
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Employers] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Employers] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
表教师
扩展人员
:
CREATE TABLE [TypesPerson]
(
[typePersonID] INT NOT NULL,
[typePerson] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_TypesPerson] PRIMARY KEY CLUSTERED ([typePersonID] ASC)
);
CREATE TABLE [Person]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] INT NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
);
CREATE TABLE [Students]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 1 PERSISTED, --type person = 1
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Students] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Teachers]
(
[PersonID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 2 PERSISTED, --type person = 2
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Teachers ] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Teachers ] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Employers]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 3 PERSISTED, --type person = 3
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Employers] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Employers] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
表雇主
扩展人员
:
CREATE TABLE [TypesPerson]
(
[typePersonID] INT NOT NULL,
[typePerson] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_TypesPerson] PRIMARY KEY CLUSTERED ([typePersonID] ASC)
);
CREATE TABLE [Person]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] INT NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
);
CREATE TABLE [Students]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 1 PERSISTED, --type person = 1
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Students] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Teachers]
(
[PersonID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 2 PERSISTED, --type person = 2
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Teachers ] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Teachers ] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
CREATE TABLE [Employers]
(
[personID] INT IDENTITY (1, 1) NOT NULL ,
[typePersonID] AS 3 PERSISTED, --type person = 3
[name] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_Employers] PRIMARY KEY CLUSTERED ([PersonID] ASC),
CONSTRAINT [FK_Employers] FOREIGN KEY ([typePersonID])
REFERENCES [Person] ([typePersonID]),
);
插入数据以创建具有以下类型的人员:
INSERT INTO [Person] ([typePersonID]) VALUES (1); --students
INSERT INTO [Person] ([typePersonID]) VALUES (2); --teachers
INSERT INTO [Person] ([typePersonID]) VALUES (3); --employer
INSERT INTO [Person] ([typePersonID]) VALUES (4); --supervisor
插入数据以创建学生、教师和雇主:
INSERT INTO [Students] ([name]) VALUES ('John'); --students
INSERT INTO [Teachers] ([name]) VALUES ('Robert'); --teachers
INSERT INTO [Employers] ([name]) VALUES ('Ciara'); --employer
INSERT INTO [Supervisor] ([name]) VALUES ('Renata'); --supervisor
当我使用此脚本仅选择名称时
SELECT st.name, ts.name, es.name, sp.name
FROM Person p
INNER JOIN Students st ON p.personID= st.personID
INNER JOIN Teachers ts ON p.personID= ts.personID
INNER JOIN Employers es ON p.personID= es.personID
INNER JOIN Supervisor sp ON p.personID= sp.personID;
结果是
当我使用
有什么建议吗?尝试以下方法时,您会感到惊讶:
SELECT t.typePerson, sp.name
FROM Person p
INNER JOIN [TypesPerson] as t ON p.[typePersonID] = t.[typePersonID]
INNER JOIN Supervisor sp ON p.personID= sp.personID;
问题是您有两个问题:
1.重复数据:typePersonID
为同一个人存储两次。
2.Person
中的personID
与其他表中的personID
没有任何关联
本质上,最好只有一个Person
表,只需在其中添加name列即可。它会解决你所有的问题
而且,代替
CONSTRAINT [PK_UN_Person_Type] UNIQUE ([typePersonID])
放
通过使用Pivot
您可以实现您的结果。但用简单的方法你可以试试
SELECT st.name Name
FROM Person p
INNER JOIN Students st ON p.personID= st.personID
union
SELECT ts.name Name
FROM Person p
INNER JOIN Teachers ts ON p.personID= ts.personID
union
SELECT es.name Name
FROM Person p
INNER JOIN Employers es ON p.personID= es.personID
union
SELECT sp.name Name
FROM Person p
INNER JOIN Supervisor sp ON p.personID= sp.personID
你必须使用unpivot。您的Person
表设计允许最多插入4行,每种“类型的人”一行。@AlexKudryashev,我不这样说,因为它有很多问题的代码,我发现Adityathanks的答案很有价值,而且它的工作非常完美,列表视图水平显示所有姓名,