PDA

View Full Version : common table expression



araz_pashazadeh
یک شنبه 23 مهر 1391, 10:30 صبح
با عرض سلام و خسته نباشید خدمت شما.
من در پرس و جوی که می خوام بنویسم از common table expression استفاده کردم می خواستم بدونم امکان داره common table expression را بصورت تودرتو تعریف کرد؟
اگه شدنی چطوری؟
من خیلی جستجو کردم ولی به نتیجه نرسیدم.
اینم یه نمونه کد که خودم نوشتم ولی 3 تا خطا داره نتونستم درست کنم.


WITH

y AS (

WITH x AS (

SELECT 1 as n

)

SELECT * FROM x

)
SELECT

* FROM Y


ممنون میشم من را راهنمایی کنین.

Reza_Yarahmadi
یک شنبه 23 مهر 1391, 14:04 عصر
منظور شما از تودرتو چیه؟
خروجی مورد انتظار کدی که نوشتید چیه؟
یکی از حالتهای متداول استفاده از CTE بصورت زیر:
With Y as(Select * From Tbl_1 ...)
, X as (Select * From Y ...)
Select * From X INNER JOIN Y ON ...

araz_pashazadeh
دوشنبه 24 مهر 1391, 09:17 صبح
دوست عزیز من پرس و جوی را که نوشتم کامل در اختیار شما قرار می دهم:

CREATE
TABLE #T([RowNumber] [numeric](18, 0)IDENTITY(1,1)NOTNULL,

[BuyerNameFamily] [nvarchar]
(64)NULL,

[Date] [nvarchar]
(16)NULL,

[Description] [nvarchar]
(MAX),

[Price] [numeric]
(18, 0)NULL,

[Statuse] [nvarchar]
(16)NULL);



WITH



CTE(BuyerNameFamily,Date,Description, Price, Statuse)


AS (SELECT BuyerNameFamily,Date,Description, Price, Statuse


FROM (SELECT TBLBuyer.BuyerNameFamily, TBLAccountBuyer.DateRegister ASDate,


' 'ASDescription,


CASEWHEN CreditorOrDebtor = 0 THEN-TBLAccountBuyer.PreviousRemainder WHEN CreditorOrDebtor


= 1 THEN TBLAccountBuyer.PreviousRemainder ENDAS Price,


' 'AS Statuse


FROM TBLAccountBuyer INNERJOIN

TBLBuyer
ON TBLAccountBuyer.BuyerId = TBLBuyer.BuyerID


WHERE (TBLAccountBuyer.BuyerId ='1')


UNIONALL


SELECT TBLBuyer.BuyerNameFamily, TBLInvoiceSale.SaleDate ASDate,

TBLInvoiceSale
.Description,


SUM(TBLInvoiceDescriptionSale.SalePrice * TBLInvoiceDescriptionSale.Count)


-ISNULL(TBLInvoiceSale.Discount, 0)+ISNULL(TBLInvoiceSale.Freight, 0)AS Price,


' 'AS Statuse


FROM TBLInvoiceSale INNERJOIN

TBLInvoiceDescriptionSale
ON

TBLInvoiceSale
.InvoiceID = TBLInvoiceDescriptionSale.InvoiceId INNERJOIN

TBLBuyer
ON TBLInvoiceSale.BuyerId = TBLBuyer.BuyerID


WHERE (TBLInvoiceSale.BuyerId ='1')AND(TBLInvoiceSale.InvoicePre = 0)


GROUPBY TBLInvoiceSale.Discount, TBLInvoiceSale.Freight, TBLBuyer.BuyerNameFamily,

TBLInvoiceSale
.SaleDate, TBLInvoiceSale.Description


UNIONALL


SELECT BuyerNameFamily,Date,Description,-Payment AS Price,' 'AS Statuse


FROM ViewReceipt


WHERE (BuyerID ='1')


UNIONALL


SELECT TBLBuyer.BuyerNameFamily, TBLReceiveDocument.Maturity, TBLReceiveDocument.Description,-TBLReceiveDocument.Payment AS Payment,


CASEWHENStatus= 0 THEN' 'WHENStatus= 1 THEN''WHENStatus= 2 THEN' 'ENDAS Statuse


FROM TBLReceiveDocument INNERJOIN

TBLBuyer
ON TBLReceiveDocument.BuyerId = TBLBuyer.BuyerID


WHERE (TBLReceiveDocument.BuyerId ='1'))AS Result)


INSERT #T(BuyerNameFamily,Date,Description, Price, Statuse)


SELECT BuyerNameFamily,Date,Description, Price, Statuse


FROM CTE


ORDERBYDate




SELECT RowNumber,BuyerNameFamily,Date,Description,ABS( Price)AS Price,ABS((SELECTSUM(Price)AS Totale


FROM #T AS CTETemp


WHERE (CTETemp.RowNumber <= #T.RowNumber)AND Statuse <>''))AS Totale, Statuse


FROM #T


DROPTABLE #T

من این کار را برای بهینه کردن پرس وجو می خوام انجام بدم.
اگه شما پیشنهادی در این مورد دارین ممنون میشم بگین.

tooraj_azizi_1035
جمعه 28 مهر 1391, 12:44 عصر
... و بیشتر:
http://www.farsimsdn.somee.com/default.aspx?id=48

s3unit
دوشنبه 01 آبان 1391, 09:32 صبح
سلام
شما میتونید از چندتا as که با cama از هم دیگه جدا میشند استفاده کنید