2012-02-20 3 views
0

У меня есть таблица отчета, который похож на этотЗапросы Mysql?

reports 
inspection_type | inspection_number 
berries   | 111 
citrus   | 222 
grapes   | 333 

inspection_type в моем случае это имя другой таблицы Я хотел бы, чтобы SELECT * откуда inspection_number равна report_key на , что связанной таблицы.

{fruit} 
row  | report_key | etc.... 
value | 111  | value 
value | 222  | value 

Этот вопрос я не знаю, как запросить inspection_type, чтобы получить имя таблицы для запроса значения. Имеет ли это смысл?

Я попытался это здесь, но даже я знаю, что это явно ошибочным:

SELECT inpection_type, inspection_number 
FROM reports rpt 
ON rpt.inspection_number = report_key 
(SELECT * FROM inspection_type WHERE status < '2') 
WHERE rpt.status < '2' 
ORDER BY rpt.inspection_number DESC 

Может ли SQL гуру сказать мне, что лучший способ сделать это?

+5

Я думаю, что у вас есть наткнулся на причину, почему эта архитектура БД - плохая идея. – JohnFx

+0

Я полностью согласен. – ehime

ответ

1

Поскольку в TSQL невозможно иметь переменную для имени таблицы, вам придется динамически строить TSQL.

Variable table names in Stored Procedures

+0

http://stackoverflow.com/questions/1325044/dynamic-sql-passing-table-name-as-parameter –

+0

http://stackoverflow.com/questions/3646412/mysql-query-using-variable-as-table -name-in-left-join –

+0

http://stackoverflow.com/questions/2754423/use-a-variable-for-table-name-in-mysql-sproc –

1

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

// Comes in where your existing `reports` table is 
inspections (
    inspection_id INT UNSIGNED NOT NULL AI, 
    inspection_type_id INT UNSIGNED NOT NULL (links to inspection_types.inspection_type_id) 
    .... other rows .... 
) 

// New table to normalise the inspection types 
inspection_types (
    inspection_type_id INT UNSIGNED NOT NULL AI, 
    type_name VARCHAR NOT NULL 
    .... other rows .... 
) 

// Normalised table to replace each {fruit} table 
inspection_data (
    inspection_data_id INT UNSIGNED NOT NULL AI, 
    inspection_id INT UNSIGNED NOT NULL (links to inspections.inspection_id) 
    .... other rows .... 
) 

Тогда ваш запрос будет просто

SELECT * 
FROM inspections 

INNER JOIN inspection_types 
ON inspection_types.inspection_type_id = inspections.inspection_type_id 

INNER JOIN inspection_data 
ON inspection_data.inspection_id = inspections.inspection_id 

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