1

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

到目前为止我在第一张桌子上工作得很好,但我真的很想搜索第一张和第二张桌子,我只是不知道怎么做,我尝试过使用 join 和 union 但我没有太多运气,我只是得到错误显然我做错了什么。而且我使用的查询真的很长,你可以看到,我相信一定有更好的方法来做到这一点:

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 查询很垃圾(我刚刚开始学习它们)。我一直在互联网上寻找一段时间试图学习语法,但这是我所掌握的,所以我认为可能是我寻求帮助的时候了。如果有人能给我一些指导,将不胜感激。

4

4 回答 4

2

我的第一反应是为什么你需要这种方法,也许你应该更好地解释你的需求。但无论如何你最好看看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 查询可能需要几分钟才能返回;而对于相同的数据,全文查询可能只需要几秒钟或更短的时间,具体取决于返回的行数。

于 2012-04-29T13:50:54.243 回答
1

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

如果位置很重要(例如,作者 1 的处理方式与作者 2 不同),那么您也可以有一个索引字段(整数类型)。这取决于每种类型是否总是恰好有 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 的派生表:(select * from D1Table UNION D2Table)

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

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

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

希望有帮助:)

于 2012-04-29T14:12:28.747 回答
0

您可以使用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 %'
于 2012-05-02T05:20:25.283 回答
0

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

如果您正在尝试学习 SQL,那么您必须训练自己使用更好的格式。这可能看起来很琐碎,但实际上,如果您使用更易于理解的格式 ,您会发现它很容易阅读、理解,尤其是编辑。

虽然我真的很怀念 c# 中的 c/c++ 类型块引用,但几十年的 VB 编程已经使我适应了没有它们的这种有点丑陋的要求。比较你的例子:

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 + "%' ";

相当于:

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 创建兼容的列列表。

于 2012-04-29T14:42:10.303 回答