2012-12-27 32 views
1

我希望能夠運行報告,該報告將爲我提供用戶計算機,服務器和虛擬機類別中所有項目的列表。從SQL中的特定類別中選擇多行

我想從此報告中排除所有其他類別。

我不太清楚爲了達到這個目的或者把它放在哪裏而寫什麼。

這就是我目前正在使用的。我得到一個錯誤代碼1054:每個雖然類別的未知列...

SELECT DISTINCT 
ASSET.NAME AS ASSET_NAME, 
ASSET_TYPE.NAME AS ASSET_TYPE, 
ASSET_TYPE.ASSET_CATEGORY AS CATEGORY 
FROM ASSET, ASSET_TYPE 
WHERE ASSET_CATEGORY IN (SERVERS, USER_COMPUTER, VIRTUAL_MACHINE) 
ORDER BY ASSET.NAME; 

編輯:我所做的修改建議(從科多),但現在我得到0行返回。還有什麼建議?

+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx) - 用ANSI-** 92 ** SQL標準(** 20年**前!)廢止舊式*逗號分隔的表*樣式列表。請停止使用它 –

+0

感謝您的提示。我現在只做了兩天。我不太清楚自己進了什麼! – ahlkristen

回答

2

您的類別最有可能是字符串,因此需要他們周圍的報價:

SELECT DISTINCT 
ASSET.NAME AS ASSET_NAME, 
ASSET_TYPE.NAME AS ASSET_TYPE, 
ASSET_TYPE.ASSET_CATEGORY AS CATEGORY 
FROM ASSET, ASSET_TYPE 
WHERE ASSET_CATEGORY IN ('SERVERS', 'USER_COMPUTER', 'VIRTUAL_MACHINE') 
ORDER BY ASSET.NAME; 

不帶引號,數據庫認爲這些話是列名和迷糊。

此外,您查詢兩個表,但不指定它們如何與其他任何連接,即缺少連接條件。

最有可能你需要的東西,如:

FROM ASSET, ASSET_TYPE 
WHERE ASSET_CATEGORY IN ('SERVERS', 'USER_COMPUTER', 'VIRTUAL_MACHINE') 
AND ASSET_TYPE.ID = ASSET.ASSET_TYPE_ID 
+1

這是一個很好的選擇......你可能會在那裏構建一個笛卡爾產品,因爲沒有連接條款。 – bluevector

+0

我不明白爲什麼有人沒有加入條件upvoting。 –

+0

這裏是加入條件。 – Codo

1

正如@Codo說,你的類應該是字符串(VARCHAR或nvarchar),並應該像

WHERE ASSET_CATEGORY IN ('SERVERS', 'USER_COMPUTER', 'VIRTUAL_MACHINE') 

還沒有顯示出任何關係兩張桌子。假設關係是;

ASSET.AssetTypeId = ASSET_TYPE.AssetTypeId 

而且avoidingWHERE ASSET, ASSET_TYPEold style table joining,查詢可以用表的別名來完成;

SELECT a.NAME ASSET_NAME, at.NAME ASSET_TYPE, at.ASSET_CATEGORY CATEGORY 
FROM ASSET a JOIN ASSET_TYPE at ON a.AssetTypeId = at.AssetTypeId 
WHERE at.ASSET_CATEGORY IN ('SERVERS', 'USER_COMPUTER', 'VIRTUAL_MACHINE') 
ORDER BY a.NAME; 
+0

你可以跳過'DISTINCT'too(因爲它可能被添加到取消笛卡爾產品) –

+0

@ypercube,這是真的。脫下它。 TNX – Kaf