2013-01-10 7 views
0

I가 다음과 같은 데이터베이스 구조 :두 테이블을 결합하는 방법은 무엇입니까?

`Products` 
------------------------------------- 
ID | ProductNo 
------------------------------------- 
1 | 3340 
2 | 3450 


`ProductVariants` 
------------------------------------- 
ID | MasterID (ref to `Products`.`ID`) | ProductNo 
------------------------------------- 
1 | 1 | 3341 
2 | 1 | 3342 
3 | 2 | 3451 

어떻게이 제품을 얻고 자신의 제품이 하나 개의 쿼리 변종합니까?

편집 :

원하는 결과 :

MasterID | IsMaster | ProductNo | VariantProductNo 
1 | 1 | 3340 | null 
1 | 0 | 3340 | 3341 
1 | 0 | 3340 | 3342 
2 | 1 | 3450 | null 
2 | 0 | 3450 | 3451 

답변

1

이 그것이

SELECT * 
FROM Products 
INNER JOIN ProductVariants 
ON Products.ID = ProductVariants.MasterID 

일반적으로 효율성을 단일 쿼리를 수행 할 것 (당신에 대한 쿼리를 가질 수 제품 테이블, 루프의 결과를 라운드하고 각각에 대해 ProductVariants 테이블에 대한 쿼리를 수행하지만 느린 개가됩니다).

당신 수 당신이이 같은

SELECT Products.MasterID, 1 AS IsMaster, Products.ProductNo, NULL AS VariantProductNo 
FROM Products 
UNION 
SELECT Products.MasterID, 0 AS IsMaster, Products.ProductNo, ProductVariants.VariantProductNo 
FROM Products 
INNER JOIN ProductVariants 
ON Products.ID = ProductVariants.MasterID 
ORDER BY MasterID, IsMaster DESC, ProductNo 
+0

이것은 할 것이다 !! 이것은 좋은 방법입니까 아니면 실행 쿼리의 속도를 늦출 수 있습니까? – frgtv10

+0

나는 그것을하는 더 효율적인 방법을 생각할 수 없다 (누군가는 방법을 알고 있을지도 모른다). UNION이 아닌 UNION ALL을 사용하면보다 효율적으로 만들 수 있습니다 (일반 UNION은 중복 된 항목을 제거하므로 약간의 추가 처리가 필요하지만이 경우에는 IsMaster 필드로 인해 중복이 없어야 함). 또한 VariantProductNo는 고유합니다 (제품 변형에서 ID를 가져 오지 않는 경우와 쿼리의 첫 번째 부분에서 일치하는 null 필드). – Kickstart

3

당신은에있는 두 개의 테이블을 조인하기를 원할 것입니다 그들의 Id = MasterId :

select * 
from products p 
left join ProductVariants v 
    on p.id = v.Masterid 

SQL Fiddle with Demo

LEFT JOIN 모든 반환집니다 productsProductVariants 테이블에 해당 레코드가 없습니다.

INNER JOIN은 두 테이블에 나타나는 레코드를 반환합니다.

다음은 결합 구문을 학습하는 데 유용한 visual explanation of joins입니다. 당신이 가입 이상의 테이블이있는 경우

, 다음 사용할 것 :

select * 
from products p 
left join ProductVariants v 
    on p.id = v.Masterid 
left join MasterArtikel m 
    on v.MasterId = m.MasterId -- you place the columns that join the tables here 
+0

(그래서 테스트되지는 오타를 용서) 업데이트 된 요구 사항을 이동하려면 거기있는 제품 어떤 변종

를 원하는 경우 LEFT OUTER 대신 조인을 사용 당신의 도움을 주셔서 감사합니다. 그러나 지금 내가 이것을 계산한다면, MasterArtikel이 없기 때문에 하나를 추가해야합니다. 그렇게하는 방법? – frgtv10

+0

@ frgtv10 제 편집을 참조하십시오. 그러면 다른 조인을 추가하고 테이블을 조인하는 열 이름을 포함하게됩니다. – Taryn

+0

아마도 당신을 오해했을 지 모르지만, 나는'Product'에 대한 결과 행을 그리고 나서 각'ProductVariant'에 ​​대한 결과 행을 원합니다. – frgtv10

관련 문제