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

Откуда: Пиндырдышханда
Сообщений: 948
with A (id, f,I,O, BD) as (
select 1,'Иванов','Иван','Иванович', null union 
select 2,'Иванов','Иван','Иванович', null union 
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime)
)
Select ( select max(id )
from A [a2]
where a1.F= a2.F and a1.I=a2.I and a1.O = a2.O and a1.BD = a2.BD
),*
From A [a1]


получается
автор
NULL 1 Иванов Иван Иванович NULL
NULL 2 Иванов Иван Иванович NULL
3 3 Иванов Иван Иванович 1956-09-20 13:46:09.223

как сделать
автор
2 1 Иванов Иван Иванович NULL
2 2 Иванов Иван Иванович NULL
3 3 Иванов Иван Иванович 1956-09-20 13:46:09.223

???
---------------------------------------------------------
SET @@verSION = 'Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 6.0 (Build 6002: Service Pack 2) '
20 сен 12, 14:35    [13196334]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Andrew1411
Member

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

ith A (id, f,I,O, BD) as (
select 1,'Иванов','Иван','Иванович', null union
select 2,'Иванов','Иван','Иванович', null union
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime)
)

select max(id) over(partition by F,I,O,BD), *
From A [a1]
20 сен 12, 14:40    [13196389]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Andrew1411
Member

Откуда: Москва
Сообщений: 401
Сори, вот весь скрипт
with A (id, f,I,O, BD) as (
select 1,'Иванов','Иван','Иванович', null union 
select 2,'Иванов','Иван','Иванович', null union 
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime)
)

select max(id) over(partition by F,I,O,BD), *
 From A [a1]
20 сен 12, 14:41    [13196400]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Andrew1411
Member

Откуда: Москва
Сообщений: 401
Если нужен именно коррелированный запрос (вдруг?)
то можно сделать так
with A (id, f,I,O, BD) as (
select 1,'Иванов','Иван','Иванович', null union 
select 2,'Иванов','Иван','Иванович', null union 
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime)
)
Select ( select max(id )
from A [a2]
where exists(
	select a1.F, a1.I, a1.O, a1.BD
	intersect
	select a2.F, a2.I, a2.O, a2.BD
 )
),*
From A [a1]
20 сен 12, 14:47    [13196458]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
а если немного изменить условие :

with A (id, f,I,O, BD, seria) as (
select 1,'Иванов','Иван','Иванович', null, '123456789' union 
select 2,'Иванов','Иван','Иванович', null, null union 
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime), null union
select 4,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime), '987654322'
)

Select ( select top 1 id 
from A [a2]
where a1.F= a2.F and a1.I=a2.I and a1.O = a2.O and a1.BD = a2.BD
order by seria desc
),*
From A [a1]

выбрать только айдишник с серией паспорта ?
20 сен 12, 15:04    [13196667]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
(с любой "серией паспорта")
20 сен 12, 15:06    [13196691]     Ответить | Цитировать Сообщить модератору
 Re: простой вопрос про корреляцию с null'ом  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
а.. всё
with A (id, f,I,O, BD, seria) as (
select 1,'Иванов','Иван','Иванович', null, '123456789' union 
select 2,'Иванов','Иван','Иванович', null, null union 
select 3,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime), null union
select 4,'Иванов','Иван','Иванович', cast('1956-09-20 13:46:09.223' as datetime), '987654322'
)

Select ( select top 1 id 
from A [a2]
where exists(
	select a1.F, a1.I, a1.O, a1.BD
	intersect
	select a2.F, a2.I, a2.O, a2.BD
 )
order by a2.seria desc
),*
From A [a1]
20 сен 12, 15:12    [13196757]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить