2014-03-05 2 views
0

에 여러 열을 결합하는 간단한 방법 :다음과 같이 내가 두 테이블을 하나의 룩업 테이블

TablePC 

+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| PCID | Option1 | Option2 | Option3 | Option4 | Option5 | Option6 | Option7 | Option8 | Option9 | 
+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| 1 | JM2  | JM3  | JM4  | JM5  |   |   |   |   |   | 
+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 

하고 대신

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON c.Option1 = o.Code 
OR c.Option2 = o.Code 
OR c.Option2 = o.Code 
OR c.Option3 = o.Code 
OR c.Option4 = o.Code 
OR c.Option5 = o.Code 
OR c.Option6 = o.Code 
OR c.Option7 = o.Code 
WHERE c.PCID = 1 

인가 같은 것을 쓰는

Options 

+----------+---------------+----------------+ 
| OptionID | Description | ExtendedDetail | 
+----------+---------------+----------------+ 
| JM2  | Graphics Card | ATI X1950XT | 
+----------+---------------+----------------+ 

을 거기에 이것을 작성하는 더 깔끔하고 단순한 방법이 있거나 이것이 받아 들일 수 있습니까? 12 개의 옵션 필드가 있습니다.

p.s. 다른 질문에서 보았 듯이 SQL 테이블/결과의 형식을 지정하는 방법은 무엇입니까? 코드를 작성하고 들여 쓰기해야했습니다.

감사

+1

1. 데이터를 정상화. 및 p.s. - 그거야! 나는 그런 종류의 것을 아주 쉽게 만드는 텍스트 편집기를 사용한다. – Strawberry

+0

@Strawberry 나는 동의 할 의향이 있지만 지금 프로젝트는 정규화 될 위치에 있지 않습니다. - 들어가기 전에 텍스트 편집기에서 텍스트 또는 들여 쓰기를하기 전에? – DarkShadowAY

+0

"깨끗하고 간단한 방법"에 대한 대답은 "UNION"또는 "NO"입니다. 골라보세요 ;-) – Strawberry

답변

1

음 정상화, 당신은 단순히 IN를 사용하여이 작업을 정돈 수 :

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON o.Code IN (c.Option1, c.Option2, c.Option3, c.Option3, c.Option4, c.Option5, c.Option6, c.Option7, c.Option8) 
WHERE c.PCID = 1; 

또한 하위 쿼리는 중복 성과를 저해 할 것입니다.

SELECT * 
FROM T 
WHERE T.ID = 1; 

SELECT * 
FROM (SELECT * FROM T) T 
WHERE T.ID = 1; 

당신은 하나 개의 행을 선택, 임시 테이블에 T의 전체 내용을 넣어 : 간단한 예에서, 그래서 MySQL은, 실행의 시작에 임시 테이블에 하위 쿼리 (파생 테이블)의 결과를 넣어 것입니다 그것을 통해서. this SQL Fiddle에서 쿼리 계획을 확인하면 두 번째 쿼리가 ID의 기본 키 인덱스를 사용하여 필터를 수행 할 수 없다는 것을 알 수 있습니다.

같은 쿼리가 더 좋아해야로서 :

SELECT Code, Description 
FROM TablePC c 
    JOIN Options o 
     ON o.Code IN (c.Option1, c.Option2, c.Option3, c.Option3, c.Option4, c.Option5, c.Option6, c.Option7, c.Option8) 
WHERE c.PCID = 1; 
0

당신은 또한 '에서'사용할 수 있습니다

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON o.Code in (c.Option1,c.Option2,c.Option3,c.Option4,c.Option5,c.Option6,c.Option7) 
WHERE c.PCID = 1 
관련 문제