2016-09-13 1 views
1

나는 테이블의 이름/값 쌍의 기록을하고 난 값을 확인해야하는 각 이름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   | 

LookupTable의 - (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에있는 경우 에 대한 조회가 KeyVal 테이블의 모든 값의 LookupTable 테이블을 통해 확인 할 수있는 방법은?

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] 

샘플 데이터

을 쿼리에서 반환되는 잘못된 값이 두 행을 결과

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

샘플 테이블 -

내가 얻을 바라고 무엇인가
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

관련 문제