В постоянном поле, как вы возвращаете количество вхождений столбца в столбце другой таблицы

Требуется следующее из-за записей, вводимых третьими лицами в веб-приложении.

Некоторые столбцы (такие как Category) требует проверки, в том числе ниже. У меня есть стол OtherTable с допустимыми значениями.

Мне нужно определить, сколько вхождений (т. Е. IF) есть значения столбца текущей таблицы в указанном столбце другой таблицы. Если вхождений нет, это приводит к помеченной ошибке "1", при наличии вхождений это не приводит к помеченной ошибке "0".

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

Как я могу сделать это, пожалуйста?

2 ответа

Решение
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     

Если Category можно найти в OtherTable.ColumnA затем верните 0 или 1

Вы могли бы использовать CASE с EXISTS

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

Изменить: Вот sql-скрипка: http://sqlfiddle.com/


Изменить: я только что заметил, что вы хотите использовать вычисляемый столбец. Как я уже читал, вы можете использовать его только со скалярными значениями, а не с подзапросами. Но вы можете создать скалярную функцию.

Например:

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/

Примечание: как @Damien_The_Unbelieve прокомментировал в другом ответе, даже если вы сохраните результат с UDF, значение не будет обновлено, если строки в OtherTable изменятся. Просто имейте это в виду, поэтому вам нужно обновить таблицу вручную, если это необходимо, с помощью UDF.

Другие вопросы по тегам