2016-09-13 4 views
1

I表中の名前/値ペアのレコードを持っていると私は値を確認する必要があり、各名前SQLクエリのチェック値は、別の列の値に基づいて、ルックアップに存在する

KEYVALのためのルックアップに対して存在する - のNameValueのペアの表

| MyID1 | MyRecNumber | MyFieldName | MyFieldValue | 
|-------|-------------|-------------|--------------| 
| 1  | 1   | FirstField | One   | 
| 2  | 1   | SecondField | Car   | 
| 3  | 2   | FirstField | Two   | 
| 4  | 2   | SecondField | Firetruck | 
| 5  | 3   | FirstField | Blue   | 
| 6  | 3   | SecondField | Car   | 

ルックアップテーブル - (CheckValsテーブル内)LookupValueと(KEYVALから)名の値と一致するように、表

| MyID2 | MyFieldName | LookupName | 
|-------|-------------|------------| 
| 1  | FirstField | FieldOne | 
| 2  | SecondField | FieldTwo | 

CheckVals - 各フィールドの有効な値を持つ表

| MyID3 | LookupFieldName | LookupValue | 
|-------|-----------------|-------------| 
| 1  | FieldOne  | One   | 
| 2  | FieldOne  | Two   | 
| 3  | FieldOne  | Three  | 
| 4  | FieldTwo  | Car   | 
| 5  | FieldTwo  | Truck  | 
| 6  | FieldTwo  | Bus   | 

私は、単一の名前の検索に対して値をチェックしますクエリを持っているが、これは、ルックアップテーブルに対するすべての名前を確認するようにする方法がわからないと思います。このクエリでは、照会自体でルックアップ値を指定するときにLookupTableをバイパスします。

DECLARE @AttributeName AS VARCHAR(50) 
DECLARE @Lookup AS VARCHAR(50) 

SET @AttributeName = 'SecondField' 
SET @Lookup = 'FieldTwo'; 

SELECT 
    MyRecNumber, 
    MyFieldName, 
    MyFieldValue 
FROM 
    dbo.KeyVal kv 
WHERE 
    MyFieldName = @AttributeName 
    AND MyFieldValue NOT IN 
     (
      SELECT 
       LookupValue 
      FROM 
       dbo.CheckVals cv 
      WHERE cv.LookupFieldName = @Lookup 
     ) 

質問:はどのように私はMyFieldValueの値がMyFieldNameLookupName試合に対してCheckValsに存在するかどうかをチェックするために、LookupTableテーブルを介して、KeyValテーブル内のすべての値に対して検索を行うことができますか?

これは私が得ることを望んだものです - 無効な値がクエリで返された2つの行が

| MyRecNumber | MyFieldName | MyFieldValue | 
|-------------|-------------|--------------| 
| 2   | SecondField | Firetruck | 
| 3   | FirstField | Blue   | 

サンプル表

CREATE TABLE [dbo].[KeyVal](
    [MyID1] [smallint] IDENTITY(1,1) NOT NULL, 
    [MyRecNumber] [smallint] NULL, 
    [MyFieldName] [varchar](50) NULL, 
    [MyFieldValue] [varchar](50) NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[LookupTable](
    [MyID2] [smallint] IDENTITY(1,1) NOT NULL, 
    [MyFieldName] [varchar](50) NULL, 
    [LookupName] [varchar](50) NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[CheckVals](
    [MyID3] [smallint] IDENTITY(1,1) NOT NULL, 
    [LookupFieldName] [varchar](50) NULL, 
    [LookupValue] [varchar](50) NULL 
) ON [PRIMARY] 

サンプルデータ

の結果
INSERT INTO [dbo].[KeyVal] 
    ([MyRecNumber], [MyFieldName], [MyFieldValue]) 
VALUES 
    (1, 'FirstField', 'One'), 
    (1, 'SecondField', 'Car'), 
    (2, 'FirstField', 'Two'), 
    (2, 'SecondField', 'Firetruck'), 
    (3, 'FirstField', 'Blue'), 
    (3, 'SecondField', 'Car') 

INSERT INTO [dbo].[LookupTable] 
    ([MyFieldName], [LookupName]) 
VALUES 
    ('FirstField', 'FieldOne'), 
    ('SecondField', 'FieldTwo') 

INSERT INTO [dbo].[CheckVals] 
    ([LookupFieldName], [LookupValue]) 
VALUES 
    ('FieldOne', 'One'), 
    ('FieldOne', 'Two'), 
    ('FieldOne', 'Three'), 
    ('FieldTwo', 'Car'), 
    ('FieldTwo', 'Truck'), 
    ('FieldTwo', 'Bus') 
+0

質問を編集し、取得したい結果を表示してください。 –

答えて

1

私はあなたが値が一致しない最初のテーブルの行を望むと仮定します:

select kv.* 
from keyval kv left join 
    lookuptable lt 
    on kv.myfieldname = lt.myfieldname left join 
    checkvals cv 
    on cv.LookupFieldName = lt.LookupName and 
     cv.LookupValue = kv.MyFieldValue 
where cv.myid3 is null; 
+0

ありがとうございます!私はこれを過度に考えていた – Midavalo