Вызов таблицы с двумя переменными AS и сравнение их, когда в таблице только одна строка данных - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь понять функцию AS в SQL.

Допустим, у меня есть таблица с именем disaster, и я использую это предложение from в своем запросе

from disaster as D, disaster as D2

Моя таблица бедствий имеет только одну строку данных, и, например, один из столбцов в таблице - dyear.

Если я попытаюсь проверить равенство между D1, D2, как это

D2.dyear = D1.dyear

будут ли они равны?

Если бы у меня была еще одна строка данных, они не были бы равны, верно?

Спасибо за помощь мне!

Полный код:

select distinct 
    D.cname, D.etype, D.dyear
from 
    disaster as D, disaster as D2
where 
    D.cname = D2.cname 
    and D.dyear < (date_part('year', current_date) - 100)
    and ((D2.dyear not between D.dyear and D.dyear + 100) or (D2.dyear = D.dyear))

Я пытаюсь составить таблицу всех городов, в которых произошла катастрофа как минимум на 100 лет меньше, чем в этом году, и что после этой катастрофы больше не былобедствия, по крайней мере, 100 лет в этом городе

И я подумал о том, чтобы попытаться сравнить D2.dyear и D.dyear, чтобы увидеть, была ли в городе только одна катастрофа

1 Ответ

0 голосов
/ 21 октября 2018

В вашем примере AS - это просто зарезервированное слово сервера, которое говорит, что следующее слово является псевдонимом для таблицы.На самом деле вы можете его опустить, и ничего не изменится.

UPD Следующий раздел верен только в случае отсутствия предложения where.

Запись двух таблиц череззапятая будет производить декартово произведение , и результат будет соответствующим.Это не рычаг для сравнения данных, а способ объединения таблиц.

Вот пример кода в SQL Server, который делает такой выбор.Он возвращает только последнюю катастрофу, которая была менее 100 лет.Но у вас есть третий столбец etype, и он требует некоторого дополнительного кода - добавьте его в select и group by, а затем отфильтруйте требуемое значение или что-то еще

with t as 
(
    select cname, datepart(year, dyear) disaster_date
    from disaster t
    where datepart(year, getdate()) - datepart(year, dyear) >= 100
      and not exists (select 1 
                      from disaster 
                      where cname = t.cname 
                        and datepart(year, getdate()) - datepart(year, dyear) < 100)
)
select distinct cname, min(disaster_date) disaster_date  
from t 
group by cname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...