2016-08-27 2 views
0

16 가지 테이블을 검색하고 싶지만 "DB에서 선택"을 16 번 반복하고 싶지는 않습니다. 나는 이것이 성과에 도움이되지 않는다고 생각한다 !!!여러 테이블에서 데이터를 선택하는 방법을 구분하는 방법은 무엇입니까?

내가 사용하고 :

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

그것은 정확 ?? 내 문제는 어떻게 테이블의 데이터를 구분하는 것입니다 ??

어쩌면 나는 하나의 테이블에서 하나 이상의 "id"에 대한 두 개 이상의 결과를 얻을 수 있습니다. 그래서 어떤 데이터가 어떤 테이블에 있는지 알고 싶습니다 !! . 감사합니다.

+0

샘플 데이터와 예상 결과를 사용하여 테이블 구조를 게시해야합니다. 마찬가지로 대답하거나 이해하기가 어렵습니다. 귀하의 질의는 결과의 '데카르트 곱 (cartesian product)'을 생성하고 하나의'id' 필드가 그 테이블 중 하나에 있다고 가정합니다. 하나 이상의 (많은 의미를 갖지는 않을 것입니다) ... – sgeddes

+0

시도에주의하십시오 쿼리는 모든 16 개의 테이블 간 교차 조인이므로 각 테이블 세트의 카디 전 곱을 반환합니다. 따라서 WHERE 절이 없으면 총 레코드는 각 테이블의 레코드 수 (수백만에 도달 할 수 있음)의 결과입니다. t1 X t2 X t3 ... – Parfait

+0

감사합니다. Parfait, Mr sgeddes,이 16 개의 테이블은 "id"로 외래 키로 클라이언트와 관련되어 있습니다. 그래서이 16 개의 테이블을 조사하여 클라이언트와 관련된 모든 정보를 찾으려고합니다. 클라이언트가 테이블에 두 개 이상의 결과를 가지고있는 것 같아서 ........ .... 예를 들어 클라이언트는 costumer이고 우리는 commands라는 테이블을 가지고 있으므로 costumer는 명령 테이블에 둘 이상의 명령을 가지고 있습니다. – 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

나는 그것을 이해하지 못한다. xxx는 무엇이고 x16 테이블은 무엇을 의미 하는가? !!!! ... 그리고 결과 세트에 어떻게 나타날 것인가? ?? – Joseph

+0

@Joseph 귀하의 원래 질문은 16 개의 다른 테이블에서 ID를 검색하는 것이었지만 다른 의견에서는 틀린 것으로 표현했습니다. ** 메인 ** 테이블과 15 ** 아이 ** 테이블이 있습니까? 메인 테이블의 레코드와 하위 테이블의 모든 관련 정보를 찾고 싶습니까? – rohitvats

+0

자세히 설명해 드리겠습니다. 클라이언트 테이블에 클라이언트 ID, 이름 및 성이 포함되어 있습니다 ... 또한 각 테이블에 다른 데이터가 들어있는 클라이언트 부여 테이블이 16 개 있습니다 (다른 grant)는 "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

관련 문제