2013-02-26 6 views
0

에 따라 뷰를 만들어 다음 필드가있는 테이블이라는 성분을 가지고 :세 가지 다른 테이블

성분 - IngredientID (PK), ManufacturerID (FK), 카테고리 ID (FK), BarcodeID (FK) , SizeID (FK), 품질.

이 테이블의 작동 방식은 다음과 같습니다. 각 재료는 제조업체, 범주 또는 바코드 중 하나를 기준으로합니다 (). 하나는 항상입니다. 따라서 레코드에 ManufacturerID가 있으면 CategoryID와 BarcodeID가 모두 null이되며 반대의 경우도 마찬가지입니다.

내 데이터베이스에있는 세 개의 다른 테이블이 있습니다

제조사 - ManufacturerID (PK), 이름

카테고리 - 카테고리 ID (PK), 이름

바코드 - BarcodeID (PK), 이름

다음과 같은보기가 필요합니다.

보기 - 는 viewId는 PK 될 것이다는 viewId (PK), IngredientID (FK), 이름, SizeID, 품질

, IngredientID는 성분 기록에 FK 될 것입니다, 이름 세 개의 필드 된 성분 테이블에 값을했다 기반 제조업체, 카테고리, 또는 바코드 테이블 중 하나에서 나오는 이름 필드 것, 및 SizeID품질은 성분 표에서 직접 가져옵니다.

SQL에 대한 지식이 매우 제한되어 있으므로 어떤 안내라도 감사하겠습니다. 문제에 대한 내 설명에 중요한 정보가 부족한지 알려주십시오.

편집 : 유용한보기 인 FK IngredientID를 포함하도록보기를 업데이트했습니다. 이 같은

+0

나는 당신이보기에 PK를 만들 수 있다고 생각, 및 기타에 대한하지 않습니다 데이터는 [JOINS 튜토리얼 (http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins)을 통해 쿼리를 작성하려고합니다. –

답변

2

뭔가가 CASE 문을 사용하여 작동합니다 :

SELECT I.IngredientID, 
    CASE 
     WHEN I.ManufacturerID IS NOT NULL THEN M.Name 
     WHEN I.CategoryID IS NOT NULL THEN C.Name 
     WHEN I.BarcodeID IS NOT NULL THEN B.Name 
    END Name, 
    I.SizeID, 
    I.Quality 
FROM Ingredients I 
    LEFT JOIN Manufacturers M ON I.ManufacturerId = M.ManufacturerId 
    LEFT JOIN Categories C ON I.CategoryID = C.CategoryID 
    LEFT JOIN Barcodes B ON I.BarcodeID = B.BarcodeID 

이 당신의 기본 키로 IngredientId를 사용합니다 - 나는 당신이 원하는 가정 것입니다. 다른 기본 키가 필요하지 않습니다. 당신은 정말 그냥 증분 이드 싶은 경우에, ROW_NUMBER를 사용 -하지만 난 왜이 필요하다 표시되지 않습니다 :

SELECT ROW_NUMBER() OVER (ORDER BY I.IngredientID), ... 
+0

훌륭한 작품입니다. 나는 당신이 SQL에서 CASE를 할 수 있다는 것을 몰랐다. 그리고 이것은 내가 생각했던 훨씬 간단한 해결책이다. 감사! – Antrim

+0

@ etc2702 - 문제 없습니다. 도움이 되니 기쁩니다! ISNULL 또는 COALESCE를 사용하는 다른 방법이 있지만 이해하기가 가장 쉽습니다. 행운을 빌어 요. – sgeddes

+0

Coalesce가 빠를 수도 있습니다. CASE를 "COALESCE (M.Name, C.Name, B.Name")로 바꿉니다. –

1
select 
    i.IngredientID as ViewID, 
    isnull(m.Name, isnull(c.Name, isnull(b.Name, ''))) as Name 
    i.SizeID, 
    i.Quality 
from Ingredients i 
    left join Manufacturers m on i.ManufacturerID = m.ManufacturerID 
    left join Categories c on i.CategoryID = c.CategoryID 
    left join Barcodes b on i.BarcodeID = b.BarcodeID 
관련 문제