Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно еще быстрей? пересечение дочерних множеств  [new]
Onax
Member

Откуда:
Сообщений: 23
суть довольно проста - дана запись, надо найти другую запись у которой пересекаются записи в дочерней таблице
например найти человека который был в любом из мест где были вы (достаточно одного)
я чето намудрил в схеме, сильно дофига таких запросов получается по разным таблицам..

скрипт схемы
	use SimpleDb;
	GO
	drop table [Person];
	GO
	drop table [Place];
	GO
	CREATE TABLE [Person] (id int NOT NULL,Name nvarchar(250) NULL CONSTRAINT PersonPK PRIMARY KEY CLUSTERED ([Id] ASC))
	GO
	CREATE TABLE Place (id int IDENTITY(1,1) NOT NULL,PersonId int NOT NULL,Title nvarchar(250) NULL, CONSTRAINT PlacePK PRIMARY KEY CLUSTERED ([Id] ASC)	)  
	GO	  
	INSERT INTO [Person]([id],[Name])    VALUES (1, 'User1')
	INSERT INTO [Person] ([id],[Name])    VALUES (2, 'User2')
	INSERT INTO [Person] ([id],[Name])    VALUES (3, 'User3')
	go
	INSERT INTO Place ([PersonId],[Title])    VALUES (1, 'London')
	INSERT INTO Place ([PersonId],[Title])    VALUES (1, 'Madrid')
	INSERT INTO Place ([PersonId],[Title])    VALUES (1, 'Rom')

	INSERT INTO Place ([PersonId],[Title])    VALUES (2, 'London')
	INSERT INTO Place ([PersonId],[Title])    VALUES (2, 'Tokio')

	INSERT INTO Place ([PersonId],[Title])    VALUES (3, 'Paris')
	INSERT INTO Place ([PersonId],[Title])    VALUES (3, 'Berlin')
	go


мои попытки
	declare @userId int = 1; --искомый (правильный ответ user2)
 
	select t.* from Person t
	join Place p on t.id=p.PersonId 
		AND p.PersonId != @userid  
		AND p.Title in (select Title from place where PersonId = @userId)

        
	select t.* from Person t
	join Place p on t.id=p.PersonId 
		JOIN (select Title from place where PersonId = @userId) a on p.Title=a.Title and p.PersonId!=@userId;


К сообщению приложен файл. Размер - 19Kb
5 ноя 15, 22:03    [18375822]     Ответить | Цитировать Сообщить модератору
 Re: Можно еще быстрей? пересечение дочерних множеств  [new]
Onax
Member

Откуда:
Сообщений: 23
ну как обычно, пока писал топик сам же и нашел лучший вариант (первый)
наконец понял как читать планы - их не надо читать, просто пачкой выполнить и выбрать где стоимость выполнения меньше
пока двухминутный запрос скатился до двух секунд, можно дальше гадить в схеме
5 ноя 15, 22:44    [18375902]     Ответить | Цитировать Сообщить модератору
 Re: Можно еще быстрей? пересечение дочерних множеств  [new]
intersect,
Guest
Onax,

select * from [Person] p
where exists (select [Title] from Place where [PersonId]=@userId intersect select [Title] from Place where [PersonId]=p.[id])
  and [id]<>@userId

не ?
5 ноя 15, 22:57    [18375928]     Ответить | Цитировать Сообщить модератору
 Re: Можно еще быстрей? пересечение дочерних множеств  [new]
уть довольно проста
Guest
Onax,

еще place.title убери к чертям собачьим из фильтрации/intersect и вообще хорошо будет
5 ноя 15, 23:10    [18375956]     Ответить | Цитировать Сообщить модератору
 Re: Можно еще быстрей? пересечение дочерних множеств  [new]
o-o
Guest
Onax
наконец понял как читать планы - их не надо читать, просто пачкой выполнить и выбрать где стоимость выполнения меньше

там стоимость оценочная, а не актуальная.
и если с оценкой промашка, то и в процентах ерунда.
вот пример 16805364, когда на картинке распределение стоимостей 50:50:1
а на самом деле по времени 1:1:2
5 ноя 15, 23:44    [18376019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить