2016-09-13 8 views
1

У меня есть имя/значение пара записи в таблице, и мне нужно, чтобы подтвердить значения существует в отношении поиска для каждого имениSQL существует в поиске на основе другого значения столбца

KeyVal - таблица имени-значение пара

| 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 - Таблица для соответствия Имя значения (от KeyVal) с LookupValue (в таблице) CheckVals

| 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 
     ) 

Вопрос: Как я могу сделать поиск против все значения в таблице KeyVal, через LookupTable стол, чтобы проверить, если значение в MyFieldValue существует в CheckVals против матча MyFieldName и LookupName?

Это то, что я надеюсь получить - две строки, которые имеют недопустимые значения возвращаются в результатах запроса

| 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

Let я предполагаю, что вам нужны строки в первой таблице, где значения не совпадают:

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

Смежные вопросы