2016-11-15 1 views
0

다소 복잡한 SELECT에 대한 SQL 쿼리가 필요합니다. 다음 표 가정 :3 개의 옵션과 컬럼 값을 기반으로 다른 테이블에서 선택하는 SQL 쿼리

 
Table 1:        Table 2: 
name | email  | callingcardid  id | name | email 
-------|------------|--------------  ---|--------|---------------- 
first | [email protected] | null    1 | second | [email protected] 
second |   | 1 
third |   | null 

출력해야한다 : 구문은 분명히 잘못

 
name | email 
-------|----------- 
first | [email protected] 
second | [email protected] 
third | - 

쿼리가해야 뭔가

SELECT table1.name, COALESCE(NULLIF(table1.email, ''), 
CASE WHEN table1.callingcardid != NULL 
THEN (SELECT table2.email WHERE id = table1.callingcardid) ELSE '-' END) "email" 

처럼, 나는 그것을 얻을 수 없기 때문에 작업. 다른 테이블의 조인과 다른 두 개의 열이 있지만 그렇지 않으면 작동합니다. CASE 절이 문제의 제조사입니다.

데이터베이스는 Microsoft SQL Server 2008 (또는 2012)입니다.

+0

는 어디가 가입입니까?. 전체 SQL 쿼리를 제공 할 수 있습니까? –

+0

FROM 절이 없습니까? – jarlh

답변

1

COALESCE과 같은 것을 사용해보십시오.

SELECT 
    t1.name 
    ,COALESCE(t1.email, t2.email,'-') email 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.callingcardid = t2.id 
+0

고마워, 나는 그것을 복잡하게 끝냈다. 이것은 간단하고 효과적입니다. 재밌어, 그냥 작동 시키면 클라이언트의 소프트웨어가 table2에 전자 메일을 자동으로 업데이트하므로 쿼리가 필요조차되지 않는다. – Sami

0

이 쿼리는 전자 메일이 NULL이거나 첫 번째 테이블의 빈 문자열 일 가능성을 고려합니다. 두 경우 모두 두 번째 테이블의 전자 메일이 사용됩니다. 이메일 정보를 사용할 수없는 경우 이메일에 대시가 하나씩 표시됩니다.

SELECT t1.name, 
     CASE WHEN COALESCE(t1.email, '') = '' 
      THEN COALESCE(t2.email, '-') 
      ELSE t1.email END AS email 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t1.callingcardid = t2.id 
0
SELECT Table1.name 
     , CASE WHEN ISNULL(Table1.email,'') = '' 
       THEN Table2.email 
       ELSE Table1.email 
     END Email 
FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.name = Table2.name