2014-02-20 2 views
0
SELECT CountryCode, Name AS Country, Language 
FROM Country INNER JOIN CountryLanguage 
ON Country.Code = CountryLanguage.CountryCode 
WHERE Language = 'German' 
ORDER BY Country; 

Как вы бы использовали EXISTS и подзапрос с этим оператором SELECT?Как использовать EXISTS и подзапрос с этим оператором SELECT

+0

В какой базе данных? SQL - это всего лишь язык запросов, но в различных базах данных, таких как MySQL, Postgres, Oracle, SQL Server, DB2, Ingres и т. Д., Есть много тонких различий ..... –

+0

если это не вопрос домашней работы «как это сделать странно «Я не вижу необходимости в существовании – halfbit

+0

Да, домашнее задание. База данных SQL Server. – Zastrow

ответ

0

Это должно дать тот же результат и использует EXISTS:

select countrycode, name as country, language 
    from country y 
where exists (select 'fish' 
      from countrylanguage x 
     where x.countrycode = y.code 
      and x.language = 'German') 
order by country; 

с EXISTS подзапрос, если подзапрос возвращает ничего, состояние проходит, и если он не возвращает ни одной строки, он выходит из строя, это не вопрос, что вы положили в select select (уведомление, которое я набрал в «fish»). Но этот подзапрос по-прежнему будет возвращать строку в любой ситуации, когда в стране есть строка на языке страны, где язык является немецким, и поэтому для строк страны, которые применимы к вам, условие проходит, и поэтому оно фильтрует одинаковый путь.

+0

Примечание: вам не нужна «рыба». Вместо этого вы можете выбрать 1 или *. – wildplasser

+0

@wildpasser Я не пытался обмануть его или что-то еще, просто проиллюстрируйте, что неважно, что вы положили в оператор select. Многие люди используют 1/*/'x', поэтому я хотел четко указать, что не важно, что указано в списке –

+0

Для новичков это путает, ИМХО. (Я обычно использую '*', так как я обычно никогда не использую '*'). Может быть, 'select ... where not exists (select 12345 from ...)' make более ясно, что 12345 является только заполнителем – wildplasser

0

Спасибо за все советы. Я смог исправить совместное решение с EXISTS и подзапросом, который дает те же результаты, что и мой первоначальный оператор SELECT.

SELECT CountryCode, Name AS Country, Language 
FROM CountryLanguage AS X INNER JOIN Country AS Y 
ON X.CountryCode = Y.Code 
WHERE EXISTS 
    (
    SELECT 'German' 
    FROM CountryLanguage AS X 
    WHERE X.CountryCode = Y.Code 
    AND X.Language = 'German' 
    ) 
AND X.Language = 'German' 
ORDER BY Country; 
Смежные вопросы