Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
 CREATE TABLE #A(aID int IDENTITY (1, 1) NOT NULL, aName varchar(10)) 
  INSERT #A(aName) values('Name1') 
  INSERT #A(aName) values('Name2') 
  INSERT #A(aName) values('Name3') 
  CREATE TABLE #B(bID int IDENTITY (1, 1) NOT NULL, aID int NOT NULL, DateFrom datetime) 
  INSERT #B(aID,DateFrom) values(1,'2007-01-01') 
  INSERT #B(aID,DateFrom) values(1,'2007-03-12') 
  INSERT #B(aID,DateFrom) values(2,'2007-02-01') 
  INSERT #B(aID,DateFrom) values(2,'2008-06-03') 
  INSERT #B(aID,DateFrom) values(2,'2008-08-15') 
  INSERT #B(aID,DateFrom) values(3,'2007-02-12') 
  INSERT #B(aID,DateFrom) values(3,'2007-11-10') 
  INSERT #B(aID,DateFrom) values(3,'2007-11-10')
нужно получить
aNameDateFrom
Name12007-03-12
Name22008-08-15
Name32007-11-10
24 дек 09, 12:13    [8112306]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
select
    a.aName
    , (
        select top 1
            b.DateFrom
        from    #b  b
        where
            a.aID = b.aID
        order by b.DateFrom  desc          
    )
from    #a  a


Сообщение было отредактировано: 24 дек 09, 12:16
24 дек 09, 12:16    [8112325]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
select A.aName
      ,B.DateFrom
  from (select aID
              ,max(DateFrom) as DateFrom
          from #B
         group by aID
        ) as B
  join #A as A on A.aID = B.aID

aName      DateFrom
---------- -----------------------
Name1      2007-03-12 00:00:00.000
Name2      2008-08-15 00:00:00.000
Name3      2007-11-10 00:00:00.000

(3 row(s) affected)
24 дек 09, 12:18    [8112342]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
Гавриленко Сергей Алексеевич,

извиняюсь, я не совсем точно задал вопрос, из таблицы B кроме даты, нужно вытащить несколько полей.
24 дек 09, 12:30    [8112421]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
Паганель,

спасибо
24 дек 09, 12:32    [8112438]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Пока вы дату в пределах aID не сделаете уникальной, ничего путного не получится.
24 дек 09, 12:34    [8112451]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
tregish
Гавриленко Сергей Алексеевич,

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


Учите коррелированные запросы

