2014-01-23 4 views
1

나는이 링크에서, 이것에 대한 바이올린을 만든 존재하는 경우 : http://www.sqlfiddle.com/#!2/7e007선택 값은

나는이 MySQL의에서 그래서 SQL 소형/CE를 찾아 could'nt.

표는 내가 두 테이블에서 선택하고자하는이

Records      Clients 
ID | NAME | AGE   ID | NAME  
------------------   ---------------- 
1 | John | 20   1 | John 
2 | Steven | 30   2 | Daniel 
3 | Abraham | 30   3 | 
4 | Donald | 25   5 | Lisa 
6 |   | 35   6 | Michael 
7 |   | 42   7 | 

처럼 보이는, 그리고 ID가 두 테이블에 모두가 이름을 가지고 있다면이 기본으로 "고객"에서 이름을 싶습니다 . 레코드 이름이 비어 있으면 클라이언트 이름 (있는 경우)을 사용하고 Clients.Name이 비어 있으면 사용하십시오. records.Name을 사용하십시오.

위의 표에서

, 나는이를 좋아하는 것 :

ID | NAME | AGE 
------------------ 
1 | John | 20 
2 | Daniel | 30 
3 | Abraham | 30 
4 | Donald | 25 
5 | Lisa | 
6 | Michael | 35 
7 |   | 42 

를 내가 SQL 컴팩트에서이 작업을 수행하려면 어떻게합니까?

편집 :

ID | NAME | AGE 
------------------ 
1 | John | 20 
2 | Daniel | 30 
3 | Abraham | 30 
4 | Donald | 25 
5 | Lisa | 
6 |   | 35 
7 |   | 42 

"마이클"

SELECT t.id, t.name, t.age FROM 
(
    (
     SELECT r.id, 
     CASE WHEN r.name = NULL THEN c.name ELSE r.name END as name, 
     r.age 
     FROM Records r 
     LEFT JOIN Clients c ON c.id = r.id 
    ) 
    UNION 
    (
     SELECT c.id, c.name, null as age FROM Clients c where c.id NOT IN (select id from Records) 
    ) 
) as t ORDER BY t.id 

이 나에게이 출력을 제공 : 내가 거의 작동이 쿼리, 마련하는 데 성공했습니다 아래에 큰 응답에 감사합니다 (# 6에 있어야 함)이 누락되었습니다. 왜?!

+0

이 부분을 다음과 같이 사용하십시오.'CASE WHEN c.name <> '' ' –

+0

@BrokenHeart ღ도 이와 같은 결과를 보았습니다. "c.name이 null이 아닌 경우 c.name을 사용하고 else.r.name을 사용하십시오". "Michael"이 (가) 누락되었습니다. 정말 혼란 스럽습니다. – gubbfett

+0

@BrokenHeart ღ 죄송합니다! 너는 완전히 옳았다. <> 널 (실제로 게시물이 null 인 경우에도) NULL이 잘못되었지만 <> ''로 변경하면 NULL이 작동했습니다. 나는 너의 대답을 믿음으로 줄 것이다. 고마워! – gubbfett

답변

0
select r.id, 
    IF(c.name != '',c.name,r.name) as name, 
    r.age 
FROM Records r 
LEFT JOIN Clients c ON c.id = r.id 
GROUP BY c.id 

위 쿼리를 사용하십시오.

편집 :

SELECT t.id, t.name, t.age FROM 
(
    (
     SELECT r.id, 
     CASE WHEN c.name <> '' THEN c.name ELSE r.name END as name, 
     r.age 
     FROM Records r 
     LEFT JOIN Clients c ON c.id = r.id 
    ) 
    UNION 
    (
     SELECT c.id, c.name, null as age FROM Clients c where c.id NOT IN (select id from Records) 
    ) 
) as t ORDER BY t.id 

사용이 쿼리.

+0

차가움. 그녀가 레코드 테이블에 없기 때문에 "Lisa"는 건너 뜁니다. 그렇지 않으면 올바른 것입니다. – gubbfett

+0

@gubbfett 왼쪽 결합 대신 조인을 사용합니다. –

+0

조인 만 사용하면 1,2,3,6,7 만 얻습니다. "Donald"와 "Lisa"가 누락되었습니다. – gubbfett

0

사용 COALECSE은 첫째하지-null 값을 얻을 수 있습니다 :

select id, coalesce(clients.name, records.name) as correct_name, records.age 
from records 
join clients using (id); 

편집 : 경우에 존재하지 않는 이름은 ''로 저장됩니다 대신 NULL의 사용 : 물론

select id, case when clients.name = '' then records.name else clients.name end as correct_name, records.age 
from records 
join clients using (id); 

당신이 할 수있는 또한 '와 NULL 모두에 대해 묻는 것으로 반응합니다.

when clients.name = '' or clients.name is null then 

http://www.sqlfiddle.com/#!2/7e007/36을 참조하십시오.

+0

니스! 그러나 이것을 시도 할 때, 나는 어떤 값을 건너 뜁니다.이 경우 나는 방금 1,2,3,6,7에 대한 데이터를 얻었습니다. – gubbfett

+0

아, 보았습니다. 예상했던 것보다 NULL을 저장하는 대신 누락 된 이름을 저장합니다. 그에 따라 내 대답을 편집하고 있습니다. –

+0

사실, 내 테스트 설정에서 null 값을 사용합니다. Null 또는 ''이 경우에는별로 중요하지 않습니다. 둘 다 사용할 수 있습니다. 나는 두 가지를 시도해 보았지만 작동시킬 수는 없다. 바이올린에서 볼 수 있듯이 선택 항목은 "FROM Clients"(?)이므로 Clients 테이블에서 일부 값을 제외합니다. – gubbfett

0
select case when a.id <> '' then a.id else b.id end as id , 
case when a.name <> '' then a.name else b.name end as name,a.age 
from records a 
full outer join clients b on a.Id = b.id 
order by a.id 
+0

SQL에 있습니다. sqlfiddle의 데이터에 따라 senario에 잘 작동합니다 .... –

+0

오류가 발생합니다. "FULL OUTER JOIN"은 SqlCE에서 사용할 수 없습니다. – gubbfett

+0

오 죄송합니다. SqlCE에 대한 내 생각이 전혀 들지 않습니다. SQL Server에서 내 쿼리가 작동하는지 확인하십시오. 대체 항목이 있는지 확인하십시오. –

0

보십시오,이 작업을 바랍니다 ..

select c.id, 
IF(NAME='',(select name from Records where id = c.id),'') 
If(NAME=NULL,(select name from Records where id = c.id),NULL) 
Else c.NAME 
from client c; 

환호!