SQL 查询两个表大量列

本文关键字:两个 查询 SQL | 更新日期: 2023-09-27 18:32:43

>我有两个表,它们具有所有相同的列但不同的数据。它们代表两个不同的日子。这些表是 D1Table 和 D2Table。这些列是作者 1、作者 2、作者 3、作者 4、作者 5、位置 1 - 位置 5、标题和传记 - 传记 5。在查询中,我试图获取与用户在文本框中键入的文本匹配的列(以便他们可以在两天内进行搜索(。

到目前为止,我在第一个表

上运行良好,但我真的很想搜索第一个和第二个表,我只是不知道该怎么做,我已经尝试使用加入和联合,但我没有太多运气,我只是得到错误显然我做错了什么。此外,我使用的查询真的很长,如您所见,我相信一定有更好的方法来做到这一点:

txt = "SELECT * from D1Table WHERE Synopsis LIKE '%" + txtBText + 
      "%' OR  Author1 LIKE '%" + txtBText + "%' OR Author2 LIKE '%" + txtBText + 
      "%' OR Author3 LIKE '%" + txtBText + "%' OR Author4 LIKE '%" + txtBText + 
      "%'   OR Author5 LIKE '%" + txtBText + "%' OR Biography1 LIKE '%" + txtBText + 
      "%' OR Biography2 LIKE '%" + txtBText + "%' OR Biography3 LIKE '%" + txtBText + 
      "%' OR Biography4 LIKE '%" + txtBText + "%' OR Biography5 LIKE '%" + txtBText + 
      "%' OR Title LIKE '%" + txtBText + "%'  OR Position1 LIKE '%" + txtBText + 
      "%'OR Position2 LIKE '%" + txtBText + "%' OR Position3 LIKE '%" + txtBText + 
      "%' OR Position4 LIKE '%" + txtBText + "%' OR Position5 LIKE '%" + txtBText + "%' "; 

现在我知道这很糟糕,正如你可能知道的那样,我对SQL查询很垃圾(我才刚刚开始学习它们(。一段时间以来,我一直在互联网上寻找语法,但这是我所得到的,所以我想可能是我寻求帮助的时候了。如果有人能给我一些指导,将不胜感激。

SQL 查询两个表大量列

我的第一反应是为什么你需要这种方法,也许你应该更好地解释你的需求。但无论如何,你最好看看full text search,只是谷歌它。

以下是一些有用的链接:

http://en.wikipedia.org/wiki/Full_text_search

在文本检索中,全文搜索是指搜索技术 单个计算机存储的文档或全文集合 数据库。全文搜索与基于以下条件的搜索区分开来 元数据或数据库中表示的部分原始文本 (如标题、摘要、所选章节或书目 参考资料(。

在全文搜索中,搜索引擎会检查 每个存储的文档,因为它试图匹配搜索条件(例如, 用户提供的字词(。全文搜索技术成为 1990年代在线书目数据库中很常见[验证] 需要]。许多网站和应用程序(如单词 处理软件(提供全文搜索功能。一些网络 AltaVista等搜索引擎采用全文搜索技术 而其他人仅索引其检查的网页的一部分 索引系统。[1]

http://msdn.microsoft.com/en-us/library/ms142571.aspx上面链接中的一些引述:将 LIKE 与全文搜索进行比较

与全文搜索相比,LIKE Transact-SQL 谓词有效 仅在字符模式上。此外,您不能使用 LIKE 谓词来 查询格式化的二进制数据。此外,针对大型的 LIKE 查询 非结构化文本数据量比等效数据量慢得多 针对相同数据的全文查询。针对数百万人的 LIKE 查询 的文本数据行可能需要几分钟才能返回;而全文 针对相同数据的查询可能只需要几秒钟或更短的时间,具体取决于 返回的行数。

如果可以的话,重新设计表格会很有帮助。根据属性的数量以及将日期划分为不同表的原因,您可以有一个名为 DayData 的表,其中包含列日期(可能存储为 int 或使用 SQL 2008 R2 的 DATE 数据类型(田价值

如果位置很重要(例如 author1 的处理方式与 author2 不同(,那么你也可以有一个索引字段(整数类型(。这取决于每种类型是否始终恰好有 5 个值,或者是否有 0、1 或 N,以及类型是否可以随时间变化。

无论如何,如果你坚持你

所拥有的,你可以尝试全文搜索,或者如果这是一个太远的桥梁,请尝试

"SELECT * from (select * from D1Table UNION D2Table) D1D2
WHERE Synopsis LIKE '%" + txtBText + "%' OR Author1 LIKE '%" + txtBText + "%'
OR Author2 LIKE '%" + txtBText + "%' OR Author3 LIKE '%" + txtBText + "%'
OR Author4 LIKE '%" + txtBText + "%' OR Author5 LIKE '%" + txtBText + "%'
OR Biography1 LIKE '%" + txtBText + "%' OR Biography2 LIKE '%" + txtBText + "%'
OR Biography3 LIKE '%" + txtBText + "%' OR Biography4 LIKE '%" + txtBText + "%' 
OR Biography5 LIKE '%" + txtBText + "%' OR Title LIKE '%" + txtBText + "%' 
OR Position1 LIKE '%" + txtBText + "%'OR Position2 LIKE '%" + txtBText + "%' 
OR Position3 LIKE '%" + txtBText + "%' OR Position4 LIKE '%" + txtBText + "%' 
OR Position5 LIKE '%" + txtBText + "%' "; 

请注意名为 D1D2 的派生表:(从 D1Table UNION D2Table 中选择 *(

但是,您还有另一个问题 - 像您一样构建语句容易受到SQL注入攻击(搜索此站点或Google(。 有人可以把

'--delete * from D1Table; 'select * from D1Table where ''1=

,然后从 D1 表中删除数据。 主要网站使用类似的技术被黑客入侵 - 而不是删除数据,而是操纵查询以生成错误消息或故意的计时延迟,泄露有关数据库设计和用户名,密码等的信息。

希望对:)有所帮助

虽然我基本上同意我在这里看到的其他答案,但我将对我的答案采取不同的策略:

如果你想学习SQL,那么你必须约束自己使用更好的形式。 这可能看起来微不足道,但实际上,如果您使用更易于理解的格式,您会发现它易于阅读、理解和编辑

虽然我真的很想念 c# 中的 c/c++ 类型块引号,但几十年的 VB 编程已经让我适应了没有它们的有点丑陋的要求。 比较您的示例:

txt = "从 D1Table 中选择 *,其中概要喜欢 '%" + txtBText + "%' OR Author1 喜欢 '%" + txtBText + "%' OR Author2 喜欢 '%" + txtBText + "%' OR Author3 LIKE '%" + txtBText + "%' OR Author4 LIKE '%" + txtBText + "%' OR Author5 LIKE '%" + txtBT ext + "%' OR 传记 1 LIKE '%" + txtBText + "%' OR 传记 2 LIKE '%" + txtBText + "%' OR 传记 3 LIKE '%" + txtBText + "%' OR 传记4 LIKE '%" + txtBText + "%' OR 传记5 LIKE '%" + txtBText + "%'

OR 标题 LIKE '%" + txtBText + "%' OR 位置 1

LIKE '%" + txtBText + "%'OR Position2 LIKE '%" + txtBText + "%' OR Position3 LIKE '%" + txtBText + "%' OR Position4 LIKE '%" + txtBText + "%' OR Position5 LIKE '%" + txtBText + "%' ";

到等效项:

txt = ""
+ "  SELECT  * "
+ "  from    D1Table "
+ "  WHERE   Synopsis    LIKE '%" + txtBText + "%' "
+ "      OR  Author1     LIKE '%" + txtBText + "%' "
+ "      OR  Author2     LIKE '%" + txtBText + "%' "
+ "      OR  Author3     LIKE '%" + txtBText + "%' "
+ "      OR  Author4     LIKE '%" + txtBText + "%' "
+ "      OR  Author5     LIKE '%" + txtBText + "%' "
+ "      OR  Biography1  LIKE '%" + txtBText + "%' "
+ "      OR  Biography2  LIKE '%" + txtBText + "%' "
+ "      OR  Biography3  LIKE '%" + txtBText + "%' "
+ "      OR  Biography4  LIKE '%" + txtBText + "%' "
+ "      OR  Biography5  LIKE '%" + txtBText + "%' "
+ "      OR  Title       LIKE '%" + txtBText + "%' "
+ "      OR  Position1   LIKE '%" + txtBText + "%' "
+ "      OR  Position2   LIKE '%" + txtBText + "%' "
+ "      OR  Position3   LIKE '%" + txtBText + "%' "
+ "      OR  Position4   LIKE '%" + txtBText + "%' "
+ "      OR  Position5   LIKE '%" + txtBText + "%' "
;

显然更易于阅读和理解。 不是很明显的是,它也更容易编辑。 考虑您需要通过添加 UNION 来检查两个表:

txt = ""
// <CUT from here
+ "  SELECT  * "
+ "  from    D1Table "
+ "  WHERE   Synopsis    LIKE '%" + txtBText + "%' "
+ "      OR  Author1     LIKE '%" + txtBText + "%' "
+ "      OR  Author2     LIKE '%" + txtBText + "%' "
+ "      OR  Author3     LIKE '%" + txtBText + "%' "
+ "      OR  Author4     LIKE '%" + txtBText + "%' "
+ "      OR  Author5     LIKE '%" + txtBText + "%' "
+ "      OR  Biography1  LIKE '%" + txtBText + "%' "
+ "      OR  Biography2  LIKE '%" + txtBText + "%' "
+ "      OR  Biography3  LIKE '%" + txtBText + "%' "
+ "      OR  Biography4  LIKE '%" + txtBText + "%' "
+ "      OR  Biography5  LIKE '%" + txtBText + "%' "
+ "      OR  Title       LIKE '%" + txtBText + "%' "
+ "      OR  Position1   LIKE '%" + txtBText + "%' "
+ "      OR  Position2   LIKE '%" + txtBText + "%' "
+ "      OR  Position3   LIKE '%" + txtBText + "%' "
+ "      OR  Position4   LIKE '%" + txtBText + "%' "
+ "      OR  Position5   LIKE '%" + txtBText + "%' "
// CUT to here>
// VV add a UNION
+ " UNION ALL "
// <PASTE here
+ "  SELECT  + "
+ "  from    D2Table "  // <-- change the table name here
+ "  WHERE   Synopsis    LIKE '%" + txtBText + "%' "
+ "      OR  Author1     LIKE '%" + txtBText + "%' "
+ "      OR  Author2     LIKE '%" + txtBText + "%' "
+ "      OR  Author3     LIKE '%" + txtBText + "%' "
+ "      OR  Author4     LIKE '%" + txtBText + "%' "
+ "      OR  Author5     LIKE '%" + txtBText + "%' "
+ "      OR  Biography1  LIKE '%" + txtBText + "%' "
+ "      OR  Biography2  LIKE '%" + txtBText + "%' "
+ "      OR  Biography3  LIKE '%" + txtBText + "%' "
+ "      OR  Biography4  LIKE '%" + txtBText + "%' "
+ "      OR  Biography5  LIKE '%" + txtBText + "%' "
+ "      OR  Title       LIKE '%" + txtBText + "%' "
+ "      OR  Position1   LIKE '%" + txtBText + "%' "
+ "      OR  Position2   LIKE '%" + txtBText + "%' "
+ "      OR  Position3   LIKE '%" + txtBText + "%' "
+ "      OR  Position4   LIKE '%" + txtBText + "%' "
+ "      OR  Position5   LIKE '%" + txtBText + "%' "
// ^^ change these column names if needed
;

这里遗漏的是,对于 UNION,SELECT 必须返回相同数量的列,并且列的数据类型必须兼容。 因此,如果 D1Table 和 D2Table 具有不同的列,则必须删除"*"并为每个 SELECT 创建兼容的列列表。

您可以使用 UNION ALL 并运行两个查询来获取结果... 如 RBarryYoung 所示

SELECT COLUMN1, COLUMN2 FROM TABLE1 WHERE COLUMN1 LIKE '% Variable %' OR COLUMN2 LIKE '% Variable %'
UNION ALL
SELECT COLUMN1, COLUMN2 FROM TABLE2 WHERE COLUMN1 LIKE '% Variable %' OR COLUMN2 LIKE '% Variable %'