我正在尝试实现搜索功能。我需要使用text-string
查看SQL数据库中的多个表。目前,我只查看3个表,即
表Items
:
[dbo].[Items]
(
[ItemID] INT IDENTITY (1, 1) NOT NULL,
[CategoryID] INT NOT NULL,
[BrandID] INT NOT NULL,
[ItemName] NVARCHAR(MAX) NOT NULL,
[ItemPrice] DECIMAL(18, 2) NOT NULL,
[imageUrl] NVARCHAR(MAX) NULL,
CONSTRAINT [PK_dbo.Items]
PRIMARY KEY CLUSTERED ([ItemID] ASC),
CONSTRAINT [FK_dbo.Items_dbo.Brands_BrandID]
FOREIGN KEY ([BrandID]) REFERENCES [dbo].[Brands] ([BrandID]),
CONSTRAINT [FK_dbo.Items_dbo.Categories_CategoryID]
FOREIGN KEY ([CategoryID]) REFERENCES [dbo].[Categories] ([CategoryID])
)
表Categories
:
[dbo].[Categories]
(
[CategoryID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Categories]
PRIMARY KEY CLUSTERED ([CategoryID] ASC)
)
表Brands
:
[dbo].[Brands]
(
[BrandID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Brands]
PRIMARY KEY CLUSTERED ([BrandID] ASC)
)
任何可能包含提供的text-string
的记录都必须被取出。我是SQL知识的新手。这是我的实现是:
SELECT *
FROM Items
WHERE ItemName LIKE 'cocacola'
SELECT *
FROM Categories
WHERE Name LIKE 'cocacola'
SELECT *
FROM Brands
WHERE Name LIKE 'cocacola'
这显然是不正确的。有人可以指导。
谢谢。
答案 0 :(得分:1)
如果要返回子字符串搜索,则可能会很慢,具体取决于您拥有的数据量。
如果您能够预先指定表格,并且希望通过一次搜索来搜索所有表格并返回所有表格中的匹配项,那么您将需要以下内容:
SELECT
'Items' as table_name,
item_id as record_id,
ItemName AS found
FROM
Items
WHERE
ItemName LIKE '%cocacola%'
UNION
SELECT
'Categories' as table_name,
CategoryID AS record_id,
Name AS found
FROM
Categories
WHERE
Name LIKE '%cocacola%'
UNION
SELECT
'Brands' as table_name,
BrandID AS record_id,
Name AS found
FROM
Brands
WHERE
Name LIKE '%cocacola%'
UNION会将一个查询的结果追加到另一个查询。
如果您有很多数据,它将很慢
答案 1 :(得分:0)
您的解决方案是不正确的。您运行三个查询。每个针对不同的表。根据您的用例,这可能很好。
如果您只想通过一个查询搜索所有表,就可以加入表。这可能比运行三个查询要慢,因为数据库必须将值匹配在一起。
SELECT *
FROM Items
FULL OUTER JOIN Categories ON Categories.CategoryID = Items.CategoryID
FULL OUTER JOIN Brands ON Brands.BrandID = Items.BrandID
WHERE Items.ItemName LIKE 'cocacola'
AND Categories.Name LIKE 'cocacola'
AND Brands.Name LIKE 'cocacola'
如果您在此查询中找到类别名称的匹配项,则会列出与该类别关联的每个项目的类别。
答案 2 :(得分:0)
听起来您可能想尝试使用并集将所有三个查询的结果结合在一起。
例如:
SELECT ItemID, ItemName
FROM Items
WHERE ItemName = 'cocacola'
UNION
SELECT CategoryID, Name
FROM Categories
WHERE Name = 'cocacola'
UNION
SELECT BrandID, Name
FROM Brands
WHERE Name = 'cocacola'
关于联合的一个注意事项是,您必须确保查询的每个部分都以相同的顺序返回相同数量的具有相同数据类型的列。