2012-04-24 2 views
2

를 포함 할 수있다 컬럼에 가입하세요. 나는 그것의 행에 'null'또는 ''이있는 열을 반환하기를 원합니다.을 존재하는 각 * Countries.id * 에 대해 한 번 행을 반환하지만내가 이런 식으로 뭔가를 할 NULL

SELECT 
    Users.id, 
    Countries.name 
FROM 
    Users, Countries 
WHERE 
    (Users.country_id = Countries.id OR Users.country_id IS NULL) 

: 나는 이것을 시도했다. 이 문제를 어떻게 해결할 수 있습니까?

+1

당신은 외부 조인 사용할 수 있습니다. – Murtaza

답변

6
SELECT users.id, countries.name 
FROM users 
LEFT JOIN 
     countries 
ON  countries.id = users.country_id 

이것은 ANSI가 바람직합니다 (JOIN 키워드를 사용하여) 구문 가입 이유의 좋은 예이다.

+0

젠장! 나를 때려. : p – weenoid

+0

고맙습니다. 이 작동합니다. 호기심에서 나는 또한 LEFT OUTER JOIN을 시도해 보았습니다. – alnafie

+3

@alnafie :'OUTER'는 순수 구문 론적 설탕입니다. – Quassnoi

2
SELECT   Users.id, 
       Countries.name 
FROM   Users 
LEFT OUTER JOIN Countries ON Users.country_id = Countries.id 
0
SELECT 
    Users.id, 
    Countries.name 
FROM 
    Users, Countries 
WHERE 
    Users.country_id = Countries.id 
UNION 
SELECT 
    id, 
    '{{no country}}' AS name 
FROM 
    Users 
WHERE 
    NOT EXISTS (SELECT * 
        FROM Countries 
       WHERE Users.country_id = Countries.id); 
+0

'UNION'은 중복을 제거하기 위해 불필요한 작업을 수행합니다. UNION ALL을 사용해야합니다. 그러나 전체 쿼리가 불필요하며 OUTER JOINS가 있으며 mysql이 지원합니다. –

+0

@FlorinGhita : "전체 쿼리가 불필요합니다 [sic]"- 'OUTER JOIN'사용이 필요하다는 것을 암시하는 것처럼 보입니다. 'OUTER JOIN'은 널 (null)을 생성하도록 명시 적으로 설계된 하나의 조합이며, 널 (null)을 피하는 것을 선호합니다. – onedaywhen

관련 문제