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

Откуда: UA, Kiev
Сообщений: 119
Есть объект, к нему может быть привязано сколько угодно реквизитов.
Как выбрать те объекты, к которым привязано как минимум 2 из 5 определенных реквизитов?
27 ноя 09, 14:15    [7987907]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Структуру таблицы, в которой есть эти реквизиты, надо угадать?
27 ноя 09, 14:31    [7988068]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Glory
Member

Откуда:
Сообщений: 104760
Excel
Есть объект, к нему может быть привязано сколько угодно реквизитов.
Как выбрать те объекты, к которым привязано как минимум 2 из 5 определенных реквизитов?

Просуммировать число реквизитов объекта с фильтром ?
27 ноя 09, 14:32    [7988096]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
object
(
id int IDENTITY
name varcah(64))


property
(
id int identity,
ownerid int REFFERENCES object.id
typeid int -- это то что я знаю, скажем проверить для типов (1,2,3,4,5)
value varchar(64)
)
27 ноя 09, 14:36    [7988153]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Glory,
думаю, если не подскажут с каким-то логическим XOR'ом, в которых я не соображаю, то буду суммировать
27 ноя 09, 14:38    [7988171]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Glory
Member

Откуда:
Сообщений: 104760
Excel
Glory,
думаю, если не подскажут с каким-то логическим XOR'ом, в которых я не соображаю, то буду суммировать

Какой еще XOR, если каждый реквизит каждого объекта занимает ровно одну запись ?
27 ноя 09, 14:40    [7988194]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT o.*
FROM [object] o JOIN [property] p ON o.id=p.ownerid
WHERE p.typeid IN(1,2,3,4,5) AND (SELECT COUNT(DISTINCT pp.typeid) FROM [property] pp WHERE pp.ownerid=o.id)>=2;
27 ноя 09, 14:42    [7988209]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Влом регистрироваться
Guest
Excel,

SELECT
ownerid
FROM
(
SELECT
ownerid,
SUM(CASE WHEN typeid IN (1,2,3,4,5) THEN 1 ELSE 0 END) AS pcount
FROM
property
GROUP BY
ownerid
) Q
WHERE
pcount > 2
27 ноя 09, 14:43    [7988220]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Влом регистрироваться
Guest
Пардон муа.

SELECT 
	ownerid 
FROM
( 
	SELECT 
		ownerid, 
		SUM(CASE WHEN typeid IN (1,2,3,4,5) THEN 1 ELSE 0 END) AS pcount
	FROM 
		@property 
	GROUP BY 
		ownerid
) Q
WHERE
	pcount > 1
27 ноя 09, 14:44    [7988235]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
SELECT o.*
FROM [object] o JOIN [property] p ON o.id=p.ownerid
WHERE p.typeid IN(1,2,3,4,5) AND (SELECT COUNT(DISTINCT pp.typeid) FROM [property] pp WHERE pp.ownerid=o.id)>=2;
SELECT *
FROM [object] o
WHERE (SELECT COUNT(DISTINCT p.typeid) FROM [property] p WHERE p.typeid IN(1,2,3,4,5) AND p.ownerid=o.id)>=2;
27 ноя 09, 14:46    [7988253]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Всем спасибо.
Ближе к новому году хотелось надеяться, что есть какой-то магический XOR, который все за меня решит. :)
В любом случае, я рад, что развеяли сомнения - считать.


SELECT b.id
FROM objects b
JOIN params p
ON b.id = p.ownerid
WHERE p.typeId in (457, 458, 807, 685, 686, 486, 487)
GROPU BY b.id
HAVING count(*) > 1
27 ноя 09, 14:52    [7988293]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Excel
Ближе к новому году хотелось надеяться, что есть какой-то магический XOR, который все за меня решит. :)В любом случае, я рад, что развеяли сомнения - считать.
что ж, вот вам к Новому году небольшой сувенир - тот самый магический XOR :-)
1) test data:
+
declare @o table(id int IDENTITY,name varchar(64))
declare @p table(id int identity,ownerid int --REFFERENCES object.id
,typeid int -- это то что я знаю, скажем проверить для типов (1,2,3,4,5)
,value varchar(64)
)

insert @o select 'obj1'
insert @o select 'obj2'
insert @o select 'obj3'

insert @p select 1,457,'prop_1_1'
insert @p select 1,458,'prop_1_2'
insert @p select 1,807,'prop_1_3'
insert @p select 1,685,'prop_1_4'
insert @p select 1,686,'prop_1_5'

insert @p select 2,457,'prop_2_1'
insert @p select 2,458,'prop_2_2'
insert @p select 2,807,'prop_2_3'
insert @p select 2,685,'prop_2_4'

insert @p select 3,486,'prop_3_6'
insert @p select 3,487,'prop_3_7'
insert @p select 3,489,'prop_3_8'
insert @p select 3,808,'prop_3_9'

insert @p select 4,458,'prop_4_1'
insert @p select 4,487,'prop_4_2'
insert @p select 4,685,'prop_4_3'
insert @p select 4,808,'prop_4_4'

2) query:
select distinct p.ownerid
from @p p
where 0 in( p.typeid^457, p.typeid^458, p.typeid^807, p.typeid^685 ,p.typeid^686 )
3) result:
ownerid
1
2
4

ЗЫ. Надеюсь, не будете применять ? it's just a joke... :-)
27 ноя 09, 15:16    [7988479]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Ozzy-Osbourne,

А что это за магия - p.typeid^457 ?
27 ноя 09, 15:24    [7988540]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Excel,

читаем БОЛ (ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/f38f0ad4-46d0-40ea-9851-0f928fda5293.htm)
BOL
^ (Bitwise Exclusive OR) (Transact-SQL)
Performs a bitwise exclusive OR operation between two integer values.
The ^ bitwise operator performs a bitwise logical exclusive OR between the two expressions, taking each corresponding bit for both expressions
Результат, равный 0, будет только в том случае, когда два числа, участвующие в операции XOR, равны друг другу. Ведь Вам именно через XOR надо было ? ;-)
27 ноя 09, 15:32    [7988607]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Glory
Member

Откуда:
Сообщений: 104760
Только вроде изначально условие было "как минимум 2 из 5 определенных реквизитов"
А на пракатике почему то автор пишет "HAVING count(*) > 1"
27 ноя 09, 15:33    [7988622]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Glory,
Что не так? Писать >=2 ?
27 ноя 09, 15:38    [7988671]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Ozzy-Osbourne,

Почти :) Ведь если к тертьему объекту будет привязан хоть один интересующий нас параметр, он тоже попадется в выборку, а мне нужно ХОТЬ ДВА :)
27 ноя 09, 15:42    [7988701]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Excel,

да, вы правы :-)
ну, тогда вот - исправленная версия XOR-сувенира:
select ownerid
from(
select p.ownerid
      ,ms=cast(sign(min(p.typeid^457)) as varchar)
         +cast(sign(min(p.typeid^458)) as varchar)
         +cast(sign(min(p.typeid^807)) as varchar)
         +cast(sign(min(p.typeid^685)) as varchar)
         +cast(sign(min(p.typeid^686)) as varchar)
from @p p
group by p.ownerid
)t
where len(ms)-len(replace(ms,'0',''))>=2
27 ноя 09, 15:48    [7988762]     Ответить | Цитировать Сообщить модератору
 Re: Есть хотя-бы одна пара  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
ЖЖЕСТЬ! Прррусь с len %)
Спасибо! И с наступающим!
27 ноя 09, 16:00    [7988844]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить