我有11列;我们称之为Column1 ...... ..Column11。假设所有这11列都包含员工姓名。我试图在所有这11列中查找特定记录,但是这里有问题,一些列只有姓氏,一些姓和中间名,一些有姓,中间名拼写,有些有全名。 所以,我试图找到一种更好的方法来查询所有表。 我目前正在做的是:
选择
Column1,Column2 ...... .Column11
这
表
其中
Column1喜欢'Beatrice%' OR
Column2喜欢'Beatrice%' OR ...
Column11喜欢'Beatrice%'
我可以使用简短的查询,例如“IN”和外卡吗?
其中
'Beatrice%'IN(Column1,Column2,... Column11)
我知道这个查询不起作用,但我想知道是否有更短的方法来查询表而不必使用11个“喜欢”11列
答案 0 :(得分:1)
您可以尝试以下构造:
select distinct Column1, Column2, Column3, ...
from [Table]
cross apply (values (Column1), (Column2), (Column3), ...) col(Value)
where col.Value like 'Beatrice%'
或
select Column1, Column2, Column3, ...
from [Table]
where exists (
select 1 from (values (Column1), (Column2), (Column3), ...) col(Value)
where col.Value like 'abc%'
)
您也可以考虑使用SqlServer全文搜索功能(link)
答案 1 :(得分:0)
更重要的是,这是规范化数据库的好时机。您有重复的列,这总是使查询变得困难。假设你有一个employee
表:
CREATE TABLE [employee] (
id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(20),
middle_initial CHAR(1),
surname VARCHAR(20)
)
现在假设您的[table]
,我将重命名[project]
,如下所示:
CREATE TABLE [project] (
id INT IDENTITY PRIMARY KEY,
name VARCHAR(20) NOT NULL,
supervisor_id INT FOREIGN KEY REFERENCES [employee](id)
)
最后,为了表达项目有员工的事实,添加一个链接表:
CREATE TABLE [project_employee] (
project_id INT REFERENCES [project](id),
employee_id INT REFERENCES [employee](id)
)
现在,对像%beatrice%
这样的员工的项目的查询只涉及联接和没有工会的单个员工。实际上,SQL Server支持计算列,因此将计算列full_name
添加到[employee]
表,然后您会得到如下查询:
SELECT p.name, e.full_name
FROM project p
JOIN project_employee pe ON p.id = pe.project_id
JOIN employee e ON pe.employee_id = e.id
WHERE e.full_name LIKE '%beatrice%';
是的,我知道我的语法错了,但我希望你能理解。标准化数据库,或继续用联合编写查询。
此外,您需要做的是您的员工Jane Doe与Richard Roe结婚并取其丈夫的名字,成为Jane Roe?使用当前数据库,您需要在表的所有列中搜索Jane Doe并更新它们。重新规范化,它只是更新[employee]
表中的一行。