2016-02-16 3 views
0

I have seen this question from sql zoo select from world tutorial(13 th one)В чем разница между следующими запросами

SELECT 
    name, continent, 
    CASE 
     WHEN continent = 'Oceania' THEN 'Australasia' 
     WHEN continent = 'Eurasia' OR name = 'Turkey' THEN 'Europe/Asia' 
     WHEN continent = 'Caribbean' AND name LIKE 'b%' THEN 'North America' 
     WHEN continent = 'Caribbean' AND name NOT LIKE 'b%' THEN 'South America' 
     ELSE continent 
    END 
FROM world 
ORDER BY name; 

SELECT 
    name, continent AS 'Original Continent', 
    CASE WHEN continent = 'Oceania' THEN 'Australasia' 
     WHEN continent = 'Eurasia' OR name = 'Turkey' THEN 'Europe/Asia' 
     WHEN continent IN (SELECT continent FROM world 
          WHERE continent = 'Caribbean' 
           AND name LIKE 'B%') THEN 'North America' 
     WHEN continent IN (SELECT continent FROM world 
          WHERE continent = 'Caribbean' 
           AND name NOT LIKE 'B%') THEN 'South America' 
     ELSE continent 
    END as 'New Continent'  
FROM 
    world 
ORDER BY 
    name; 

первый показывает правильные результаты, а второй не так, в чем разница? Может кто-нибудь ответить.

+1

О.И. удалены лишние теги базы данных. Не стесняйтесь пометить базу данных, которую вы фактически используете. –

+0

Проверьте данные таблицы, и вы увидите. – jarlh

ответ

1

В этой строке:

WHEN continent IN (SELECT continent 
        FROM world 
        WHERE continent = 'Caribbean' 
        AND name LIKE 'B%') THEN 'North America' 

Вы назначаете все страны Карибах с North America, так как ваш IN части:

(SELECT continent FROM world WHERE continent = 'Caribbean' AND name LIKE 'B%') 

вернется

continent 
------------- 
Caribbean 
Caribbean 
Caribbean 

Вы по существу есть

WHEN continent IN ('Caribbean') THEN 'North America' 

Это неверно, поскольку оно не будет назначать ни одну из стран континента Южной Америки. Используя версию подзапросов вам нужно будет использовать name вместо continent:

WHEN name IN (SELECT name FROM world WHERE continent = 'Caribbean' AND name LIKE 'B%') 
    THEN 'North America' 
WHEN name IN (SELECT name FROM world WHERE continent = 'Caribbean' AND name NOT LIKE 'B%') 
    THEN 'South America' 
Смежные вопросы