select   a.*, b.*
FROM 
#A a inner join #B b
ON 
a.aID=B.aID AND b.date=(select MAX(x.DateFrom)  from  #B as x  where a.aID = x.aID)

или модный нонче CROSS APPLY...
24 дек 09, 12:35    [8112460]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
Паганель,

не подошло. Еще нужно bId вытащить.
24 дек 09, 12:36    [8112474]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
tregish
Паганель,

не подошло. Еще нужно bId вытащить.

И каккой bId надо вытаскивать для записей

  INSERT #B(aID,DateFrom) values(3,'2007-11-10') 
  INSERT #B(aID,DateFrom) values(3,'2007-11-10')
?
24 дек 09, 12:38    [8112484]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
tregish
из таблицы B кроме даты, нужно вытащить несколько полей.
select top 1 with ties
       A.aName
      ,B.*
  from #B as B
  join #A as A on A.aID = B.aID
 order by row_number() over(partition by A.aID order by B.DateFrom desc)
24 дек 09, 12:38    [8112485]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
Гавриленко Сергей Алексеевич
tregish
Паганель,

не подошло. Еще нужно bId вытащить.

И каккой bId надо вытаскивать для записей

  INSERT #B(aID,DateFrom) values(3,'2007-11-10') 
  INSERT #B(aID,DateFrom) values(3,'2007-11-10')
?


Эту проблему тредстартер ишо не решил.
24 дек 09, 12:41    [8112512]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
aleks2,
Ваш вариант для Name3 две записи выводит


Уточню результат
a.aNameb.bIDb.DateFrom
Name122007-03-12
Name252008-08-15
Name382007-11-10



Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
24 дек 09, 12:49    [8112591]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
tregish
aleks2,
Ваш вариант для Name3 две записи выводит


Уточню результат
a.aNameb.bIDb.DateFrom
Name122007-03-12
Name252008-08-15
Name382007-11-10



Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
Какие данные, такой и результат. Или мы должны угадать, какую запись надо выводить?
24 дек 09, 12:50    [8112605]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
Гавриленко Сергей Алексеевич ,

CREATE TABLE #B(bID int IDENTITY (1, 1) NOT NULL, aID int NOT NULL, DateFrom datetime)

поле bID - автоинкримент, заполнится порядковыми значениями.

так наверное понятнее:
 CREATE TABLE #B(bID int NOT NULL, aID int NOT NULL, DateFrom datetime) 
  INSERT #B(bID,aID,DateFrom) values(1,1,'2007-01-01') 
  INSERT #B(bID,aID,DateFrom) values(2,1,'2007-03-12') 
  INSERT #B(bID,aID,DateFrom) values(3,2,'2007-02-01') 
  INSERT #B(bID,aID,DateFrom) values(4,2,'2008-06-03') 
  INSERT #B(bID,aID,DateFrom) values(5,2,'2008-08-15') 
  INSERT #B(bID,aID,DateFrom) values(6,3,'2007-02-12') 
  INSERT #B(bID,aID,DateFrom) values(7,3,'2007-11-10') 
  INSERT #B(bID,aID,DateFrom) values(8,3,'2007-11-10')

a.aNameb.bIDb.DateFrom
Name122007-03-12
Name252008-08-15
Name382007-11-10
24 дек 09, 13:10    [8112777]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Да хоть Дед Мороз пусть это поле заполняет. Почему 8, а не 7?
24 дек 09, 13:12    [8112783]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
Гавриленко Сергей Алексеевич
Да хоть Дед Мороз пусть это поле заполняет. Почему 8, а не 7?


Дед Мороз.

-- ВСЕ неуникальные по дате
select   a.*, b.*
FROM 
#A a inner join #B b
ON 
a.aID=B.aID AND b.DateFrom=(select MAX(x.DateFrom)  from  #B as x  where a.aID = x.aID)

-- ОДНА ИЗ неуникальных по дате
select   a.*, b.*
FROM 
#A a inner join #B b
ON 
B.bID =(select TOP 1 bID from  #B as x  where a.aID = x.aID ORDER BY x.DateFrom DESC, bID DESC)
24 дек 09, 13:14    [8112805]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
tregish
Guest
Гавриленко Сергей Алексеевич,

вот тут уже не важно. Любое из них.
24 дек 09, 13:14    [8112810]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
До чего тредстартер привиредливый пошел...
24 дек 09, 13:15    [8112825]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Local Hoster
Member

Откуда: default city
Сообщений: 90
USE [tempdb]
GO

IF EXISTS (SELECT * FROM [tempdb].[sys].[tables] WHERE [object_id] = OBJECT_ID(N'[tempdb]..[#A]'))
BEGIN
	DROP TABLE [#A]
END

CREATE TABLE [#A]
(
	[aId] int IDENTITY (1, 1) NOT NULL
	, [aName] varchar(10)
	, CONSTRAINT [PK_#A] PRIMARY KEY ([aId])
)

IF EXISTS (SELECT * FROM [tempdb].[sys].[tables] WHERE [object_id] = OBJECT_ID(N'[tempdb]..[#B]'))
BEGIN
	DROP TABLE [#B]
END

CREATE TABLE [#B]
(
	[bId] int IDENTITY (1, 1) NOT NULL
	, [aId] int NOT NULL
	, [DateFrom] datetime
	, CONSTRAINT [PK_#B] PRIMARY KEY ([bId])
)

INSERT INTO [#A] (aName)
SELECT N'Name1' AS [aName] UNION
SELECT N'Name2' AS [aName] UNION
SELECT N'Name3' AS [aName]

INSERT INTO [#B] ([aId], [DateFrom])
SELECT 1 AS [aId], CONVERT(datetime, '20070101', 112) AS [DateFrom] UNION ALL
SELECT 1 AS [aId], CONVERT(datetime, '20070312', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20070201', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20080603', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20080815', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20070212', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20071110', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20071110', 112) AS [DateFrom]

SELECT
	#A.aName
	, MAX(#B.bId) AS bId -- или MIN(#B.bId) по вкусу
	, C.DateFrom
FROM
	(
		SELECT
			aId
			, MAX(DateFrom) AS DateFrom
		FROM
			#B
		GROUP BY
		aId
	) AS C
	LEFT OUTER JOIN #A ON #A.aId = C.aId
	LEFT OUTER JOIN #B ON #B.aId = c.aId AND #B.DateFrom = C.DateFrom
GROUP BY
	#A.aName
	, C.DateFrom

GO
24 дек 09, 14:40    [8113512]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
tregish
не важно. Любое из них.
Уточню результат
a.aName b.bID b.DateFrom
Name1 2 2007-03-12
Name2 5 2008-08-15
Name3 8 2007-11-10
так ?
declare @a table(aid int identity (1, 1) not null, aname varchar(10)) 
  insert @a(aname) values('name1') 
  insert @a(aname) values('name2') 
  insert @a(aname) values('name3') 
declare @b table(bid int identity (1, 1) not null, aid int not null, datefrom datetime) 
  insert @b(aid,datefrom) values(1,'2007-01-01') 
  insert @b(aid,datefrom) values(1,'2007-03-12') 
  insert @b(aid,datefrom) values(2,'2007-02-01') 
  insert @b(aid,datefrom) values(2,'2008-06-03') 
  insert @b(aid,datefrom) values(2,'2008-08-15') 
  insert @b(aid,datefrom) values(3,'2007-02-12') 
  insert @b(aid,datefrom) values(3,'2007-11-10') 
  insert @b(aid,datefrom) values(3,'2007-11-10')
-- some more data:
  insert @a(aname) values('addi_row') 
  insert @b(aid,datefrom) values(4,'2009-12-24') 
  insert @b(aid,datefrom) values(4,'2009-12-24') 
  insert @b(aid,datefrom) values(4,'2009-12-24')

--select * from @a select * from @b
select a.aname,bid=cast(right(max(s),10)as int),dtFrom=left(max(s),10)
from @a a join @b b on a.aid=b.aid
cross apply(select s=convert(char(10),b.datefrom,121)+cast(b.bid as char(10)))x
group by a.aid,a.aname
anamebiddtFrom
name122007-03-12
name252008-08-15
name382007-11-10
addi_row92009-12-24
24 дек 09, 19:25    [8115650]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
Ozzy-Osbourne
cross apply(select s=convert(char(10),b.datefrom,121)+cast(b.bid as char(10)))x

а ничо шо у тредстартера
tregish

Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

?

Я уж помолчу про судьбу индексов...
24 дек 09, 19:34    [8115669]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Ozzy-Osbourne
Member

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

oops! не заметил, пардон. Тогда так:
select aname,bid=cast(right(s,10)as int),dtFrom=left(s,10)
from(
select a.aname
  ,s=max(convert(char(10),b.datefrom,121)+cast(b.bid as char(10)))
from @a a join @b b on a.aid=b.aid
group by a.aid,a.aname
)x

PS. ТС не привел ничего, кроме таблиц-времянок с тремя строчками. Судьба индексов станет ясной, когда будет скрипт, наполняющий их тысячами строк.
Но на таком, например, скрипте:
if object_id('tmp_a')>0 drop table tmp_a
if object_id('tmp_b')>0 drop table tmp_b
create table tmp_a (aid int identity (1, 1) not null, aname varchar(10)) 
create index tmpidx_a on tmp_a(aid) include(aname)
create table tmp_b (bid int identity (1, 1) not null, aid int not null, datefrom datetime) 
create clustered index tmpidx_b on tmp_b(aid)

declare @a_lim int, @b_lim int, @i int, @j int
select @a_lim=100, @b_lim=50, @i=1

while @i<=@a_lim begin
  insert tmp_a(aName) select 'name_'+right(cast(100000+@i as char(6)),5)
  set @j=1
  while @j<=@b_lim begin
    insert tmp_b(aid,datefrom) select @i,dateadd(dd,rand()*(@b_lim/2),'20091224')
    set @j=@j+1
  end
  set @i=@i+1
end

;set statistics profile on;
select aname,bid=cast(right(s,10)as int),dtFrom=left(s,10)
from(
select a.aname
  ,s=max(convert(char(10),b.datefrom,121)+cast(b.bid as char(10)))

from tmp_a a join tmp_b b on a.aid=b.aid and b.aid>0
group by a.aid,a.aname
)x
;set statistics profile off;
видим:
StmtTextPhysicalOpEstimateCPU
select aname,bid=cast(right(s,10)as int),dtFrom=left(s,10) from( select a.aname ,s=max(convert(char(10),b.datefrom,121)+cast(b.bid as char(10))) from tmp_a a join tmp_b b on a.aid=b.aid and b.aid>0 group by a.aid,a.aname )xNULLNULL
|--Compute Scalar(DEFINE:([Expr1007]=CONVERT(int,right([Expr1006],(10)),0), [Expr1008]=substring([Expr1006],(1),(10))))Compute Scalar0,0003949939
|--Stream Aggregate(GROUP BY:([a].[aname], [a].[aid]) DEFINE:([Expr1006]=MAX([partialagg1010])))Stream Aggregate0,00011
|--Sort(ORDER BY:([a].[aname] ASC, [a].[aid] ASC))Sort0,001136487
|--Merge Join(Inner Join, MERGE:([b].[aid])=([a].[aid]), RESIDUAL:([Computer].[dbo].[tmp_a].[aid] as [a].[aid]=[Computer].[dbo].[tmp_b].[aid] as [b].[aid]))Merge Join0,00624
|--Stream Aggregate(GROUP BY:([b].[aid]) DEFINE:([partialagg1010]=MAX([Expr1009])))Stream Aggregate0,0031
| |--Compute Scalar(DEFINE:([Expr1009]=CONVERT(char(10),[Computer].[dbo].[tmp_b].[datefrom] as [b].[datefrom],121)+CONVERT(char(10),[Computer].[dbo].[tmp_b].[bid] as [b].[bid],0)))Compute Scalar0,0005
| |--Clustered Index Seek(OBJECT:([Computer].[dbo].[tmp_b].[tmpidx_b] AS [b]), SEEK:([b].[aid] > (0)) ORDERED FORWARD)Clustered Index Seek0,005657
|--Index Seek(OBJECT:([Computer].[dbo].[tmp_a].[tmpidx_a] AS [a]), SEEK:([a].[aid] > (0)) ORDERED FORWARD)Index Seek0,000267
24 дек 09, 20:20    [8115760]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Local Hoster
Member

Откуда: default city
Сообщений: 90
С учетом этого
tregish

Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
, предлагаю слегка измененный вариант своего предыдущего предложения:

USE [tempdb]
GO

IF EXISTS (SELECT * FROM [tempdb]..[sysobjects] WHERE [id] = OBJECT_ID(N'[tempdb]..[#A]') AND [type] = N'U')
BEGIN
	DROP TABLE [#A]
END

CREATE TABLE [#A]
(
	[aId] int IDENTITY (1, 1) NOT NULL
	, [aName] varchar(10)
	, CONSTRAINT [PK_#A] PRIMARY KEY ([aId])
)

IF EXISTS (SELECT * FROM [tempdb]..[sysobjects] WHERE [id] = OBJECT_ID(N'[tempdb]..[#B]') AND [type] = N'U')
BEGIN
	DROP TABLE [#B]
END

CREATE TABLE [#B]
(
	[bId] int IDENTITY (1, 1) NOT NULL
	, [aId] int NOT NULL
	, [DateFrom] datetime
	, CONSTRAINT [PK_#B] PRIMARY KEY ([bId])
)

INSERT INTO [#A] (aName)
SELECT N'Name1' AS [aName] UNION
SELECT N'Name2' AS [aName] UNION
SELECT N'Name3' AS [aName]

INSERT INTO [#B] ([aId], [DateFrom])
SELECT 1 AS [aId], CONVERT(datetime, '20070101', 112) AS [DateFrom] UNION ALL
SELECT 1 AS [aId], CONVERT(datetime, '20070312', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20070201', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20080603', 112) AS [DateFrom] UNION ALL
SELECT 2 AS [aId], CONVERT(datetime, '20080815', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20070212', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20071110', 112) AS [DateFrom] UNION ALL
SELECT 3 AS [aId], CONVERT(datetime, '20071110', 112) AS [DateFrom]

SELECT
	#A.aName
	, MAX(#B.bId) AS bId -- или MIN(#B.bId) по вкусу
	, C.DateFrom
FROM
	(
		SELECT
			aId
			, MAX(DateFrom) AS DateFrom
		FROM
			#B
		GROUP BY
		aId
	) AS C
	LEFT OUTER JOIN #A ON #A.aId = C.aId
	LEFT OUTER JOIN #B ON #B.aId = c.aId AND #B.DateFrom = C.DateFrom
GROUP BY
	#A.aName
	, C.DateFrom
ORDER BY
	#A.aName
GO


Результат в случае, если выбран MAX(#B.bId):

aName bId DateFrom
Name1 2 2007-03-12 00:00:00.000
Name2 5 2008-08-15 00:00:00.000
Name3 8 2007-11-10 00:00:00.000
24 дек 09, 23:52    [8116159]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
aleks2
Guest
Ozzy-Osbourne
[/src]select aname,bid=cast(right(s,10)as int),dtFrom=left(s,10)
from(
select a.aname
,s=max(convert(char(10),b.datefrom,121)+cast(b.bid as char(10)))

from tmp_a a join tmp_b b on a.aid=b.aid and b.aid>0
group by a.aid,a.aname
)x
[/src]


Local Hoster
SELECT
#A.aName
, MAX(#B.bId) AS bId -- или MIN(#B.bId) по вкусу
, C.DateFrom
FROM
(
SELECT
aId
, MAX(DateFrom) AS DateFrom
FROM
#B
GROUP BY
aId
) AS C
LEFT OUTER JOIN #A ON #A.aId = C.aId
LEFT OUTER JOIN #B ON #B.aId = c.aId AND #B.DateFrom = C.DateFrom
GROUP BY
#A.aName
, C.DateFrom
ORDER BY
#A.aName
[/src]


Может объявим конкурс на самый "идиотский" способ выполнения операции SELECT?
А то я пребываю в непонимании: чем коррелированный запрос хуже этих монстров?

select   a.*, b.*
FROM 
#A a inner join #B b
ON 
B.bID =(select TOP 1 bID from #B x where a.aID = x.aID ORDER BY x.DateFrom DESC, bID DESC)
25 дек 09, 07:38    [8116474]     Ответить | Цитировать Сообщить модератору
 Re: для каждой записи из A выбрать записи с макс. датой из B  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
aleks2
пребываю в непонимании: чем коррелированный запрос хуже этих монстров?
в чём вопрос ?
Если о длине запросов, то мой = 221 байт, ваш = 136 байт. Дельта в 85 байт - причина для споров ?
Если речь о производительности, то на представленном выше скрипте при изменении @a_lim до 3000 и удалении индексов результаты следующие:
1) мой запрос:
(3000 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tmp_b'. Scan count 1, logical reads 488, physical reads 0, read-ahead reads 488, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tmp_a'. Scan count 1, logical reads 11, physical reads 11, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 579 ms

2) ваш запрос:
(3000 row(s) affected)
Table 'Worktable'. Scan count 3000, logical reads 380035, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tmp_b'. Scan count 2, logical reads 976, physical reads 0, read-ahead reads 488, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tmp_a'. Scan count 1, logical reads 11, physical reads 11, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 1561 ms

ЗЫ. Без удаления индексов отличий в результате практически нет (данные копеечные).
25 дек 09, 09:36    [8116780]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить