从SQL中的特定类别中选择多行

从SQL中的特定类别中选择多行,sql,select,categories,Sql,Select,Categories,我希望能够运行一个报告,该报告将为我提供用户计算机、服务器和虚拟机类别中所有项目的列表 我想从该报告中排除所有其他类别 我不太确定要写什么来实现这一点,或者把它放在哪里 这就是我目前正在处理的问题。我得到了一个错误代码1054:每个类别的未知列 SELECT DISTINCT ASSET.NAME AS ASSET_NAME, ASSET_TYPE.NAME AS ASSET_TYPE, ASSET_TYPE.ASSET_CATEGORY AS CATEGORY FROM ASSET, ASS

我希望能够运行一个报告,该报告将为我提供用户计算机、服务器和虚拟机类别中所有项目的列表

我想从该报告中排除所有其他类别

我不太确定要写什么来实现这一点,或者把它放在哪里

这就是我目前正在处理的问题。我得到了一个错误代码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; 

编辑:我做了建议的更改(来自Codo),但现在返回了0行。还有什么建议吗?

您的类别很可能是字符串,因此需要在其周围加引号:

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

正如@Codo所说,您的类别应该是字符串(varchar或nvarchar),并且应该是

WHERE ASSET_CATEGORY IN ('SERVERS', 'USER_COMPUTER', 'VIRTUAL_MACHINE')
也没有显示两个表之间的任何关系。假设关系为:

ASSET.AssetTypeId = ASSET_TYPE.AssetTypeId 
避免
如果资产、资产类型
类型
旧式表连接
,则可以使用表别名进行查询,如下所示:

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; 

这是一个很好的赌注。。。你可能正在那里构造一个笛卡尔积,因为没有连接子句。我不明白为什么没有连接条件的人会对此进行投票。连接条件来了。你也可以跳过
DISTINCT
(因为它可能是为了取消笛卡尔积而添加的)@ypercube,是的,这是真的。把它脱了。tnx——这种旧式的逗号分隔的表列表样式在ANSI-92 SQL标准(20年前)中已经不再使用了。请不要用它了,谢谢你的小费。我做这件事才两天。我不太清楚自己是怎么了!