Sql server 2008 使用多个“查询表”;“喜欢”;,还有别的办法吗?

Sql server 2008 使用多个“查询表”;“喜欢”;,还有别的办法吗?,sql-server-2008,Sql Server 2008,我有11个专栏;让我们叫他们Column1….Column11。让我们假设所有这11列都包含员工姓名。我试图在所有这11列中寻找一个特定的记录,但问题是,有些列只显示姓氏,有些列只显示姓氏和中间首字母,有些列只显示姓氏和中间名,还有一些列显示全名。 所以,我正试图找到一种更好的方法来查询所有的表。 我目前正在做的是: 挑选 第1栏、第2栏……第11栏 从 桌子 在哪里 专栏1如“Beatrice%” 或 第2栏如“Beatrice%” 或者 第11栏如“Beatrice%” 是否有一个简短的查询

我有11个专栏;让我们叫他们Column1….Column11。让我们假设所有这11列都包含员工姓名。我试图在所有这11列中寻找一个特定的记录,但问题是,有些列只显示姓氏,有些列只显示姓氏和中间首字母,有些列只显示姓氏和中间名,还有一些列显示全名。 所以,我正试图找到一种更好的方法来查询所有的表。 我目前正在做的是:

挑选

第1栏、第2栏……第11栏

桌子

在哪里

专栏1如“Beatrice%” 或

第2栏如“Beatrice%” 或者

第11栏如“Beatrice%”

是否有一个简短的查询可以与通配符一起使用

在哪里

(第1栏、第2栏、第11栏)中的“Beatrice%”


我知道这个查询不起作用,但我想知道是否有一种更短的方法可以查询表,而不必使用11个“like”和11个列

您可以尝试以下构造:

select distinct Column1, Column2, Column3, ...
from [Table]
    cross apply (values (Column1), (Column2), (Column3), ...) col(Value)
where col.Value like 'Beatrice%'


您也可以考虑使用SQLServer全文搜索功能()

您可以尝试以下构造:

select distinct Column1, Column2, Column3, ...
from [Table]
    cross apply (values (Column1), (Column2), (Column3), ...) col(Value)
where col.Value like 'Beatrice%'


您也可以考虑使用SQLServer全文搜索功能()

更重要的是,这是规范数据库的好时机。您有重复的列,这总是使查询变得困难。假设您有一个

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支持计算列,因此在
[employee]
表中添加一个计算列
full\u name
,然后您将得到如下查询:

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并更新它们。重新规范化,它只是更新
[employee]
表中的一行。

更重要的是,现在是规范化数据库的好时机。您有重复的列,这总是使查询变得困难。假设您有一个
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支持计算列,因此在
[employee]
表中添加一个计算列
full\u name
,然后您将得到如下查询:

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并更新它们。重新规范化,它只是更新
[employee]
表中的一行。

嗨,Eric,谢谢你的解释,我完全理解你规范化数据库的逻辑。我应该提到的是,这些表实际上是一个维度表,每一列都代表层次结构中的一个节点。哦,那么你将该表匿名化了。使用
[table]
[Column1]
使其看起来像是标准化问题。有了这样的假设,我觉得你在把自己束缚在持续的低效率之中。是的,很抱歉在错误的方向上误导了你。我会记得在问题的主体中包含更多的细节。不过,使用计算列之类的技术可以帮助你使用
like
短语。您的表中有一列包含多条信息;为了清晰起见,请将列拆分,因为您可能需要单独的部分,但需要为整个内容添加一个计算列。嗨,Eric,谢谢您的解释,我完全理解您规范化数据库的逻辑。我应该提到的是,这些表实际上是一个维度表,每一列都代表层次结构中的一个节点。哦,那么你将该表匿名化了。使用
[table]
[Column1]
使其看起来像是标准化问题。有了这样的假设,我觉得你在把自己束缚在持续的低效率之中。是的,很抱歉在错误的方向上误导了你。我会记得在问题的主体中包含更多的细节。不过,使用计算列之类的技术可以帮助你使用
like
短语。您的表中有一列包含多条信息;为清晰起见,将列拆分,因为您可能需要单独的部分,但为整个内容添加一个计算列。i-one,谢谢提示。我还没用过,但这很有道理。我,谢谢你的提示。我还没用过,但它很有意义。