2011-10-04 9 views
1

이것은 내 문제입니다. 이름이 매개 변수화 된 테이블의 행을 확인하고 싶습니다. table_X과 같습니다. X 값은 다른 테이블에서옵니다. 예를 들어 주 테이블의 경우 c_id 열과 X 열이 있습니다. 조인 할 테이블의 이름은 table_X입니다. 의심 할 여지없이 존재하며, 같은 열 c_id을가집니다. 이 테이블에 c_id의 값이 있는지 확인하기 위해 합류한다.매개 변수화 된 테이블 이름

  1. 뷰에 매개 변수화 된 테이블 이름을 넣을 수 없기 때문에 뷰를 시도했지만 성공하지 못했습니다. 절과 다른 것들을 어디에서 매개 변수화 할 수는 있지만 테이블 이름은 없습니다.

  2. 내가

    SET @q = CONCAT('select blabla from table_', X); 
    PREPARE stmt FROM @q; 
    EXECUTE stmt; 
    

    하지만 절차는 반환하지 수있는 값으로, 절차를 시도했습니다, 나는 매개 변수가있는 테이블의 c_id 값이 있는지 알 필요가 있기 때문에 내가 필요

  3. , 다른 그것은 쓸모가 없다.

  4. 내가 함수,하지만 시도했습니다

    은 "동적 SQL이 저장 기능 또는 트리거에서 허용되지 않습니다"

그래서이 데이터를 추출하기 위해 무엇을 할 수 있는가? 이 뷰/함수/무엇이든 PHP에서 호출하고, 나는 PHP 쪽에서 두 가지 쿼리를 통해 할 수 있음을 알고 있지만, 향후 구현을 위해 db 쪽에서해야 할 필요가 있습니다. 가능합니까?

참고 : DB의 구조를 수정할 수 없습니다. btw, Limesurvey db, 미친 db 구조처럼 들리는군요?

+0

이러한 종속성을 제거하려면 데이터베이스를 리팩토링해야하는 것 같습니다. – eykanal

답변

2

유일한 방법처럼 뭔가에 쿼리를 줄일 것

, 모든 조합에 하드 코딩하고 당신이 원하는 하나를 선택하십시오. 테이블 이름이 저장 프로 시저에 대한 매개 변수 인 경우


,이 블록 경우에 할 수있다. 그러나 그것은 clunky 느낀다.


각 테이블의 필드를 함께 할 수 있습니다 조합 테이블 동일하며 분야가 다른 경우 ... 그에서

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, * FROM Table1 
UNION SELECT 'Table2' AS tableName, * FROM Table2 
UNION SELECT 'Table3' AS tableName, * FROM Table3 
-- etc 

SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1' 


을 선택하는 경우 각 테이블, 당신은 필드의 하위 집합에만 관심이있을 수 있습니다 ...

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1 
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2 
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3 
-- etc 


또는 원본 테이블에없는 필드의 경우 NULL을 전달할 수 있습니다.

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, NULL AS field1, field2 AS field2 FROM Table1 
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2 
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL AS field2 FROM Table3 
-- etc 
+0

+1. 나를 이길 ... –

+1

불행히도 테이블 이름도 동적이므로 하드 코딩 할 수는 없지만 새 테이블이 만들어지면 (실제로 내가 만들 때), 언제든지 알 수 있습니다. 당신이 제안한 UNION을 수행 할 뷰를 동적으로 삭제하고 다시 만듭니다. – Dippi

1

왜 이와 같이 별도의 테이블이 필요합니까? 그것은 일반적으로 나쁜 디자인의 신호입니다. 그 레코드가 속해있는 X 값에 대한 식별자 필드가있는 단일 테이블을 만드는 것이 더 쉽지 않을까요? 조인 할 수 있습니까/필터링 할 수 있습니까? 동적 쿼리를 구축하지 않고,

SELECT ... 
FROM othertable 
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName 
+0

예, 알았습니다. 처음봤을 때 가장 먼저 생각한 것이지만 DB를 선정하지 않았기 때문에 조만간 그 진부한 디자인으로 인해 문제가 생길 수 있음을 알았습니다. ... ( – Dippi

관련 문제