2011-11-17 2 views
8

나는 그것도 위장하는 경우 궁금하네요.MYSQL 열 데이터 및 테이블 이름을 기반으로 테이블을 가입하십시오

테이블 1의 데이터를 기반으로 2 개의 테이블을 결합하고 싶습니다. 예제 테이블 1에는 "핫도그"라는 데이터가있는 열 요리가 있습니다.

그리고 나는 핫도그라는 테이블을 가지고 있습니다.

JOIN처럼 할 수 있습니다.

SELECT * FROM table1 t join t.food on id = foodid 

나는 작품은 arround에있다, 그것은하지만 작품을 나던 그도 추적 할 수없는 가망을 알아?

미리 감사드립니다.

+1

이것은 디자인 문제가 더 많은 것처럼 보입니다. 런타임까지 조인을 모르는 경우 어떻게 참조 무결성을 적용 할 수 있습니까? – tomfumb

답변

9

아니, 당신은 심지어 동적 SQL로, table1에 행마다 다른 테이블에 가입 할 수 없습니다.

당신은 음식이 '핫도그'는 행에 대한 hotdog 테이블에 가입하고 음식의 다른 특정 값을 다른 테이블에 가입 할 수있다.

SELECT * FROM table1 JOIN hotdog ON id = foodid WHERE food = 'hotdog' 
UNION 
SELECT * FROM table1 JOIN apples ON id = foodid WHERE food = 'apples' 
UNION 
SELECT * FROM table1 JOIN soups ON id = foodid WHERE food = 'soup' 
UNION 
... 

은 음식의 모든 고유 값을 알고 있어야하고, 모든 각각의 음식 테이블은 할 수 있습니다 UNION 그 때문에 서로 호환 열이 있는지 확인하십시오.

당신이 다형성 협회라고하고 있어요. 즉, table1의 외래 키는 table1의 다른 열의 값에 따라 여러 "상위"테이블의 행을 참조합니다. 이것은 관계형 데이터베이스 프로그래머의 일반적인 설계 실수입니다.

다른 솔루션에 대한

, 내 대답을 참조하십시오

나는 또한 나의 프리젠 테이션 Practical Object Oriented Models In SQL에서 다형성 협회를위한 솔루션을 포함하고, 내 책 SQL Antipatterns: Avoiding the Pitfalls of Database Programming있다.

0

동적 SQL에서만 사용됩니다. 또한 여러 테이블을 조인하고 유형에 따라 CASE를 사용할 수도 있지만 테이블은 모두 미리 알려야합니다.

우리는 당신이 달성하려고하는 일에 대해 자세한 내용을 알고 있다면 적절한 디자인을 추천 쉬울 것, 어떤 당신의 디자인은 현재처럼 보이는 이유는 당신이 선택한 그 첫 번째 장소에서 특정 테이블 디자인.

Say you have a table of foods: 

id INT 
foodtype VARCHAR(50) (right now it just contains 'hotdog' or 'hamburger') 
name VARCHAR(50) 

Then hotdogs: 

id INT 
length INT 
width INT 

Then hamburgers: 

id INT 
radius INT 
thickness INT 

은 일반적으로 내가 존재하는 단 하나의 보조 테이블을 제약하기위한 몇 가지 시스템을 추천 할 것입니다 단순하지만, 나는 그것을 밖으로 떠날거야.

SELECT f.*, hd.length, hd.width, hb.radius, hb.thickness 
FROM foods f 
LEFT JOIN hotdogs hd 
    ON hd.id = f.id 
    AND f.foodtype = 'hotdog' 
LEFT JOIN hamburgers hb 
    ON hb.id = f.id 
    AND f.foodtype = 'hamburger' 

이제 그런 일이 코드가 생성 될 수 있음을 볼 수 있습니다 (또는 심지어 즉석에서 매우 느린 프로토 타입 동적 SQL) 테이블 이름과 테이블 메타 데이터에 대한 액세스에 대한 SELECT DISTINCT foodtype FROM foods 주어진 특정 가정에서.

문제는 소비 궁극적으로 누구든지이 쿼리의 결과가 새로운 테이블이 추가 될 때마다 보여주는 새로운 열의 알고 있어야한다는 것입니다.

그래서 질문이 고객/고객의 소비자에게 돌아갑니다. 어떻게 다른 유형을 처리 할 것입니까? 서로 다른 유형이 같은 집합에 속한다는 것은 무엇을 의미합니까? 그리고 서로 다른 유형을 인식해야하는 경우 각 유형에 대해 서로 다른 쿼리를 작성하거나 새로운 유형이 추가 될 때 수동 쿼리를 변경하는 단점은 무엇입니까? @Cade 루에서 알 수 있듯이

+0

재생을위한 Thnks .... 나는 그것을 구현하기 위해 뜨거운 조합 모르겠다 고 생각합니다. 이렇게 세부 사항을 heres. 학생은 일부 tipe 편지에서 "request"테이블을 요청하고 학생의 데이터와 "letter type"이 저장됩니다. Theres는 "편지 유형"을위한 10 가지 다른 가능한 값입니다. 그래서 그래서 나는 특정 테이블을, 학생의 편지를 바탕으로 한 쿼리의 모든 선택을 할 수 호출 할 수있는 방법을 원하고, 같은 .. 테이블 권고가, 표 전송, 특정 문자 유형 이름 10 개 테이블이 그것으로부터 데이터를 얻는다. – user1052347

+0

@ user1052347 Bill Karwin은 디자인에 대한 여러 링크를 제공합니다. 궁극적으로 각 유형의 관련 데이터가 다르므로 실제 "SELECT *"는 작동하지 않을 것입니다. 각 테이블의 보조 정보가 다르기 때문입니다. 결과 세트를 원하는대로 결정해야합니다. 이 시점에서 손으로 코드를 작성하거나 코드 생성/동적 SQL을 코드화하여 스키마 변경과 관련된 유지 관리 문제를 다소 제거 할 수 있습니다. 나는 내 대답에 모범을 보일 것이다. –

관련 문제