2011-12-29 2 views
2

이것은 내 상황입니다.SQL 쿼리 - 테이블의 테이블

표 A

Name | Phone    
John 123 
Mick 233 

표 B

Department | Position   
IT   xxx 
HR   yyy 

그리고 다음 구성 테이블 웹을 통해 동적으로 생성됩니다 :

나는 예에 의해, 다른 테이블이 표 C

Source | Field 
TABLE A Name 
TABLE B Department 

응용 프로그램을 실행할 때 표 C를 읽고 데이터를 생성해야합니다. 이 경우 테이블 A의 모든 이름과 표 B의 모든 부서를 나열해야합니다.

어떻게 쿼리합니까? 누군가가 나를 도울 수 있기를 바랍니다.

건배! 당신은 표 C의 함량을 신뢰할 수없는 경우 내가 권하고 싶지 않다 - - 당신은 SQL에서이 작업을 수행해야하는 경우

+0

그래서 테이블 A의 이름과 테이블 B의 부서를 나열하도록 테이블 C를 작성하는 쿼리를 원하십니까? 이 부분을 올바르게 이해하면 표 A와 표 B를 관련 짓는 필드 (직원 ID 등)가 필요합니다. 이미 C라는 테이블이 있다면 이름과 부서가 모두 있으므로 문제는 이미 해결되었습니다. 맞습니까? 테이블 C에서 읽었다 고 말하면, 이미 만들어져있는 것처럼 보입니다. –

+0

StackOverflow에 오신 것을 환영합니다. 코드, XML 또는 데이터 샘플을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드 샘플"버튼 ('{}) '을 클릭하십시오. 구문 강조! –

+1

어떤 DBMS를 사용하십니까? SQL 서버, 오라클, MySQL ....? –

답변

0

당신은 그 SQL을 실행, SQL 쿼리가 포함 된 변수를 구성해야합니다 동적으로 쿼리합니다. 이렇게하는 방법은 전적으로 DBMS에 달려 있습니다.

SELECT @sql:=CONCAT("SELECT ",field," FROM ",source) FROM TABLE_C; 
PREPARE s1 FROM @sql; 
EXECUTE s1; 

SQL 서버 구문 : (표 C는 하나의 행이 있다고 가정)의 MySQL의 예는 표 C 확실히 행이 여러 개 것이기 때문에

DECLARE @sql nvarchar(max) 
SELECT @sql = "SELECT " + field + " FROM " + source FROM TABLE_C 
EXEC sp_executesql @sql 
GO 

당신은을 통해 반복해야합니다 표 C. 이것은 CURSOR로 수행 할 수 있으며 정확한 세부 사항은 DBMS에 따라 달라집니다.

중요한 점은 TABLE C가 웹에서 작성되었다고 명시하는 경우 매우 위험하다는 점입니다. FIELD 및 SOURCE 필드에는 무엇이 있는지 보장 할 수 없습니다. SQL 지식이 거의없는 사람은 SQL 인젝션 공격으로 채울 수 있습니다. 안전하게 매개 변수화 된 데이터베이스 메타 쿼리를 통해 TABLE C의 내용이 실제 테이블/열임을 안전하게 확인해야합니다.

+0

테이블 C는 웹을 통해 생성됩니다. 일단 만들어지면 그 테이블을 쿼리하고 정보를 얻어야합니다. 예를 들어, 표 C에 "TABLE A | Departments"가있는 경우 표 A의 모든 부서를 나열해야합니다. 문제는 표 A에 액세스하여 정보를 얻으려면 어떻게해야합니까? 왜냐하면 필드 야. 내가 무슨 뜻인지 알지? – Fabricio

+0

나는 당신이 의미하는 바를 이해하고 있다고 생각하며 그것이 나의 대답에 관한 것입니다. 이런 종류의 쿼리를 수행하는 유일한 방법은 dynamic-sql : query table C를 사용하여 실제로 실행하려는 쿼리를 포함하는 문자열을 만든 다음 EXECUTE 호출을 통해 해당 쿼리를 실행하는 것입니다. 모든 데이터베이스 서버가 아니라면 대부분이 이러한 종류의 요구 사항에 동적 SQL을 허용합니다. 그러나 이것은 테이블 C가 SQL 주입 공격을 포함 할 수 있기 때문에 위험하므로 동적 쿼리를 작성하기 전에 실제로 테이블 C의 내용이 실제 테이블/열인지 확인해야합니다. – philofinfinitejest

+0

SQL Server를 사용하고 있는데 할 수 없습니다. 동적 SQL은 나에게 새로운 것이고 혼란 스럽다. "FIELD"와 "SOURCE"를 선언해야합니까? 내가 어떻게 해? – Fabricio

-1
select ta.Name, tb.Department 
from TABLEA ta, TABLEB tb 
+0

StackOverflow에 오신 것을 환영합니다. 코드, XML 또는 데이터 샘플을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드 샘플"버튼 ('{})을 클릭하십시오. 구문 강조! –

+2

또한 : ** 항상 ** 적절한 ** ANSI JOIN 구문을 사용하는 것이 좋습니다 - SELECT ta.Name, tb.Department FROM dbo.TableA INNER JOIN dbo.TableB tb ON .......'(또는 적절한 경우 다른 JOIN을 사용하십시오.) - 쉼표로 구분 된 테이블을 나열하지 마십시오. 위험합니다. 여기서와 같은 데카르트 제품을 실제로 원하거나 WHOERE에서 JOIN 조건을 잊어 버린 경우에는 명확하지 않습니다. ... 그냥 지저분한 –