1

我有一个 SQL 语句,它必须从两个数据库中提取信息,一个是常量且已知的数据库,另一个是在第一个数据库中动态找到的。数据库结构如下所示:

  • (数据库)查找
    • (表)测试
      • (字段)键,数据库名称
      • (行样本)“foo”、“database_foo”
  • (数据库)database_foo
    • (表)栏
      • (字段)重要1,重要2
      • (行样本)“傻”、“测试”

所以我的 SQL 语句如下所示:

SELECT
  test.key as key,
  test.database_name as database_name,
  bar.important1 as important1,
  bar.importnat2 as important2,
FROM
  lookup.test as test,
  (database_name).bar as bar,  # this, obviously, doesn't work
WHERE
  key = 'foo'
LIMIT 1;

有没有办法可以使这项工作,或者我最好只执行两个单独的 SQL 语句,一个用于查找,一个用于数据库?

4

3 回答 3

1

如果您必须这样做,那么您需要使用动态 sql两个语句。

您将查询构建为字符串,然后EXEC在查询构建后对其运行。

在这种情况下,您将有一个用于数据库名称的字符串变量,然后您将从该变量和您的文字查询创建一个查询,然后您只需执行它。

但是请注意,如果您不控制输入参数,这会使您容易受到 SQL 注入的影响。

Erland Sommarskog 对使用动态 SQL 有很好的介绍:

http://www.sommarskog.se/dynamic_sql.html

编辑:从下面的@BryanMoyle 评论中,您可能需要同时执行单独的查询动态 sql。您需要提取该值以确定其他数据库名称...由于您不能将数据库名称用作变量,否则您需要先获取SELECT此信息,然后将其粘贴到后续查询中。

于 2013-05-17T16:34:32.783 回答
1

我个人赞成 2 个单独的陈述;它将更容易控制错误,例如查找提供了一行,该行提供了一个有效的数据库等。

正如 Matthew 指出的,提防 SQLIA 并清理所有用户输入。我喜欢 MD5 散列输入并与查找的值的散列进行比较。

于 2013-05-17T16:43:19.693 回答
0

我会选择两个单独的查询,由 php 调解:它更简单、更健壮,并且会让你保持清醒和高效。编写一个查询来找出您应该与哪个数据库对话。使用 php(不是 SQL)将您的查询定向到该数据库:

$row = $lookup->prepare("SELECT database_name WHERE key = 'foo'")->execute()->fetch();
$db = $row[0];

然后你联系$db并询问带有 key 的行foo。使用 PHP 代码选择正确的打开连接,或在连接内切换数据库USE

$query2 = "USE " . $db . "; SELECT * FROM bar where key == 'foo'"
于 2013-05-17T18:16:41.930 回答