Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算字段,基于2个ID选择_Sql_Calculated Columns - Fatal编程技术网

Sql 计算字段,基于2个ID选择

Sql 计算字段,基于2个ID选择,sql,calculated-columns,Sql,Calculated Columns,我有一个表,名为FacilityDatabaseConnection,如下所示, ID、FacilityID、数据库类型ID、连接字符串 因此,给定FacilityID和DatabaseTypeID对,您将得到一个ConnectionString。 Facility表和DatabaseType表都有“Name”字段。 我想在FacilityDatabaseConnection中创建一个“Name”字段,以执行以下操作: SELECT (dbo.Facility.Name+' - '+dbo.Da

我有一个表,名为FacilityDatabaseConnection,如下所示, ID、FacilityID、数据库类型ID、连接字符串

因此,给定FacilityID和DatabaseTypeID对,您将得到一个ConnectionString。 Facility表和DatabaseType表都有“Name”字段。 我想在FacilityDatabaseConnection中创建一个“Name”字段,以执行以下操作:

SELECT (dbo.Facility.Name+' - '+dbo.DatabaseType.Name) as Name
FROM dbo.FacilityDatabaseConnection
INNER JOIN dbo.Facility
 ON dbo.FacilityDatabaseConnection.FacilityID = dbo.Facility.ID
INNER JOIN dbo.DatabaseType
 ON dbo.FacilityDatabaseConnection.DatabaseTypeID = dbo.DatabaseType.ID
因此它返回“FacilityName-DatabaseType”

这是一个查询,但是否可以将其设为字段?


我试过了

ALTER TABLE dbo.FacilityDatabaseConnection
ADD Name AS (SELECT (dbo.Facility.Name+' - '+dbo.DatabaseType.Name) as Name
FROM dbo.FacilityDatabaseConnection
INNER JOIN dbo.Facility
 ON dbo.FacilityDatabaseConnection.FacilityID = dbo.Facility.ID
INNER JOIN dbo.DatabaseType
 ON dbo.FacilityDatabaseConnection.DatabaseTypeID = dbo.DatabaseType.ID) PERSISTED
这给了我一个错误“在此上下文中不允许子查询。只允许标量表达式。”


是否有办法实现这一点,或者这样的计算字段不可能实现?

假设这是SQL Server,计算列无法引用其他表,因此您的建议不可能实现

另见


您应该改用视图/函数/存储过程。

假设这是SQL Server,计算列不能引用其他表,因此您的建议是不可能的

另见


您应该改用视图/函数/存储过程。

您可以执行以下操作

SELECT
    (SELECT count(*) FROM table1) as new_column_name,
    col1,
    col2
FROM
    table2

您可以执行以下操作

SELECT
    (SELECT count(*) FROM table1) as new_column_name,
    col1,
    col2
FROM
    table2

有一种秘密方法可以使计算列访问另一个表

即创建定义字段的用户定义函数。然后,UDF可以访问另一个表

alter语句类似于:

ALTER TABLE dbo.FacilityDatabaseConnection
    ADD Name AS udf_getFacilityName(FacilityId);

有一种秘密方法可以使计算列访问另一个表

即创建定义字段的用户定义函数。然后,UDF可以访问另一个表

alter语句类似于:

ALTER TABLE dbo.FacilityDatabaseConnection
    ADD Name AS udf_getFacilityName(FacilityId);

好吧,那就别提问题了。使用view/function/SP来实现这一点,与在我的程序中执行查询相比,与创建常规字段并手动将其命名相比,会有什么好处?我唯一能想到的是手动模式会占用更多空间,但速度更快,并允许使用其他命名模式(这取决于好坏)。老实说,我认为,在您将此查询确定为导致性能问题的瓶颈之前,您所做的一切都无关紧要。不过,我建议不要过早地对数据库进行非规范化(并添加一个额外的列,手动填充已有的数据),因为这会造成管理和数据完整性的噩梦。是的,我正在避免这样做。我们最初在那里有Name字段,直到我注意到我们只是为了这个目的才使用它,所以我删除了它,然后我想我可以做一个计算。老实说,虽然它看起来一点都不重要,但我认为最好的选择可能是不使用它,而是通过代码使用其他数据,而不是SQL。好吧,那就顺便问一下。使用view/function/SP来实现这一点,与在我的程序中执行查询相比,与创建常规字段并手动将其命名相比,会有什么好处?我唯一能想到的是手动模式会占用更多空间,但速度更快,并允许使用其他命名模式(这取决于好坏)。老实说,我认为,在您将此查询确定为导致性能问题的瓶颈之前,您所做的一切都无关紧要。不过,我建议不要过早地对数据库进行非规范化(并添加一个额外的列,手动填充已有的数据),因为这会造成管理和数据完整性的噩梦。是的,我正在避免这样做。我们最初在那里有Name字段,直到我注意到我们只是为了这个目的才使用它,所以我删除了它,然后我想我可以做一个计算。老实说,虽然它看起来一点都不重要,但我认为最好的选择可能是不使用它,通过代码而不是SQL使用其他数据。您必须使用视图来生成这样的派生视图。您必须使用视图来生成这样的派生视图。