【问题标题】:TSQL nested basic queryTSQL 嵌套基本查询
【发布时间】:2013-08-06 13:41:27
【问题描述】:

我坚持使用 T-SQL 查询。我认为这是基本的。但我想不通。有人可以很好地阐明它吗?提前致谢!

这是我的问题。我想写一个查询来完成以下任务:

原始数据:

Department Type Salary Age 
1 1 1000 30 
1 2 1500 31 
1 3 2000 25 
2 1 250 35 
2 2 50 20 
2 3 300 35

理想情况下,我想要一张包含以下信息的表格:

Department Type Salary Age
1 3 2000 25
1 2 1500 31
1 1 1000 30
2 3 300 35
2 1 250 35

选择基于每个部门的比较。我比较了每个部门内每种类型的薪水。并选择同一部门的薪水大于或等于类型1的人。然后在每个部门内,记录按 Salary 的降序排列。

这是我的错误代码。

SELECT Department, Type, Salary, Age
FROM Database.dbo.Table1
WHERE Salary >=  
(
SELECT Salary
FROM Database.dbo.Table1
WHERE Type = 1
GROUP BY Department
)
GROUP BY Department

我希望插图清楚。如果不是,请随时告诉我。我可以解释更多。

再次感谢!

【问题讨论】:

    标签: sql-server tsql subquery


    【解决方案1】:

    这里没有什么太棘手的问题 - 只是一个自联接回到同一个表以识别 Type = 1 Salary,然后是一个相当正常的 ORDER BY 子句:

    样本数据:

    declare @t table (Department int,[Type] int, Salary int, Age int)
    insert into @t(Department,[Type], Salary, Age ) values
    (1 ,1 ,1000 ,30    ),
    (1 ,2 ,1500 ,31    ),
    (1 ,3 ,2000 ,25    ),
    (2 ,1 ,250 ,35     ),
    (2 ,2 ,50 ,20      ),
    (2 ,3 ,300 ,35     )
    

    查询:

    select
        t1.*
    from
        @t t1
            inner join
        @t t2
            on
                t1.Department = t2.Department and
                t1.Salary >= t2.Salary and
                t2.[Type] = 1
    order by t1.Department, t1.Salary desc
    

    您尝试使用GROUP BY 是错误的,因为GROUP BY 对最终输出顺序没有任何影响1


    1 作为分组处理方式的副作用,输出可能按对您有用的顺序排序- 但这只是副作用,不能保证。保证订购的唯一方法是使用ORDER BY

    【讨论】:

    • 您好,达米安,感谢您的帮助!实际上,支持是如此之快,以至于我起鸡皮疙瘩......我试过你的代码,它正在工作!但是,您能稍微解释一下 @t 吗?经常看到@little mouse/rose/hat这个牌子,但是不太明白……
    • @LinguisticsStudent - @t 是我给表变量起的名字(T-SQL 中的大多数变量都以 @ 开头)。表变量便于编写快速、一次性的代码来回答这里的问题,因为一旦 SQL 运行它就会消失 - 我不必在编写此脚本后进行清理。 (它们也有其他用途)。请参阅here 了解更多信息。
    • 嗨达米安,感谢您的解释!我稍微搜索了一下关键词。另一个问题是,我实际上在工作中使用的是视图,而不是表格。而且这很奇怪,无法正常工作……是因为它是一种观点吗?或者你有其他建议吗?我认为没有错别字。代码已执行,但有 0 行受到影响。
    • @LinguisticsStudent - 唯一保证返回结果顺序的 ORDER BY 子句是您提交给服务器的最外层查询中的那个 - 任何其他 ORDER BY 子句(内部视图,在子查询、CTE 等)中,仅用于确定选择哪些行(通过TOP),不是结果集的顺序。跨度>
    • @Damien_The_Unbeliever,非常感谢您的解释!你是最棒的!我对此有了更好的理解。为了将来参考,这里是另一个解释ORDER BY子句的链接:technet.microsoft.com/en-us/library/ms188385.aspx
    【解决方案2】:
    select * from T as t1
    where 
    type=1
    or
    Exists(select 1 from t where t.[Department]=t1.[Department]
                                 and
                                 t.type=1
                                 and 
                                 salary<t1.salary 
                                 )
    
    order by [Department],salary DESC
    

    SQLFiddle demo

    【讨论】:

    • 您好 Valex,感谢您的帮助!我很感激!我确信代码是正确的,因为它在 Fiddle 中工作。但是,我一定是做了一些愚蠢的事情,并且遇到了与 Damien 的建议相同的问题。是因为我使用的是视图而不是表格吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多