我有4个职位,员工,培训和Trmatrix。
表位
PositionId PosName TrainingId 1 developer 1,2,3 2 Designer 4,5 3 BDA 2,3,6
表员工
Employeeid Ename Posid Courseid 1 Alex 1 4 2 Shaun 2 1,2,3 3 Hales 3
表格培训
Trainingid Trainingname 1 JAVA 2 Dot Net 3 PHP 4 Photoshop 5 JQUERY 6 Client Handling
TrMatrix
TrmatId TrID empID 1 1 1 2 2 1 3 3 1 4 4 1 5 4 2 6 5 2 7 1 2 8 2 2 9 2 3 10 3 3外键关系 trmatrix trId对应于trainingtable的trainingID。 Employee posid对应于Positiontable的PositionId。 Employee courseId对应于trianingtable的trainingId。
BY基本目标是获得该课程/培训名称 EMployee.Courseid列对应于trmatrix表, 它定义了我必须从trmatrix表中获取employee表的Courseid列中没有条目的所有条目。 假设在Alex的情况下我必须从trmatrix表中获取除课程4以外的所有数据,因为它存在于Employee表的courseid列中,因此它将返回当前的1,2,3而不是no 4。 我是SQL的新手所以请帮我解决这个问题。
提前致谢
答案 0 :(得分:1)
首先,你应该制作PositionTraining和EmployeeCourse表:
PositionTraining
PositionId TrainingId
1 1
1 2
1 3
2 4
2 5
3 2
3 3
3 6
EmployeeCourse
Employeeid Courseid
1 4
2 1
2 2
3 3
然后移除Position.TrainingId
和Employee.Courseid
。
通过这样做,您可以更轻松地查询数据。
答案 1 :(得分:1)
要获取一张桌子中不存在的东西,您可以使用
WHERE NOT EXISTS (SELECT value FROM OtherTable)
或
WHERE NOT IN (SELECT value FROM OtherTable)
然而,有一类称为子查询的查询,这些在这种情况下非常有用,关于它们的一篇非常好的文章就在这里 http://allenbrowne.com/subquery-01.html (它为ms访问而写,但是synstax和MS SQL规则完全相同所以不要推迟)
答案 2 :(得分:0)
用于拆分条目的UDF
Create function [dbo].[atf_BarListToTable]
(@list ntext)
RETURNS @tbl TABLE (ListPosn int IDENTITY(1, 1) NOT NULL,
SString VARCHAR(1028) NOT NULL) AS
BEGIN
DECLARE @pos int
DECLARE @textpos int
DECLARE @ChunkLength smallint
DECLARE @str nvarchar(4000)
DECLARE @tmpstr nvarchar(4000)
DECLARE @leftover nvarchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SET @ChunkLength = 4000 - datalength(@leftover) / 2
SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @ChunkLength))
SET @textpos = @textpos + @ChunkLength
SET @pos = charindex('|', @tmpstr)
WHILE @pos > 0
BEGIN
SET @str = substring(@tmpstr, 1, @pos - 1)
INSERT @tbl (SString) VALUES( @str)
SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
SET @pos = charindex('|', @tmpstr)
END
SET @leftover = @tmpstr
END
IF ltrim(rtrim(@leftover)) <> ''
INSERT @tbl (SString) VALUES(@leftover)
RETURN
END