Выберите строки, которые не отображаются в другой таблице - PullRequest
2 голосов
/ 22 октября 2019

Вот проблема: у меня есть таблица матчей по футболу, в каждой строке есть одна страна и идентификатор матча, например:

ID1 Russia;
ID1 Egypt 

Означает, что это была игра между Россией и Египтом. Но в таблице у меня есть строки только для команд, которые забили гол. Например, если в таблице 2: США - Канада, у меня будет:

ID2 USA GOALS: 2

И у меня есть таблица всех игр, в которой будет ряд с канадским ID2, но без целей. Я пытаюсь добавить новые строки таблицы с нулевыми целями в страны, которые не забили, например:

ID2 USA GOALS:2;
ID2 CANADA GOALS:0 

Но я получаю что-то странное. Вот несколько скриншотов:

Columns: Date, Group, Country, Id, Goals. This is table of countries who scored

Table of all games: Id, Group, Country, Date

Теперь я хочу проверить, есть ли строка в первой таблице для идентификатора и страны и если нет, это означает, что страна не забила, и я должен добавить новую строку с этим ID, Страна и ноль голов. Я попробовал что-то вроде этого, но это не сработало:

select #AllCountries.Date, #AllCountries.Group, #Country, #Id, 0 as Goals
    from #AllCountries inner join #CountriesWhoScored
    ON #AllCountries.Id = #WhoScored.Id
    WHERE #AllCountries.Id = #WhoScored.Id AND #AllCountries.Country != #WhoScored.Country

Но я получаю дубликаты строк, которые уже существуют в таблице со странами, которые набрали:

For example at least one country of 4ID shouldnt be here

PS: это SQL Server 17, и я работаю в SSMS

1 Ответ

4 голосов
/ 23 октября 2019

Я думаю, что вам просто нужны left join и coalesce():

select c.*, coalesce(s.Goals, 0)
from #AllCountries c
left join #CountriesWhoScored s on s.Id = c.Id and s.Country = c.Country

Для страны, которая не набрала балл, s.Goals заканчивается null: тогда вы можете использовать coalesce() чтобы превратить его в 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...