SQL查询以搜索多个表中的记录

时间:2018-09-01 21:41:10

标签: sql

我正在尝试实现搜索功能。我需要使用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'

这显然是不正确的。有人可以指导。

谢谢。

3 个答案:

答案 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'

关于联合的一个注意事项是,您必须确保查询的每个部分都以相同的顺序返回相同数量的具有相同数据类型的列。