Запрос SQL SERVER, Взаимные строки в заданном идентификаторе - PullRequest
1 голос
/ 20 мая 2011

У меня вопрос к серверу sql.У меня есть таблица, как показано ниже.Давая параметр хранимой процедуре, мне нужно запросить взаимные пользовательские поля в списках, которые я хочу.Например, если для ListID заданы значения 1, 2 и 3, таблица результатов будет иметь столбцы, в которых в этом случае будет указано «FullName», поскольку во всех трех идентификаторах присутствует только «FullName».Я сделал то, что как-то решило проблему, но искал лучшую и точную практику.Спасибо

SELECT DISTINCT(CustomField) 
FROM CustomFields a
WHERE EXISTS (
      SELECT count(*) 
      FROM CustomFields b 
      WHERE a.CustomField = b.CustomField 
      HAVING count(*)>2
)
ORDER BY a.CustomField


CustomField   ListID
PhoneNumber   1
Unvan         1
FullName      2
Surname       2
Regiob        2
FullName      3
BirthPlace    3
FullName      1

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Вот более распространенный подход для поиска пользовательских полей в группах 1, 2 и 3:

SELECT  CustomField
FROM    CustomFields
WHERE   ListID in (1,2,3)
GROUP BY
        CustomField
HAVING  COUNT(DISTINCT ListId) = 3

Подзапрос не требуется, а предложение where отфильтровывает неинтересные группы перед group by.

2 голосов
/ 20 мая 2011

Я думал о чем-то более в этом направлении, что адаптировано из @Andomar и немного более общее.

CREATE TYPE ListIdType AS TABLE (
  ListId int PRIMARY KEY
);
GO

CREATE PROCEDURE S
    @ListIdTable ListIdType READONLY
AS BEGIN SET NOCOUNT ON;

SELECT  CustomField
FROM    CustomFields
WHERE   ListID in (SELECT ListId FROM @ListIdTable)
GROUP BY
        CustomField
HAVING  COUNT(DISTINCT ListId) = (SELECT COUNT(ListId) FROM @ListIdTable)

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...