我有一个地址表,我想标记与另一个表中的城镇相匹配的行。如果可能,请告知您是否需要这些代码。
示例表:
数据表
Fname Surname Town Postcode Flag
Alan Jones Colchester CO1 2RT
Steve Smith Lincoln LN23 7TY
Jeff Lilly Swindon SN1 6LK
Sarah Thomas Lincoln LN56 9TT
城镇名表
TownNames
Lincoln
Swindon
因此,在上面的示例Steve Smith
中,Jeff Lilly
和Sarah Thomas
应返回" X"在标志栏中。
答案 0 :(得分:3)
试试这个:
SELECT a.Fname, a.Surname, a.Town, a.Postcode,
CASE t.TownNames IS NOT NULL THEN 'X' ELSE '' END AS Flag
FROM Address AS a LEFT JOIN Towns AS t ON a.Town = t.TownNames;
答案 1 :(得分:1)
如果您想直接在表格中执行此操作,则可以创建一个persisted computed column
来为您执行此操作。您必须执行一项功能来执行您之后的计算(CASE
或IF EXISTS
)。
计算列的优势在于它会保持最新状态,您不必定期更新以确保它在那里。
功能
CREATE FUNCTION dbo.TownCheck (@Town VARCHAR(1))
RETURNS VARCHAR(1)
AS BEGIN
DECLARE @TownExists VARCHAR(1)
SELECT @TownExists = MAX('X') FROM dbo.TownNames WHERE TownName = @Town
RETURN @TownExists
END
让我们制作您的样本数据;
CREATE TABLE DataTable (Fname varchar(5), Surname varchar(6), Town varchar(10), Postcode varchar(8), Flag varchar(1))
INSERT INTO DataTable (Fname, Surname, Town, Postcode)
VALUES
('Alan','Jones','Colchester','CO1 2RT')
,('Steve','Smith','Lincoln','LN23 7TY')
,('Jeff','Lilly','Swindon','SN1 6LK')
,('Sarah','Thomas','Lincoln','LN56 9TT')
第二张表;
CREATE TABLE TownNames (TownName varchar(10))
INSERT INTO TownNames
VALUES
('Lincoln')
,('Swindon')
您无法更改列以进行计算,因此您必须将其删除,然后重新创建它(我假设您已经拥有此表,如果您不这样做,请执行此操作表的创建点;)
ALTER TABLE dbo.DataTable
DROP COLUMN Flag
ALTER TABLE dbo.DataTable
ADD Flag AS dbo.TownCheck(Town)
现在你的DataTable看起来像这样;
Fname Surname Town Postcode Flag
Alan Jones Colchester CO1 2RT NULL
Steve Smith Lincoln LN23 7TY X
Jeff Lilly Swindon SN1 6LK X
Sarah Thomas Lincoln LN56 9TT X
编辑:
如果更新了TownNames表,这将有效。如果您插入缺少的城镇;
INSERT INTO TownNames
VALUES ('Colchester')
你得到这个结果;
Fname Surname Town Postcode Flag
Alan Jones Colchester CO1 2RT X
Steve Smith Lincoln LN23 7TY X
Jeff Lilly Swindon SN1 6LK X
Sarah Thomas Lincoln LN56 9TT X
进一步阅读;