2010-08-05 14 views
0

我想寫一個有3列的視圖:Planet,Moon和Largest。如何在我的視圖中爲新列使用相關子查詢?

該視圖旨在顯示行星,它們的衛星,以及是或否列,以指示它是否是這個星球上最大的月亮。

只使用了一個Basetable,我所引用的列是moonPlanetOrbit(如果bodyType = ='Moon'則不爲null),bodyName(月亮的名稱)和最大的('yes'或'no' )。

這是迄今爲止我嘗試:

CREATE VIEW Moons (Planet, Moon, Largest) 
select moonPlanetOrbited, bodyName, ('Yes' if bodyName = (SELECT top 1 moonMeanRadius from Body where moonPlanetOrbited = bodyName order by moonMeanRadius) as Largest) 

,如果需要,我可以提供任何更多的信息。

感謝, 科迪

回答

0

這裏是它我的MS-SQL語法刺:

SELECT 
    B.moonPlanetOrbited 
    , B.bodyName 
    , CASE 
     WHEN B.bodyName = 
     (SELECT TOP 1 
     iB.bodyName 
     FROM 
     Body AS iB 
     WHERE 
     iB.moonPlanetOrbited = B.bodyName 
     ORDER BY 
     iB.moonMeanRadius DESC 
     ) 
     THEN 'Yes' 
     ELSE 'No' 
    END CASE AS [Largest] 
FROM 
Body AS B 

如果表使用ID作爲主鍵可能更好地對比的ID,而不是名。

+0

嗯,即時通訊仍然沒有得到它的工作。你能向我解釋你的代碼嗎? – Cody 2010-08-05 19:47:51

1

SQL最適合數據集。我的建議是使用SELECT語句和MAX()函數獲取最大衛星集,然後將結果集與整個表結合起來。然後測試月亮是否等於最大以打印「是」或「否」。

這是一個使用MySQL的例子。我創建了一個包含列MoonPlanetOrbited,bodyName,moonMeanRadius的月亮表。下面的SQL選擇一個給定moonPlanetOrbited最大moonMeanRadius:

SELECT moonPlantedOrbited, MAX(moonMeanRadius) as maxMoonRadius 
FROM Moons 
GROUP BY moonPlanetOrbitede 

現在,我們有maxMoonRadius的列表,連接的結果與整個表格,測試設置,如果moonMeanRadius等於maxMoonRadius:

SELECT m1.moonPlanetOrbited, m2.bodyName, 
if(m1.moonMeanRadius = m2.maxMoonRadius, 'Yes', 'No') as Largest 
FROM Moons m1 
JOIN ( 
    SELECT moonPlanetOrbited, MAX(moonMeanRadius) as maxMoonRadius 
    FROM Moons 
    GROUP BY moonPlanetOrbited 
) m2 
ON m1.moonPlanetOrbited = m2.moonPlanetOrbited; 

的IF語法從MySQL 5.5: http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_if

使用下面的SQL測試:

CREATE TABLE Moons( 
    moonPlanetOrbited VARCHAR(255), 
    bodyName VARCHAR(255), 
    moonMeanRadius FLOAT 
); 

INSERT INTO Moons('a', 'b', 1.01); 
INSERT INTO Moons('a', 'c', 1.02); 
INSERT INTO Moons('a', 'd', 1.03); 
INSERT INTO Moons('a', 'e', 1.04); 


+-------------------+----------+---------+ 
| moonPlanetOrbited | bodyName | Largest | 
+-------------------+----------+---------+ 
| a     | b  | No  | 
| a     | c  | No  | 
| a     | d  | No  | 
| a     | e  | Yes  | 
+-------------------+----------+---------+ 
4 rows in set (0.00 sec) 
0

這裏是儘可能地類似的方法,企圖(未經測試),因爲你的想法不是那麼遙遠:

Select 
M.moonPlanetOrbited, 
M.bodyName, 
CASE 
    WHEN M.bodyName = 
    (SELECT top 1 bodyName from Body 
    where moonPlanetOrbited = M.moonPlanetOrbited 
    order by moonMeanRadius DESC) 
Then 'Y' 
Else 'N' 
AS Largest 
FROM body 

你只需要一個表前綴實際做的對關聯根表,並且確保您在CASE語句中將蘋果與蘋果進行比較。

+0

也按半徑排序DESC :-) – LesterDove 2010-08-06 01:34:13