【问题标题】:Calculated field, SELECT based on 2 IDs计算字段,基于 2 个 ID 的 SELECT
【发布时间】:2013-08-01 17:53:58
【问题描述】:

我有一个名为 FacilityDatabaseConnection 的表,就像这样, ID、FacilityID、DatabaseTypeID、ConnectionString

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

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 calculated-columns


【解决方案1】:

假设这是 SQL Server,计算列不能引用其他表,所以你的建议是不可能的。

另见http://msdn.microsoft.com/en-us/library/ms191250%28v=sql.105%29.aspx

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

【讨论】:

  • 好的,那么,附带问题。与仅在我的程序中进行查询与仅创建常规字段并手动将其命名相比,执行视图/函数/SP 来执行此操作是否有好处?我唯一能想到的是手册会占用更多空间,但速度更快,并允许使用替代命名模式(视情况而定)。
  • 老实说,在您将此查询确定为导致性能问题的瓶颈之前,我认为您所做的事情并不重要。但是,我建议不要过早地对数据库进行非规范化(并添加一个额外的列,您可以手动填充已经存在的数据),因为它会造成管理和数据完整性的噩梦。
  • 是的,我曾经/正在避免这种情况。我们最初在那里有 Name 字段,直到我注意到我们只是将它用于此目的,所以我删除了它,然后我想我可以做一个计算出来的。老实说,虽然它看起来根本不重要,所以我认为最好的选择可能是让它消失并通过代码而不是 SQL 使用其他数据。
【解决方案2】:

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

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

alter 语句类似于:

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

【讨论】:

    【解决方案3】:

    您可以执行以下操作

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2016-07-08
      • 2012-07-12
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多