0

次のSQL関数があります

ALTER FUNCTION FunctionTEST (@itemID bigint) RETURNS table AS RETURN 
(
  (SELECT top 1 Pic_Path from PictureDetails WHERE PictureDetails.Item_ID = @itemID)
)

この関数は、指定されたパラメーターに対して見つかった場合、一番上の行を返します。パラメータに対してレコードが見つからない場合、この関数は空の行を返します。簡単な作業だと思いますが、SQL関数に慣れていません。以下は、関数を呼び出すために使用している実際のクエリです。

SELECT
NewClientTB.FirstName, NewClientTB.LastName, NewClientTB.EMail, NewClientTB.ContactNo,

ADDetails.AD_ID, ADDetails.AD_EXactAddress, 
ADDetails.AD_PostingTime, ADDetails.AD_Description, ADDetails.AD_Title,

ItemDetails.Item_ID, ItemDetails.Item_Price,

Regions.R_Description,

Cities.C_Name,

GCategories.GC_Description,

SCategories.SC_Description,
PictureDetails.Pic_Path

FROM NewClientTB, ADDetails,ItemDetails, Regions, Cities, GCategories, 
SCategories,     PictureDetails
WHERE FREETEXT (ADDetails.AD_Title, 'selling')
 AND FREETEXT (ADDetails.AD_Description, 'selling')
AND ADDetails.AD_PosterID = NewClientTB.UserID
AND ADDetails.AD_ID = ItemDetails.AD_ID
AND Regions.R_ID = ADDetails.AD_Region
AND Cities.R_ID = ADDetails.AD_Region AND Cities.C_ID = ADDetails.AD_City

AND ItemDetails.Item_GCategory = GCategories.GC_ID
AND ItemDetails.Item_SCategory = SCategories.SC_ID AND ItemDetails.Item_GCategory = 
SCategories.GC_ID
AND PictureDetails.Pic_Path =  (select * from dbo.FunctionTEST(ADDetails.AD_ID))
4

1 に答える 1

2

item は存在するが がない場合に行を返す必要がない場合Pic_Path:

ALTER FUNCTION FunctionTEST (@itemID bigint)
RETURNS table AS RETURN 
(
    SELECT top 1 Pic_Path
    from PictureDetails
    WHERE PictureDetails.Item_ID = @itemID and Pic_Path is not NULL
)

上記の関数は、結果cross applyのないアイテムの行が必要ない場合と、そのような行を結果に含める場合はwith で呼び出す必要があります。Pic_Pathouter apply

SELECT
    nctb.FirstName, nctb.LastName, nctb.EMail, nctb.ContactNo,
    addet.AD_ID, addet.AD_EXactAddress, addet.AD_PostingTime,
    addet.AD_Description, addet.AD_Title,
    idet.Item_ID, idet.Item_Price,
    r.R_Description,
    c.C_Name,
    gcat.GC_Description,
    scat.SC_Description,
    pdet.Pic_Path
FROM
    NewClientTB nctb
    join ADDetails addet on addet.AD_PosterID = nctb.UserID
    join ItemDetails idet on idet.AD_ID = addet.AD_ID
    join Regions r on r.R_ID = addet.AD_Region
    join Cities c on c.R_ID = addet.AD_Region AND c.C_ID = addet.AD_City
    join GCategories gcat on gcat.GC_ID = idet.Item_GCategory
    join SCategories scat on scat.SC_ID = idet.Item_SCategory
    cross apply dbo.FunctionTEST(addet.AD_ID) ft
    join PictureDetails pdet on pdet.Pic_Path = ft.Pic_Path
WHERE FREETEXT (addet.AD_Title, 'selling') AND FREETEXT (addet.AD_Description, 'selling')
于 2013-08-05T22:09:45.353 に答える