Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么这个查询有两个选择?_Sql_Sql Server - Fatal编程技术网

Sql 为什么这个查询有两个选择?

Sql 为什么这个查询有两个选择?,sql,sql-server,Sql,Sql Server,我有一个疑问: SELECT WorkId, RegisterDate, sum(RoomType1) As RoomType1, sum(RoomType2) As RoomType2, sum(RoomType3) As RoomType3, sum(RoomType4) As RoomType4, sum(RoomType5) As RoomType5, sum(RoomType6) As RoomType6, sum(RoomType7) As RoomType7, su

我有一个疑问:

SELECT         WorkId, RegisterDate, sum(RoomType1) As RoomType1, sum(RoomType2) As RoomType2, sum(RoomType3) As RoomType3, sum(RoomType4) As RoomType4, sum(RoomType5) As RoomType5, sum(RoomType6) As RoomType6, sum(RoomType7) As RoomType7, sum(RoomType8) As RoomType8
FROM (

SELECT     dbo.[Work].WorkId, dbo.[Work].RegisterDate, 

case dbo.Floor.RoomType when 1 then 1 else 0 end as RoomType1,
        case dbo.Kat.RoomType when 2 then 1 else 0 end as RoomType2,


FROM            dbo.Belediye INNER JOIN
                         dbo.[Is] ON dbo.Municipality.MunicipalityId= dbo.[Is].MunicipalityWorkId INNER JOIN
                         dbo.Look ON dbo.[Work].LookWorkId = dbo.Look.LookId ,
WHERE        (dbo.Look.LocationIS NOT NULL)

) E
GROUP BY WorkId, 

这个查询按预期工作,但我不明白为什么它有两个选择,为什么它需要它们?请给我解释一下。谢谢。

由于您怀疑此查询不需要两次选择,因此可以在不使用子查询的情况下重写:

SELECT  i.IsId, 
        i.KayitTarihi, 
        SUM(case k.OdaTipi when 1 then 1 else 0 end) as RoomType1,
        SUM(case k.OdaTipi when 2 then 1 else 0 end) as RoomType2,
        SUM(case k.OdaTipi when 3 then 1 else 0 end) as RoomType3,
        SUM(case k.OdaTipi when 4 then 1 else 0 end) as RoomType4,
        SUM(case k.OdaTipi when 5 then 1 else 0 end) as RoomType5,
        SUM(case k.OdaTipi when 6 then 1 else 0 end) as RoomType6,
        SUM(case k.OdaTipi when 7 then 1 else 0 end) as RoomType7,
        SUM(case k.OdaTipi when 8 then 1 else 0 end) as RoomType8
FROM dbo.Belediye b
INNER JOIN dbo.[Is] i
    ON b.BelediyeId = i.BelediyeIsId 
INNER JOIN dbo.YerGorme yg
    ON i.YerGormeIsId = yg.YerGormeId 
INNER JOIN dbo.Kat k
    ON yg.YerGormeId = k.YerGorme_YerGormeId
WHERE yg.Lokasyon IS NOT NULL
GROUP BY i.IsId, i.KayitTarihi

注意:使用

内部选择称为派生表。执行
分组时非常方便,可以避免重复编写复杂表达式。(根据ANSI SQL,这甚至是不允许的。)在这种情况下似乎并不需要它。您可以在一次选择中进行分组,然后执行
sum(case…end)
操作。