首页 > 解决方案 > 使用两个 AS 变量调用 table 并在 table 只有一行数据时比较它们

问题描述

我试图理解 SQL 中的 AS 函数。

假设我有一个名为的表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.dyearD.dyear看看这个城市是否只有一场灾难

标签: sqldatabase

解决方案


在您的示例AS中,只是服务器的保留字,表示以下单词是表的别名。实际上你可以省略它,什么都不会改变。

UPD下一部分仅在where没有子句的情况下才成立。

用逗号写两个表将产生笛卡尔积,结果将是对应的。它不是比较数据的杠杆,而是连接表的一种方式。

下面是执行此类选择的 SQL Server 中的示例代码。它只返回不到 100 年的最后一场灾难。但是您有第三列etype,它需要一些额外的代码 - 将其添加到 a 中selectgroup 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

推荐阅读