문제

황:PHP 응용 프로그램을 여러 개 설치할 수 있는 모듈 만들 새로운 테이블에서 데이터베이스에 대한 각각의 스타일에 mod_A,mod_B,mod_C etc.각각은 열 section_id.

지금,내가 찾는 모든 항목에 대한 특정 section_id,그리고 나라는 다른 방식이 있습니다 게다가"Select*from mod_a,mod_b,mod_c...mod_xyzzy 는 section_id=value"...또는 더 나쁜 사용하여 별도에 대한 쿼리를 각 모듈에 있습니다.

도움이 되었습니까?

해결책

면 테이블이 변화하는 시간이,당신이 할 수 있는 인라인 gen 코드 솔루션에 SP(의사의 코드를 작성해야에서):

SET @sql = ''

DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM sys.tables t
WHERE t.[name] LIKE 'SOME_PATTERN_TO_IDENTIFY_THE_TABLES'

--나이

DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM TABLE_OF_TABLES_TO_SEACRH t

START LOOP

IF @sql <> '' SET @sql = @sql + 'UNION ALL '
SET @sql = 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '

END LOOP

EXEC(@sql)

이 기술을 사용한 때,가끔 다만 어떤 확실한 방법을 만들의 미래-증거 없는 dynamic SQL.

참고:루프에서 사용할 수 있는 유착/NULL 전파가 속을 떠나 문자열이 NULL 이 전에 반복지만,그것을 명확하지는 않지만에 익숙하지 않은 경우 관용구:

SET @sql = COALESCE(@sql + ' UNION ALL ', '')
    + 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '

다른 팁

에 대해 무엇을?

SELECT * FROM mod_a WHERE section_id=value
UNION ALL
SELECT * FROM mod_b WHERE section_id=value
UNION ALL
SELECT * FROM mod_c WHERE section_id=value

나는 두 가지 제안을 합니다.

  1. 아마도 결합할 필요가 있는 귀하의 모든 테이블이 있습니다.는 경우 그들은 모든 포함하는 동일한 구조,그 이유가 없는 한"master"모듈은 테이블을 추가하는 하나의 새로운 열을 식별 모듈("A","B","C",....)

    하는 경우 모듈은 테이블은 대체로 동일하지만,당신은 몇 가지는 열을 다할 수 있습을 통합 할 수있는 모든 일반적인 정보를 하나의 테이블,그리고 계속 작은 특정 모듈의 테이블과 그 차이점이 있습니다.다음 당신이해야 할 가입니다.

    이 제안서는 쿼리에서 열 section_id 당신이 언급은 매우 중요한 보는 지점에 위치하고 있습니다.한 쿼리 당신은 모든 일반적인 정보,그리고 두번째 것을 얻을 어떤 특정 정보를 당신이 그것을 필요로했다.(과되지 않을 수도 있습--예를 들어 당신이 노력하고 확인 existense 의 섹션에서 다음 그것을 찾는 것이 일반적 테이블에 충분한 것입)

  2. 또는 당신은 다른 추가할 수 있는 테이블도 section_id 의하는 모듈들이 있습니다.

    section_id | module
    -----------+-------
          1    |  A
          2    |  B
          3    |  A
         ...   | ...
    

    이것이 의미하지만 실행해야하는 두 쿼리를,하나에 대하여 이 매핑 테이블과에 대하여 다른 모듈은 테이블을 꺼내는 유용한 데이터이다.

    을 확장할 수 있습니다 이 테이블과 기타 열 및 인덱스에서 열 볼 필요가 있는 경우 다른 열에 있는 모든 일반적인 모듈이 있습니다.

    이 방법은 명확한 disadvanage 는 데이터 중복됩니다.

아마도 몇 가지 추가 정보 도움이 될 것이지만,그것은 소리처럼 당신은 해결책이 있습니다.당신이 선택해야에서 모든 테이블을 가진 section_id.수용인 대한 테이블에 목록에 가입 section_id.예를 들어

select a.some_field, b.some_field.... 
from mod_a a
inner join mod_b b on a.section_id = b.section_id
...
where a.section_id = <parameter>

또한 패키지 수 있습니다 이것으로 보기입니다.또한 통지 분야 목록에 대신*을 권하고 싶다면 당신이 의도를 실제로 사용하는*.

있다,잘만 이렇게 많은 방법에서 정보를 집계 여러 테이블이 있습니다.에 가입할 수 있습니다처럼 당신에 언급된 예제,또는 실행할 수 있습니다 여러 쿼리 유니언대로 그들을 함께서 borjab 의 대답이다.내가 알지 못하는 경우 몇 가지 아이디어 테이블을 작성하는 모든 교차하는 모듈은 테이블을 것 당신에게 유용하지만,경우 section_id 에는 테이블처럼 당신이 하는 것 모든 것을 얻을 수 있에서 하나의 쿼리가 있습니다.그렇지 않으면 나에 의하여 박수 갈채의 게으름,하지만 두려워 말고,내가 보이지 않는 어떤 방법을 확인하는 작업 eaiser:)

내가 가고 있었을 제안하는 것이 같은 생각으로 borjab.만 문제는 당신 업데이트해야 합니다 모든 이러한 쿼리를 추가하는 경우입니다.다른 옵션 보기 저장한 절차입니다.

나는 생각하의 또 다른 옵션은 여기에,또는 적어도하는 쉬운 방법은 존재이다.을 사용할 수도 있습 보기를 이는 여러 테이블을 만들로 나타나 중 하나,그리고 그 쿼리에는 것 보면 청소기,쉽게 이해하고 당신은 없을 것을 다시 오랜 동맹 쿼리할 때는 하고 싶었던 다른 쿼리에는 이러한 여러 테이블이 있습니다.

SELECT * FROM (
    SELECT * FROM table1
    UNION ALL
    SELECT * FROM table2
    UNION ALL
    SELECT * FROM table3
) subQry
WHERE field=value

옵션에서 데이터베이스 측면 뷰를 만들의 연합의 모든 다양한 테이블이 있습니다.면 테이블을 추가,당신은 필요한 추가하기만,그렇지 않으면 보이는 것이 다음과 같습니다.

CREATE VIEW modules AS (
    SELECT * FROM mod_A
    UNION ALL 
    SELECT * FROM mod_B
    UNION ALL 
    SELECT * FROM mod_C
);

select * from modules where section_id=value;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top