【问题标题】:SQL querying two tables lots of columnsSQL查询两个表很多列
【发布时间】:2012-05-09 11:57:33
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net sql sql-server-2005


    【解决方案1】:

    您可以使用 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 %'
    

    【讨论】:

      【解决方案2】:

      如果可以的话,重新设计表格会很有帮助。 根据有多少属性,以及将日期划分为不同表的原因,您可以拥有一个名为 DayData 的表,其中包含列 日期(可能存储为 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 中删除数据。主要网站使用类似的技术被黑客入侵 - 而不是删除数据,查询被操纵以生成错误消息或故意的时间延迟,泄露有关数据库设计和用户名、密码等的信息。

      希望有帮助:)

      【讨论】:

      • 我可能会重新设计桌子。我不知道我为什么要把他们分开,我显然没有考虑清楚。我也会看看 SQL 注入的东西,我想我需要了解更多。一个简单的问题,当我获取文本框值时,我使用 HttpUtility.HtmlEncode();所以我使用的字符串是:string txtBText = HttpUtility.HtmlEncode(TextBoxSearch.Text);,我想知道这还不足以防止用户输入的 SQL 攻击吗? (我假设不是)
      • 啊,我知道我已经阅读了更多关于 SQL 注入的内容,我应该使用参数来代替,所以我会研究一下。
      • @Aaron Bertrand - 感谢整理格式。我还在习惯 StackOverflow :) (顺便说一句,你的博客的忠实粉丝!)
      【解决方案3】:

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

      如果您正在尝试学习 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 创建兼容的列列表。

      【讨论】:

      • 谢谢,它看起来确实比我所拥有的更容易阅读。感谢您的信息。
      • 这绝对是它应该写的方式(格式 - 仍然不确定设计)如果我亲自使用我在回答中快速组合的 sn-p 我会感到不安,并且如果我的团队中有人使用它,会更加沮丧。
      【解决方案4】:

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

      这里有一些有用的链接:

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

      在文本检索中,全文搜索是指用于搜索的技术 单个计算机存储的文档或全文集合 数据库。全文搜索不同于基于搜索的搜索 元数据或数据库中表示的部分原始文本 (例如标题、摘要、选定部分或参考书目 参考)。

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

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

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

      【讨论】:

      • 这看起来很有趣,我会研究一下,谢谢你的链接。
      猜你喜欢
      • 2015-11-01
      • 2018-06-11
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多