1)無論photoblob多少次出現在結果集中,它將被讀取(從磁盤到內存的服務器)只有一次,有建於確保這種情況正在發生優化。
2),但它可以被運輸(從服務器到客戶端)多次,有沒有內置在該優化。
3)最好的解決方案是將它作爲一個存儲過程包裝,返回2個記錄集,然後在clinet代碼中進行連接,這種方法與運行需要兩次往返的2個查詢不同。
4)如果你不想這樣做,你可以獲取用戶的所有文章IDS CSV格式,然後你可以很容易地拆分成CSV文件在客戶端代碼單獨字符串。
下面是示例輸出
UserId UserName UserPhoto CSV_ArticleId CSV_ArticleText
------- --------- ---------- ------------------------ ----------------------------
UserId1 UserName1 UserPhoto1 ",ArticleId1,ArticleId2" ",ArticleText1,ArticleText2"
UserId2 UserName2 UserPhoto2 ",ArticleId3" ",ArticleText3"
這裏是你如何能做到這一點。測試數據庫上逐字運行代碼,你可以看到結果
CREATE TABLE Users(UserId int , UserName nvarchar(256), UserPhoto nvarchar(256))
CREATE TABLE Articles (ArticleId int , UserId int , ArticleText nvarchar(256))
INSERT INTO Users(UserId,UserName,UserPhoto)
VALUES (2,'2a','2pa')
INSERT INTO Users(UserId,UserName,UserPhoto)
VALUES (1,'a','pa')
INSERt INTO Articles (ArticleId, UserId, ArticleText)
VALUES (2,2,'text2')
INSERt INTO Articles (ArticleId, UserId, ArticleText)
VALUES (1,2,'text1')
;WITH tArticles AS (SELECT ArticleId, UserId, ArticleText FROM Articles)
SELECT
UserId,
UserName,
UserPhoto,
(SELECT TOP 1 LTRIM(
(SELECT ',' + CONVERT(nvarchar(256),A.ArticleId) FROM Articles A WHERE U.UserId = A.UserId ORDER BY A.ArticleId FOR XML PATH(''))
)) as CSV_ArticleId,
(SELECT TOP 1 LTRIM(
(SELECT ',' + CONVERT(nvarchar(256),A.ArticleText) FROM Articles A WHERE U.UserId = A.UserId ORDER BY A.ArticleId FOR XML PATH(''))
)) as CSV_ArticleText
FROM Users U
你在談論解決方法(這需要多個數據庫查詢),但我是問所使用的數據庫和它的供應商的解決方案。我只是不相信沒有任何內置的解決方案來解決這種重複 – SiberianGuy 2011-04-18 20:29:19