2008-12-16 63 views
0

MSSQL有一個疑問。 數據庫中有兩個表。查詢鏈接兩個表的SQL查詢

表1命名屬性包含 字段PRPT_Id(INT),PRPT_Name(VARCHAR),PRPT_Status(位)

表2命名PropertyImages包含字段PIMG_Id(INT),PIMG_ImageName(VARCHAR),PRPT_Id(INT), PIMG_Status(位)

這兩個表遵循一對多的關係。 這意味着每個Property可以有零個,一個或多個PropertyImages對應它。

所需要的是,以顯示

PRPT_Id,PRPT_Name,ImageCount,FirstImageName(如果有N個圖像(對應於PRPT_Id其中PIMG_Status是真實的。o如果存在的arent任何圖片的所有圖像的計數)的查詢,圖像表中第一個圖像的名稱對應於PIMG_Status爲true的PRPT_Id,如果沒有任何圖像,我們用空格/空白填充)。另一個條件是PRPT_Status應該是true。

編輯注 - 兩個表都有自動增量整數作爲主鍵。 因此,第一個圖像名稱將與MIN(PIMG_Id)的名稱,是不是這樣?

我想對應MIN(PIMG_ID)在結果

+0

什麼是「第一」圖像?帶有最小PIMG_Id的圖像? – 2008-12-16 06:29:55

+0

你只是表中第一個圖像。但它也會有最小的PIMG_Id,因爲PIMG_Id是自動遞增的 – naveen 2008-12-16 06:33:30

回答

2

假設FirstImage指具有最低ID,則此應至少足夠接近測試完成:

SELECT
PRPT_Id,
PRPT_Name,
ISNULL(pi1.ImageName , '')AS FirstImageName,
COUNT(1)AS ImageCount

FROM屬性爲p

LEFT JOIN PropertyImages AS PI
ON p.PRPT_Id = pi.PRPT_Id

LEFT JOIN PropertyImage AS PI1
ON p.PRPT_Id = pi1.PRPT_Id

LEFT JOIN PropertyImgage AS PI2
在頁碼。 PRPT_Id = pi2.PRPT_Id
AND pi1.PIMG_Id> pi2.PIMG_Id

WHERE PRPT_Status = TRUE
AND pi1.PIMG_Status = TRUE
AND pi2.PIMG_ImageName IS NULL

雙LEFT JOIN確保您獲得pi1中的第一個圖像記錄。如果「第一個」規則不同,則相應地調整此連接。

這應該是儘可能有效。它沒有子查詢。

2

的PIMG_ImageName看來,你必須寫嵌套查詢,以顯示你想要什麼。

如果是這種情況(我不是SQL專家),我建議您先從最內層的查詢開始,然後再出去,直到達到最外層(和最後)的查詢。

首先,您必須檢索PIMG並將其按PRPT分組。

SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage 
FROM PropertyImages 
GROUP BY PRPT_Id 

這將檢索確實具有關聯圖像的屬性的PRPT_Id。但是,對於沒有任何關聯圖像的屬性,您不會得到任何結果。

之後,我們將離開加入屬性表與以前的查詢。左連接確保所有屬性都將被檢索,即使它們沒有出現在正確查詢的結果中(即,即使它們沒有任何關聯圖像)。

SELECT Properties.*, PRPT_ImageCount, PRPT_MinImage 
FROM Properties LEFT JOIN (
SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage 
FROM PropertyImages 
GROUP BY PRPT_Id) Temp ON (Properties.PRPT_Id = Temp.PRPT_Id) 

我希望我的SQL沒有錯,這篇文章可以幫助你。

問候,


編輯:

SELECT Properties.*, 
     PRPT_ImageCount, 
     PRPT_MinImage, 
     PIMG_ImageName 
FROM (Properties LEFT JOIN 
     (SELECT PRPT_Id, 
       COUNT(PIMG_Id) AS PRPT_ImageCount, 
       MIN(PIMG_Id) AS PRPT_MinImage 
     FROM PropertyImages 
     GROUP BY PRPT_Id) Temp1 
     ON (Properties.PRPT_Id = Temp1.PRPT_Id)) Temp2 LEFT JOIN 
    PropertyImages ON (PropertyImages.PIMG_Id = Temp2.PRPT_MinImage) 

現在,我真的不確定我的SQL。

0

在圖像表中對應PRPT_Id與PIMG_Status您可能希望在這方面界定「第一」的第一形象真實

的名稱。表格並非真正的排序,除非你自己訂購,否則這個術語首先需要表示「找到第一個」。

假設上述情況屬實(您希望首先發現圖像),那麼這是查詢中唯一真正困難的部分(以及之前絆住我的事物的類型)。其餘的部分看起來相當簡單。如果我明天可以找到時間,我會盡量爲你安排一些東西......但似乎有人可以在那之前提供答案。