1

Position、Employee、Training、Trmatrix の 4 つのテーブルがあります。

テーブルの位置

PositionId PosName 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ペソ
  4 フォトショップ
  5 Jクエリ
  6 クライアントの取り扱い

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 基本的な目的は、trmatrix テーブルに対応する EMployee.Courseid 列に存在しないコース/トレーニング名を取得することです。これは、従業員にエントリがない trmatrix テーブルからすべてのエントリを取得する必要があることを定義します表 Courseid 列。Alex の場合、コース 4 を除くすべてのデータを trmatrix テーブルからフェッチする必要があるとします。コース 4 は Employee テーブルの courseid 列にあるため、4 ではなくコース 1、2、3 が返されます。 SQL の初心者なので、この問題を解決してください。

前もって感謝します

4

3 に答える 3

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 に答える