sql 2005 에서 apply 의 두 가지 응용

apply 는 sql 2005 에 새로 추 가 된 몇 가지 새로운 것 중 하나 입 니 다. 예전 에는 join 과 의 차이 가 크 지 않다 고 생각 했 습 니 다. 최근 에 연 구 를 해 보 니 느낌 이 좋 습 니 다. 각 그룹의 top 값 을 계산 하고 현재 값 을 계산 하 는 것 을 발 견 했 습 니 다. 현재 값 의 이전 값 과 현재 값 의 뒤의 값 은 모두 잘 사용 되 고 모든 방법 에서 rowNumber () 이외에 효율 이 가장 높 은 동시에 쓰기 가 가장 간단 한 것 이다. 다음은 내 가 쓴 두 가지 간단 한 예 이다.
뉴스 클래스 표
CREATE TABLE [dbo].[NewsClass](
	[NewsClassID] [int] IDENTITY(1,1) NOT NULL,  /*    */
	[NewsClassName] [nvarchar](50) NULL,         /*    */
)


insert into newsclass(newsClassName)values('   ')
insert into newsclass(newsClassName)values('   ')
insert into newsclass(newsClassName)values('   ')
insert into newsclass(newsClassName)values('   ')

CREATE TABLE [dbo].[News](
	[NewsID] [int] IDENTITY(1,1) NOT NULL,        /*    */
	[NewsTitle] [nvarchar](50) NULL,                   /*  */
	[NewsClassID] [int] NULL,                             /*  */
	[NewsSubmitTime] [datetime] NULL,             /*  */
	[NewsAuthorEmail] [nvarchar](50) NULL,       /*email*/
	[NewsContent] [int] NULL,                            /*       */
)

INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',1,'2011-07-29 01:01:02.000','1',100)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',1,'2011-07-29 01:01:03.000','1',20)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',1,'2011-07-29 01:01:04.000','1',80)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',2,'2011-07-29 01:01:05.000','1',10)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',2,'2011-07-29 01:01:06.000','1',30)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',2,'2011-07-29 01:01:07.000','1',60)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',3,'2011-07-29 01:01:08.000','1',50)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',3,'2011-07-29 01:01:09.000','1',20)
INSERT INTO News(NewsTitle,NewsClassID,NewsSubmitTime,NewsAuthorEmail,NewsContent)VALUES('      ',4,'2011-07-29 01:01:10.000','1',10)

, .newscontent , top n , int .


, top n

SELECT newsClassid,newsClassName,t.newstitle,t.newscontent
 FROM NewsClass AS nc
CROSS apply
(
	SELECT TOP (2) newsID,newstitle,newscontent FROM News WHERE newsclassid=nc.newsclassid ORDER BY newscontent desc
	) t
결과 보이 기
1	   	      	100
1	   	      	80
2	   	      	60
2	   	      	30
3	   	      	50
3	   	      	20
4	   	      	10
우 리 는 각 유형의 앞의 두 가지 가 모두 나 오 는 것 을 볼 수 있다. 이것 은 성적 과 실적 을 계산 할 때 매우 쓰기 좋다.
2. 현재 값 을 계산 합 니 다. 현재 값 의 이전 항목, 현재 다음 항목 (같은 분류)
SELECT pre.newstitle,pre.newsclassid,pre.newscontent,
       newes.NewsTitle,newes.newsclassid,newes.newscontent,
       bac.newstitle,bac.newsclassid,bac.newscontent
FROM News AS newes
OUTER apply
(
	SELECT TOP (1) NewsTitle,newsclassid,newscontent FROM News AS n 
	WHERE n.NewsClassID=newes.NewsClassID AND n.NewsSubmitTime<newes.NewsSubmitTime
	ORDER BY NewsSubmitTime desc
) AS pre
OUTER apply
(
	SELECT TOP (1) NewsTitle,newsclassid,newscontent FROM News AS n
	WHERE n.NewsClassID=newes.NewsClassID AND n.NewsSubmitTime>newes.NewsSubmitTime
	ORDER BY NewsSubmitTime
) AS bac
결과:
NULL	             NULL	      NULL  	           	     1	       100	       	1	20
      	1	       100	           	     1	         20	       	1	80
      	1	        20	           	     1	         80	   NULL	     NULL	NULL
NULL  	     NULL	     NULL	           	     2	         10	      	2	30
      	2	        10	           	     2	         30	      	2	60
      	2	        30	           	     2	         60	   NULL	     NULL	NULL
NULL	             NULL	     NULL	           	     3	         50	      	3	20
      	3	       50	           	     3	         20	   NULL	     NULL	NULL
NULL	            NULL	     NULL	           	     4	         10	   NULL	     NULL	NULL

좋은 웹페이지 즐겨찾기