2013-05-17 1 views
1

У меня есть инструкция SQL, которая должна извлекать информацию из двух баз данных, одна из них является константой и известной базой данных, а другая динамически находится в первой базе данных. Структура базы данных выглядит следующим образом:SELECT FROM из базы данных, названной из значения в JOIN

  • (база данных) поиск
    • (таблица) тест
      • ключ (поля), database_name
      • (строка выборки) "Foo", "database_foo"
  • (база данных) database_foo
    • (таблица) бар
      • (поля) important1, important2
      • (образец строки) "глупый", "тест"

Так что мой 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; 

Есть ли способ, которым я могу сделать эту работу, или мне лучше сделать два eparate SQL-заявления, один для поиска и один для базы данных?

ответ

1

Если вы должны сделать это, тогда вам нужно использовать динамические sql и два утверждения.

У вас есть запрос, построенный как строка, а затем вы запускаете EXEC по запросу после его создания.

В этом случае у вас будет строковая переменная для имени db, тогда вы создадите запрос из этой переменной и ваш литеральный запрос, тогда вы просто выполните ее.

Помните, что это делает вас уязвимыми для SQL-инъекций, если вы не контролируете входные параметры.

Erland Sommarskog имеет большой учебник по с использованием динамического SQL:

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

EDIT: От @BryanMoyle комментарий ниже, вы, вероятно, нужно сделать так отдельный запрос и динамического SQL. Вам нужно извлечь значение, чтобы определить другое имя базы данных ... Поскольку вы не можете использовать имя базы данных в качестве переменной, в противном случае вам нужно сначала указать эту информацию, а затем вставить ее в последующий запрос.

+0

Я описываю комментарий по этому поводу, а потом понял, что это не будет работать для него, потому что динамическое значение является построенный извлекается из соединения, ранее не известно – Bryan

+0

@BryanMoyles ему придется делать ** оба **, затем отдельный запрос для поиска нужного ему значения * и * dynamic sql для изменения имени БД в запросе. – Matthew

1

Лично я делаю 2 отдельных заявления; это облегчило бы контроль за такими ошибками, как поиск, содержащий строку, что строка содержит действительную базу данных и т. д.

Как указал Мэтью, остерегайтесь SQLIA и дезинфицируйте все пользовательские ввод. Мне нравится хеш-входы MD5 и сравниваются с хешем значения, которое вы искали.

0

Я бы пошел на два отдельных запроса, опосредуемых php: он проще, более надежным и будет поддерживать вас здоровым и продуктивным. Напишите один запрос, чтобы узнать, с какой базой данных вы должны разговаривать. Использование PHP (не SQL), чтобы направить запрос к этой базе данных:

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

Затем вы обратитесь к $db и попросить строки с ключом foo. Используйте PHP код, чтобы правильно выбрать открытое соединение, или переключить базы данных в связи с USE:

$query2 = "USE " . $db . "; SELECT * FROM bar where key == 'foo'" 
Смежные вопросы