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

Откуда:
Сообщений: 1197
Привет.
В таблице есть такие столбцы и строки

ObjectID    UserId
10             Petrov
1000          Petrov
1000          Petrov_1000
20             Abramov
2000          Abramov
2000          Abramov_2000

в таблице так хранится отношение объектов.
Как мне получить только строку типа
 1000          Petrov
и
2000          Abramov
?
28 ноя 11, 11:05    [11669207]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
relief,
WHERE, AND, OR
28 ноя 11, 11:07    [11669224]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
kDnZP
relief,
WHERE, AND, OR


а как именно?
28 ноя 11, 11:08    [11669236]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
SELECT DISTINCT object_id,  REPLACE(userID, '-'+CONVERT(varchar, objectID), '') as userID FROM tbl_name
WHERE objectID >= 1000 
28 ноя 11, 11:10    [11669254]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
fabulaspb
SELECT DISTINCT object_id,  REPLACE(userID, '-'+CONVERT(varchar, objectID), '') as userID FROM tbl_name
WHERE objectID >= 1000 


вы смеетесь? :)
28 ноя 11, 11:11    [11669268]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT TOP(1) WITH TIES *
FROM [таблица]
ORDER BY ROW_NUMBER()OVER(PARTITION BY LEFT(UserId, CHARINDEX('_',UserId+'_')-1) ORDER BY UserId,ObjectID DESC);
28 ноя 11, 11:18    [11669322]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
relief,

Вы хотели получить строки:

 1000          Petrov
 2000          Abramov

Что я делаю не так в запросе? Извлекаю строки где objectID >= 1000, затем удаляю вхождения подстроки '_' + objectID и устраняю дубликаты.
28 ноя 11, 11:18    [11669326]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief,

SELECT ObjectID, UserId
FROM tbl_name
WHERE objectID >= 1000 AND UserId NOT LIKE '%'+CAST(ObjectID AS VARCHAR)
28 ноя 11, 11:20    [11669342]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Sekoka
Member

Откуда:
Сообщений: 73
SELECT ObjectID
      ,UserId
  FROM table
  where RIGHT(UserId,LEN(CAST(ObjectID as nvarchar)))<>CAST(ObjectID as nvarchar) AND LEN(CAST(ObjectID as nvarchar))>2
28 ноя 11, 11:21    [11669357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
2 all

я смотрю все делают завязку на значения.
этого делать нельзя, т.к. оба поля nvarchar и там могут быть любые значения
28 ноя 11, 11:35    [11669462]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief
2 all

я смотрю все делают завязку на значения.
этого делать нельзя, т.к. оба поля nvarchar и там могут быть любые значения


Ну так может опишете тогда более конкретно задачу чтобы не приходилось гадать?
28 ноя 11, 11:38    [11669481]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
grigrim
relief
2 all

я смотрю все делают завязку на значения.
этого делать нельзя, т.к. оба поля nvarchar и там могут быть любые значения


Ну так может опишете тогда более конкретно задачу чтобы не приходилось гадать?


смотрите эта таблица описывает дерево объектов. Структуру - просьба не обсуждать.

ObjectID    UserId
Р10             Petrov              - описывает объект родительского уровня
П1000          Petrov              - описывает к какому родителю относится предок с идентификатором П1000          
П1000          Petrov_1000      - описывает предка с идентификатором П1000       
П1001          Petrov              
П1001          Petrov_1001
20             Abramov
2000          Abramov
2000          Abramov_2000
28 ноя 11, 11:47    [11669537]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief,

ну хорошо, а если в запросе избавиться от нечисловых символов в поле ObjectID и дальше через LIKE, как я писал ранее?
28 ноя 11, 11:54    [11669585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Sekoka
Member

Откуда:
Сообщений: 73
SELECT [ObjectID]
      ,[UserId]
  FROM [_1]
  where [UserId] IN(
SELECT RIGHT([UserId],len([UserId])-1)
  FROM [_1]
  where LEFT([UserId],1)=' ')
28 ноя 11, 11:56    [11669609]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
grigrim
relief,

ну хорошо, а если в запросе избавиться от нечисловых символов в поле ObjectID и дальше через LIKE, как я писал ранее?


данные я менять не могу
28 ноя 11, 11:58    [11669631]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief
данные я менять не могу
я и не предлагаю их менять. Поэтому и написал, что предлагаю избавиться от нечисловых символов именно в запросе.
Например REPLACE(REPLACE(ObjectID, 'Р', ''), 'П', '').
28 ноя 11, 12:01    [11669656]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
grigrim
relief
данные я менять не могу
я и не предлагаю их менять. Поэтому и написал, что предлагаю избавиться от нечисловых символов именно в запросе.
Например REPLACE(REPLACE(ObjectID, 'Р', ''), 'П', '').


проблема в том, что я не знаю всех вариантов
28 ноя 11, 12:02    [11669661]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief
проблема в том, что я не знаю всех вариантов

поиск всё ещё работает
28 ноя 11, 12:09    [11669740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
relief
Member

Откуда:
Сообщений: 1197
grigrim
relief
проблема в том, что я не знаю всех вариантов

поиск всё ещё работает


вы не понимаете главного в тех примерах.
у меня нет условия, что ObjectID родителя всегда меньше. Там вообще может быть строка из букв (условно говоря)

я вот написал но не пойму, почему у меня cmo2.object_id возвращается null? (мне надо возвращать пару object_id предка - object_id родителя

select cmi.object_id, (select cmo2.object_id from  Objects as cmo2 where cmi.user_id = cmo2.user_id and cmi.object_id not in 
														(select distinct(cmo3.object_id) from Objects as cmo3 where cmo3.user_id = cmi.user_id))
 from  
	(select cm.object_id , cm.user_id	
	from Objects as cm  
	where (select count(distinct(cm2.object_id)) from Objects as cm2 where cm2.user_id = cm.user_id) > 1) as cmi
28 ноя 11, 12:24    [11669863]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
relief,

вот что-то вроде получилось:

WITH Hierarchy AS (
	SELECT ObjectID, UserID
	,	MAX(rk1) OVER(PARTITION BY UserID) AS ObjectID_cnt
	,	MAX(rk2) OVER(PARTITION BY ObjectID) AS UserID_cnt
	FROM
	(	SELECT ObjectID, UserID
		,	DENSE_RANK() OVER(PARTITION BY UserID ORDER BY ObjectID) AS rk1
		,	DENSE_RANK() OVER(PARTITION BY ObjectID ORDER BY UserID) AS rk2
		FROM tbl_name
	) T
)

SELECT t1.ObjectID, h.UserID
FROM Hierarchy h
INNER JOIN tbl_name t1 ON h.UserID = t1.UserID AND h.ObjectID <> t1.ObjectID
WHERE ObjectID_cnt = UserID_cnt
28 ноя 11, 13:03    [11670234]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить