2017-12-16 12 views
0

User 테이블에서 UserType, UserID, FirstName, LastName, UserName을 선택하려고합니다. 사진 테이블에서 PhotoURL을 사용할 수 있으면 선택합니다. 레코드가 존재하지 않으면 (UserType - 관리자는 사진 테이블에 레코드 만 있음) 공백을 보내야합니다.Select 문에 선택 값을 입력하는 사례가 있음 - SQL Server

쿼리는 다음과 같습니다. 더 나은 쿼리를 생각한다면 제안하십시오.

Select UserType, UserID, FirstName, LastName, UserName, 
CASE 
    WHEN EXISTS(
     SELECT PhotoURL FROM Photos WHERE Photos.UserID = Users.UserID AND UserType = 'admin' AND Photos.PhotoNum = 1 
    ) 
    THEN (
     SELECT PhotoURL FROM Photos WHERE Photos.UserID = Users.UserID AND UserType = 'admin' AND Photos.PhotoNum = 1 
    ) 
    ELSE '' 
END AS PhotoURL 
from Users 
+0

당신이 작동하지 않는 시도 쿼리를되어 사용하지 않는? 그렇지 않은 경우 오류가 무엇입니까? –

+0

하위 쿼리가 두 개 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, <= , >,> = 또는 하위 쿼리가 식으로 사용될 때이 하위 쿼리가 계속되는 경우에는 허용되지 않습니다. – dotNETEngineer

+0

그 오류는 동일한 'UserID'에 대해 두 개 이상의'PhotoNum '1이 있음을 의미합니다. 제안 된'LEFT JOIN' 기법을 사용하여 동일한 사용자에 대해 여러 행을 반환 할 수 있지만, 기본 키나 고유 제한이 'UserID'와'PhotoNum'에 있어야한다고 생각하기 때문에 데이터 문제가있을 수 있습니다. 사진'테이블. –

답변

-1
SELECT UserType, Users.UserID, FirstName, LastName, UserName, ISNULL(Photos.PhotoURL, '') as PhotoURL 
FROM Users 
LEFT JOIN Photos on Users.UserID = Photos.UserID 
    AND Photos.PhotoNum = 1 
    AND Users.UserType = 'admin' 
+0

Where 절은 내부 조인과 같은 쿼리를 강제로 실행합니다. 일치하지 않는 것을 고려해야합니다. – lucky

+0

마지막 열의 isnull이 – Goose

+0

"AND Photos.PhotoNum = 1"인 경우이 조건은 사진의 가능한 null 레코드를 제거합니다. – lucky

0

왜 그냥 left join

Select UserType, UserID, FirstName, LastName, UserName, ISNULL(P.PhotoURL,'') 
    from Users U left join Photos P 
    ON U.UserID = P.UserID 
    where 
    U.UserType = 'admin' and 
    (P.PhotoNum is null OR P.PhotoNum = 1) -- No match in the photos table or if there is a match, PhotoNum should be 1 
+0

좋습니다. 빠른 응답에 감사드립니다. – dotNETEngineer