1

我有 4 个表 Position、Employee、Training 和 Trmatrix。

表位置

PositionId 职位名称 TrainingId
  1 开发者 1,2,3
  2 设计师 4,5
  3 BDA 2,3,6

表员工

Employeeid Ename Posid Courseid
   1 亚历克斯 1 4
   2 肖恩 2 1,2,3
   3 哈尔斯 3        
 

餐桌训练

Trainingid 培训名称
  1 爪哇
  2点网
  3 PHP
  4 Photoshop
  5 查询
  6 客户处理

矩阵

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

foreign Key 关系 trmatrix trId 对应于trainingtable的trainingID。Employee posid 对应于 Positiontable 的 PositionId。Employee courseId 对应 trianingtable 的 trainingId。

通过基本目标是获取与 trmatrix 表相对应的 EMployee.Courseid 列中不存在的课程/培训名称,该表定义我必须从 trmatrix 表中获取员工中没有条目的所有条目表 Courseid 列。假设在 Alex 的情况下,我必须从 trmatrix 表中获取除 course 4 之外的所有数据,因为它存在于 Employee 表的 courseid 列中,所以它会返回 course no 1,2,3 而不是 no 4。我我是 SQL 的新手,所以请帮我解决这个问题。

提前致谢

4

3 回答 3

1

首先,您还应该制作 PositionTraining 和 EmployeeCourse 表:

职位培训

PositionId   TrainingId
  1          1
  1          2
  1          3
  2          4
  2          5
  3          2
  3          3
  3          6

员工课程

Employeeid    Courseid 
   1          4
   2          1
   2          2
   3          3

然后删除Position.TrainingIdand Employee.Courseid

通过这样做,您可以更轻松地查询数据。

于 2013-04-23T08:33:18.003 回答
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规则完全相同,所以不要推迟)

于 2013-04-23T08:41:04.027 回答
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
于 2013-04-23T14:12:55.787 回答