在持久字段中,如何返回不同表列中列的出现次数

时间:2012-07-03 11:01:01

标签: sql sql-server persisted-column

由于第三方在Web应用程序中输入了记录,因此需要以下内容。

某些列(例如Category)需要验证,包括下面的列。我有一个表OtherTable,其中包含允许的值。

我需要确定当前表的列的值在不同表的指定列中出现的次数(即:IF)。如果没有出现,则会导致标记错误“1”,如果发生,则不会导致标记错误“0”。

If `Category` can be found in `OtherTable.ColumnA` then return 0 else 1

我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

  

如果Category中可以找到OtherTable.ColumnA,则返回0其他1

您可以将CASEEXISTS

一起使用
SELECT CASE WHEN EXISTS(
   SELECT NULL 
   FROM AllowedValues av
   WHERE av.ColumnA = Category
) THEN 0 ELSE 1 END AS ErrorCode
, Category
FROM [Table] 

编辑:这是一个sql-fiddle:http://sqlfiddle.com/#!3/55a2e/1


修改:我刚才注意到你想要使用计算列。正如我所读,你只能使用标量值而不是子查询。但您可以创建scalar valued function

例如:

create table AllowedValues(ColumnA varchar(1));
insert into  AllowedValues Values('A');
insert into  AllowedValues Values('B');
insert into  AllowedValues Values('C');

create table [Table](Category varchar(1));
insert into  [Table]  Values('A');
insert into  [Table]  Values('B');
insert into  [Table]  Values('C');
insert into  [Table]  Values('D');
insert into  [Table]  Values('E');

-- create a scalar valued function to return your error-code
CREATE FUNCTION udf_Category_ErrorCode
(
    @category VARCHAR(1)
)
RETURNS INT

AS BEGIN
    DECLARE @retValue INT

    SELECT @retValue = 
      CASE WHEN EXISTS(
       SELECT NULL 
       FROM AllowedValues av
       WHERE av.ColumnA = @category
    ) THEN 0 ELSE 1 END

    RETURN @retValue
END
GO

现在您可以将列添加为计算列,该列使用该函数来计算值:

ALTER TABLE [Table] ADD ErrorCode AS ( dbo.udf_Category_ErrorCode(Category) )
GO

这是正在运行的SQL:http://sqlfiddle.com/#!3/fc49e/2

注意:正如@Damien_The_Unbelieve已对其他答案发表评论,即使您使用UDF保留结果,如果 OtherTable 改变。请记住这一点,因此如果需要,需要在UDF的帮助下手动更新表。

答案 1 :(得分:1)

select mt.*,IFNULL(cat_count.ct,0) as Occurrences from MainTable mt 
left outer join (select ColumnA,count(*) as ct from OtherTable) cat_count 
on mt.Category=cat_count.ColumnA

结果:

mt.col1 | mt.col2 | Category | Occurrences 
###     | ###     | XXX      | 3
###     | ###     | YYY      | 0
###     | ###     | ZZZ      | 1