2013-03-11 8 views
1
+------------------+  +------------------+  
| object   |  | example   | 
+------------------+  +------------------+  
| id    |  | id    |  
| table_name  |  | ...    |  
| ref_id   |  |     |  
+------------------+  +------------------+  

object [ id = 5, table_name = example, ref_id = 2] 
example [ id = 2 ] 

여러 테이블에서 비롯된 개체 그룹을 나타낼 수있는 테이블이 있습니다. 이 개체는 모두 id이며 object.ref_id으로 참조됩니다.알 수없는 열의 SQL 파생 테이블 결과

object.table_name이 참조하는 테이블의 원본 개체를 object.id으로 선택하려고합니다. 이를 위해 다음 SQL 쿼리를 사용하려고합니다. 이 결과는 #1054 - Unknown column 'entity.id' in 'where clause'입니다.

SELECT * 
FROM (
     SELECT table_name 
     FROM object 
     WHERE id = 5) AS entity 
WHERE entity.id = (
     SELECT ref_id 
     FROM object 
     WHERE id = 5) 

내가 뭘 잘못하고 있니?

CASE 예

SELECT * 
FROM example 
WHERE id = (
    SELECT ref_id 
    FROM object 
    WHERE id = 5) 

이 값은 일반적 object.table_name로부터 유도되기 때문에 FROM 절 상기 예에서와 같이 용이하지 않다 제 경우 들면 않는다. 시험을 위해서 에러의 Tombom 결과의 용액을 사용 TOMBOM의 접근

, WITH

UPDATE는 I는 CONCAT 함수의 변수로 대체 하였다.

SET @sql = CONCAT('SELECT * FROM ', 'example', ' WHERE id = ', '1'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

#1243 - Unknown prepared statement handler (stmt) given to EXECUTE

답변

2

당신은 (하위) 쿼리의 결과가 테이블 이름이 방법이라고 MySQL을 말할 수 없습니다. 결과를 사용하여 동적 문을 작성해야합니다.

SELECT @tableName:=table_name, @refId:=ref_id FROM object WHERE id = 5 LIMIT 1; 

SET @sql = CONCAT('SELECT * FROM ', @tableName, ' WHERE id = ', @refId); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

UPDATE :

DELIMITER $$ 
CREATE PROCEDURE procName(IN my_id INT) 
BEGIN 
SELECT @tableName:=table_name, @refId:=ref_id FROM object WHERE id = my_id LIMIT 1; 

SET @sql = CONCAT('SELECT * FROM ', @tableName, ' WHERE id = ', @refId); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END $$ 
DELIMITER ; 

그런 다음

CALL procName(5); 
+0

그래서 의견이 있으십니까? 당신이 찾고있는 것이 아닌가요? – fancyPants

+0

몇 가지 문제가 있습니다. 질문에 업데이트를 올릴 것입니다. 왜냐하면이 코멘트 안에는 읽을 수 없기 때문입니다. – Aquillo

+0

귀하의 솔루션이 MySQL 설명서에 따라 유효하다고 보일지라도. 나는 내 오류의 원인을 모르겠습니다. – Aquillo

1

내가 최근에 정확히 같은 문제가 발생했습니다와 저장 프로 시저를 실행 : 저장 프로 시저와 시도를하시기 바랍니다. 마지막 줄을 지울 때 DEALLOCATE PREPARE stmt; 모든 작업이 시작되었습니다.