【问题标题】:Rewrite "IN" statement重写“IN”语句
【发布时间】:2015-11-19 10:18:18
【问题描述】:

最近我一直在开发一些软件,它有一个系统,允许您列出 MSSQL 表中的特定数据并将其显示在基于 Web 的 GUI 中。不过,它有一些限制。

比较文本时,唯一允许的运算符是 NOT NULLLIKE

此外,每个语句都以 SELECT * FROM MyTable WHERE 开头。

原因在于我们使用的软件的编程方式。不幸的是,没有办法改变它,开发人员似乎也没有计划解决这个问题。

这已经造成了相当大的麻烦,但到目前为止,总是有办法重写语句。

现在,我已经到了卡住的地步。我创建了一个选择 MyTable 行的特定子集的视图。现在我想显示这些

Tl;博士:

如果我有这段无法修改的代码,只能追加到:

SELECT * FROM MyTable WHERE

如何在不使用 IN 的情况下执行与另一个表的内部联接?

-

提前致谢!

【问题讨论】:

  • 为什么要同时使用 MySQL 和 MS SQL Server 标签?不要标记未涉及的产品。
  • 抱歉,一定是搞错了。

标签: sql sql-server database join


【解决方案1】:

只是为了一笑而过,我会做这样的事情:

SELECT * FROM MyTable WHERE 0 = 1 UNION SELECT whatIWant FROM whereIWant

0 = 1 标准会丢弃 MyTable 中的所有结果,只有联合的右侧部分会返回结果。问题是您仍然需要处理 MyTable 中的列。

【讨论】:

  • 有趣。如果您走得那么远,那么为什么不简单地使用SELECT * FROM MyTable WHERE 0 = 1; SELECT whatIWant FROM whereIWant 并且您不必再担心MyTable 呢? :-)
  • @RacilHilan 我不知道它的接口,但它只接受一条 SQL 语句是合理的
  • 不是接口,而是db引擎。假设接口将查询作为字符串发送,它不知道它的含义,所以它不关心。至于 db 引擎,大多数引擎都会执行两个查询并返回最后一个查询的结果。
  • 好吧,我们不知道,我怀疑是 RDBMS 迫使他使用 SELECT * FROM MyTable WHERE 片段。我猜他有一个发送查询的应用程序,也许它以文本的形式发送它们——那么你是对的——或者它可能会进行一些额外的验证。我认为 PDO 或 jdbc 驱动程序(仅举两个例子)会在他们期望发送一个查询时拒绝发送两个查询。
  • 非常感谢!您的建议将我引向了我的最终查询,这比我预期的要简单得多。
【解决方案2】:

使用 EXISTS

SELECT * FROM MyTable WHERE 
exists (SELECT * from othertable as t2 where t2.col=MyTable.col)

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2011-02-10
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多