Запрос на выбор существующего ключа - PullRequest
1 голос
/ 28 ноября 2011

У меня есть таблица со следующими данными

key     code
============
key1    220
key1    221
key2    220
key2    221
key2    222
key3    220
key4    255
key5    220
key5    221

Комбинация ключа и кода не может повторяться в таблице (2 столбца используются в качестве составных первичных ключей).Мне понравится запрос, который выберет подходящие ключи для данного набора кодов, например, для кодов 220, 221, ожидаемый результат будет key1 и key 5, потому что только они точно соответствуют этому набору кодов.

Ответы [ 4 ]

2 голосов
/ 28 ноября 2011

Вы ищете что-то подобное ??

DECLARE @Test TABLE (TblKey CHAR(4), code INT)

INSERT INTO @test VALUES('key1', 220),('key1', 221),('key2', 220),('key2', 221),
                        ('key2', 222),('key3', 220),('key3', 220),
                        ('key4', 255),('key5', 220), ('key5', 221)

SELECT TblKey FROM @Test WHERE Code = 220
INTERSECT
SELECT TblKey FROM @Test WHERE Code = 221

Когда я запускаю это, я получаю вывод key1, key2, key5 - у каждого из которых есть запись со значениями 220 и 221 в вашем примере.

2 голосов
/ 28 ноября 2011

Вставьте искомые значения в табличную переменную @Match и используйте ее в запросе к вашей таблице @T.

declare @T table
(
  [key] char(4),
  code int,
  primary key([key], code)
)

insert into @T values
('key1',    220),
('key1',    221),
('key2',    220),
('key2',    221),
('key2',    222),
('key3',    220),
('key3',    333),
('key4',    255),
('key5',    220),
('key5',    221)

declare @Match table (code int)
insert into @Match values (220),(221)

select T.[key]
from @T as T
  left outer join @Match as M
    on T.code = M.code
group by T.[key]
having count(*) = (select count(*) from @Match) and
       count(M.code) = (select count(*) from @Match)

http://data.stackexchange.com/stackoverflow/q/119432/

1 голос
/ 28 ноября 2011

Просто чтобы бросить еще один вариант на стол:

declare @KeyCode Table
(
    [Key] nvarchar(10),
    Code nvarchar(10)
)

insert into @KeyCode values('key1',    220)
insert into @KeyCode values('key1',    221)
insert into @KeyCode values('key2',    220)
insert into @KeyCode values('key2',    221)
insert into @KeyCode values('key2',    222)
insert into @KeyCode values('key3',    220)
insert into @KeyCode values('key3',    220)
insert into @KeyCode values('key4',    255)
insert into @KeyCode values('key5',    220)
insert into @KeyCode values('key5',    221)

select [Key]
from @KeyCode
where Code = 220

intersect

select [Key]
from @KeyCode
where Code = 221

except 

select [Key]
from @KeyCode
where Code not in (220,221)

Возвращает key1 и key5.

Рабочий пример.

0 голосов
/ 28 ноября 2011

Вы имеете в виду что-то подобное?

SELECT key 
FROM tblKeyCodes 
where code in (220,221)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...