在SQL存储过程中实现此连接

时间:2013-04-23 08:05:46

标签: sql stored-procedures join

我有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的新手所以请帮我解决这个问题。

提前致谢

3 个答案:

答案 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.TrainingIdEmployee.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