2016-08-27 3 views
0

Я хочу искать в 16 разных таблицах, но я не хочу повторять «выбор из БД» 16 раз; Я думаю, что это не очень помогает в производительности!Как отделить данные от нескольких таблиц?

Я использую:

query="SELECT * FROM table1, table2,..., table16 WHERE id=?"; 

Является ли это правильно ?? Моя проблема заключается в том, как разделить данные таблицы?

также, возможно, я могу получить из одной таблицы два или более результатов для одного «id»; Поэтому я хочу знать, какие данные из таблицы! . С уважением,

+0

Вы должны опубликовать структуры таблиц с данными образца и ожидаемыми результатами. Как есть, трудно ответить или понять. Ваш запрос производит «декартовое произведение» результатов и предполагает, что в одной из этих таблиц существует только одно поле «id», не более одного (что не имеет большого смысла) ... – sgeddes

+0

Будьте осторожны с попыткой запрос, поскольку это перекрестное соединение между всеми 16 таблицами, возвращающее декартово произведение каждого набора таблиц. Таким образом, только без предложения WHERE, общие записи являются результатом подсчета записей каждой таблицы (которые могут достигать миллионов): t1 X t2 X t3 ... – Parfait

+0

thanks Parfait, Mr sgeddes, эти 16 таблиц связаны с клиентом «id» как внешним ключом; Поэтому я хочу провести исследование в этих 16 таблицах, чтобы найти всю информацию, относящуюся к этому клиенту .... Как я могу сказать, что клиент имеет более одного результата в таблице, ........ .... Например, клиент является заказчиком, и у нас есть таблица, называемая командами, поэтому у заказчика может быть несколько команд в таблице команд. – Joseph

ответ

1

Ваш запрос не будет работать, потому что вы пытаетесь присоединиться к этим нескольким таблицам, тогда как то, что вы хотите сделать, это поиск (фильтрация) этих 16 таблиц.

Вы можете использовать union all, чтобы сделать это в одном запросе:

select xxx, 'table1' as source_table 
    from table1 
where id = ? 
union all 
select xxx, 'table2' as source_table 
    from table2 
where id = ? 

и так далее. Второе производное поле source_table может использоваться для определения того, какая таблица возвращает результат.

+0

Я не понимаю этого до сих пор, я имею в виду, что это за ххх, и я делаю это для 16 таблиц или что !!! .............. и как они будут представлены в наборе результатов ?? – Joseph

+0

@Joseph. Ваш первоначальный вопрос состоял в поиске идентификатора в 16 разных таблицах, но из ваших других комментариев, похоже, вы неправильно сформулировали его. У вас есть ** основной ** стол и 15 ** ребенок ** таблицы? И вы хотите найти запись в главной таблице и всю связанную с ней информацию из дочерних таблиц? – rohitvats

+0

Посмотрите, я подробно расскажу: У меня есть таблица клиента, содержащая идентификатор клиента, имя и фамилию, задание ..etc ... также у меня есть 16 таблиц грантов клиента, каждая таблица содержит разные данные (разные грант) связаны с клиентом внешним ключом «id» ....... Поэтому, когда я ищу клиента, я ищу также все гранты, которые им были выгодны, и, возможно, клиент может получить один и тот же грант более одного раза ........ это означает, что мы можем найти более одной строки в одной таблице, связанной с одним и тем же клиентом, проблема в том, как я могу получить всю информацию, связанную с этим клиентом? – Joseph

0

Вы должны указать все поля, используя псевдонимы для полей с одинаковым именем и префикс с именами таблиц.

Например:

query = "SELECT table1.id as id_1, table2.id as id_2, ... WHERE id_1 = 23" 

Вероятно, очень долго запроса писать, но у вас есть решение для создания и вставить его: Вы можете сделать это, например, с FlySpeed SqlQuery (бесплатно для личного пользования)

FlySpeed ​​SqlQuery будет генерировать все псевдонимы для вас и автоматически префикс с именами таблиц.

0

Немного разъяснений поможет. Если все 16 таблиц имеют одинаковые поля и вы хотите, чтобы они были в непрерывном списке, вы можете использовать UNION, как было предложено выше. С другой стороны, если есть только несколько полей, которые соответствуют, и вы хотите сравнить значения для каждой таблицы бок о бок, вы захотите использовать объединения и предоставить псевдонимы с именами таблиц, как это также было предложено выше.

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

tableList = ["table1", "table2"...] 
fieldnames = ["field1", "field2"...] 

query = "SELECT " 

for i = 0 to count(tableList): 
    for j = 0 to count(fieldnames): 
     query = query + tablelist[i] + "." + fieldnames[j] + ", " 
    j++ 
i++ 

query = query + "FROM " 

for i = 0 to count(tableList): 
    query = query + tableList[i] + ", " 
i++ 

query = query + "WHERE " ... 

и так далее. Большая часть этого зависит от того, что именно вы хотите сделать, как часто вы хотите это сделать и как часто переменные (например, таблицы или поля, которые вы используете) будут меняться.

+0

Моя настоящая проблема заключается не в том, как писать запрос, а в том, как получить данные из набора результатов и как узнать, какие данные из этой таблицы !!! .. спасибо – Joseph