Определите, у какой персоны есть все цветовые коды, используя таблицу цветов - PullRequest
0 голосов
/ 10 мая 2019

Я использую SQL-сервер. есть две таблицы:

таблица1: персионские краски таблица2: персоналии

как найти, какой персоны имеют весь код цвета, используя таблицу цветов.

CREATE TABLE [dbo].[colors](
    [colorcode] [varchar](50) NULL
) 

CREATE TABLE [dbo].[PersionColors](
    [Name] [varchar](50) NULL,
    [ColorCode] [varchar](50) NULL
) 
INSERT [dbo].[colors] ([colorcode]) VALUES (N'Red')
GO
INSERT [dbo].[colors] ([colorcode]) VALUES (N'Blue')
GO
INSERT [dbo].[colors] ([colorcode]) VALUES (N'Green')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Tom', N'Red')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Tom', N'Blue')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Tom', N'Green')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Tom', N'Brown')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Joe', N'Red')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Joe', N'Blue')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Joe', N'Green')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Hari', N'Red')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Hari', N'Blue')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Nani', N'Blue')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Test', N'Orange')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'Hari', N'ye')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'a', N'j')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'a', N'c')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'a', N't')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'a', N'u')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'b', N'u')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'b', N'i')
GO
INSERT [dbo].[PersionColors] ([Name], [ColorCode]) VALUES (N'b', N'o')

Основываясь на двух таблицах выше, я хочу вывод, как показано ниже: название Джо Том Я попробовал, как показано ниже:

select name  from  [dbo].[PersionColors] p
join colors c
on p.colorcode=c.colorcode 
group by name 
having (count(distinct p.colorcode ))=(select count(*)cnt from colors)

запрос выше дает ожидаемый результат. но запрос занимает больше времени при использовании отдельного предложения в приведенных выше двух таблицах есть большой набор данных (миллиарды записей)

Подскажите, пожалуйста, альтернативное решение для решения этой задачи на сервере SQL

enter image description here

1 Ответ

1 голос
/ 10 мая 2019

Слепое предположение, может быть, условная агрегация, если у вас есть Person Таблица (которую вы должны использовать для нормализованных данных)?

SELECT P.[Name]
FROM dbo.Person P
     CROSS JOIN dbo.Colors C
     LEFT JOIN dbo.PersonColors PC ON P.[Name] = PC.[Name] AND C.ColourCode = PC.ColourCode
GROUP BY P.[Name]
HAVING COUNT(CASE WHEN PC.ColourCode IS NULL THEN 1 END) = 0;

если у вас нет таблицы Person, я предлагаю создать ее для нормализации ваших данных.

...