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查询很垃圾(我才刚刚开始学习它们(。一段时间以来,我一直在互联网上寻找语法,但这是我所得到的,所以我想可能是我寻求帮助的时候了。如果有人能给我一些指导,将不胜感激。
我的第一反应是为什么你需要这种方法,也许你应该更好地解释你的需求。但无论如何,你最好看看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 %'