SQL-是否可以从“SELECT”子句中排除列?
每当我在子查询中执行许多复杂的处理和许多列选择ed,但最终只需要显示很少的列时,我都会遇到这个问题。 SQL、Oracle、Microsoft或其他公司是否考虑使用一个额外的子句来忽略不需要的列SQL-是否可以从“SELECT”子句中排除列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,每当我在子查询中执行许多复杂的处理和许多列选择ed,但最终只需要显示很少的列时,我都会遇到这个问题。 SQL、Oracle、Microsoft或其他公司是否考虑使用一个额外的子句来忽略不需要的列 ;with t as ( select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10 from orders_tbl where order_date > getdate() -- ex. T-sql )
;with t as (
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > getdate() -- ex. T-sql
)
, s as (
select t.*, row_number() over(partition by col1 order by col8 DESC, col9) rn
from t
)
--
-- The problem is here: if i don't explicitly select the individual columns of "t" ,then it'll display the column "rn" as well which is not required.
--
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from s where rn = 1
order by col1, col2
现在,想象一下这样的情况-
with t as (
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > getdate() -- ex. T-sql
)
, s as (
select t.*, row_number() over(partition by col1 order by col8 DESC, col9) rn
from t
)
--
-- Note: the imaginary clause "exclude"
--
select *
from s exclude (rn) where rn = 1
order by col1, col2
您的想法如何?一种方法是选择一个新表,然后删除列:
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, row_number() over(partition by col1 order by col8 DESC, col9) rn
into #a
from orders_tbl
where order_date > getdate()
alter table #a drop column col1
select * from #a
请注意,这不是最佳性能,因为您已经读取并删除了一些数据。但事实证明,它对于少量数据和动态查询非常方便。一种方法是选择一个新表,然后删除列:
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, row_number() over(partition by col1 order by col8 DESC, col9) rn
into #a
from orders_tbl
where order_date > getdate()
alter table #a drop column col1
select * from #a
请注意,这不是最佳性能,因为您已经读取并删除了一些数据。但事实证明,它对于少量数据和动态查询非常方便。如果MS Sql Server支持类似SELECT*的内容,而不是tbl like中的col,那就太好了。 但目前这项功能还没有实现?年实施 但是,可以简化SQL。并且只使用1个CTE 因为a可以与一个订单(按行编号)组合在一起,所以 这样,您就不需要从最终结果中排除RN列
with T as (
select TOP 1 WITH TIES
col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > getdate()
ORDER BY row_number() over(partition by col1 order by col8 DESC, col9)
)
select *
from T
order by col1, col2;
注意,这里只需要CTE,因为最终结果仍然必须由col1、col2排序
旁注一:
对于简单查询,在外部查询中选择必填字段似乎更常用
with CTE as (
select *
, row_number() over(partition by col1 order by col8 DESC, col9) as rn
from orders_tbl
where order_date > getdate()
)
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from CTE
where rn = 1
order by col1, col2;
旁注二:
我希望有一天能在SQL标准中添加类似的子句。当需要基于窗口函数(如行数或密集秩)进行过滤时,这是一件很好的事情
在TeraData中,SQL可以这样编码:
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > current_timestamp
QUALIFY row_number() over(partition by col1 order by col8 DESC, col9) = 1
order by col1, col2
如果MS Sql Server支持SELECT*之类的东西,而不是tbl like中的col,那就太好了。 但目前这项功能还没有实现?年实施 但是,可以简化SQL。并且只使用1个CTE 因为a可以与一个订单(按行编号)组合在一起,所以 这样,您就不需要从最终结果中排除RN列
with T as (
select TOP 1 WITH TIES
col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > getdate()
ORDER BY row_number() over(partition by col1 order by col8 DESC, col9)
)
select *
from T
order by col1, col2;
注意,这里只需要CTE,因为最终结果仍然必须由col1、col2排序
旁注一:
对于简单查询,在外部查询中选择必填字段似乎更常用
with CTE as (
select *
, row_number() over(partition by col1 order by col8 DESC, col9) as rn
from orders_tbl
where order_date > getdate()
)
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from CTE
where rn = 1
order by col1, col2;
旁注二:
我希望有一天能在SQL标准中添加类似的子句。当需要基于窗口函数(如行数或密集秩)进行过滤时,这是一件很好的事情
在TeraData中,SQL可以这样编码:
select col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
from orders_tbl
where order_date > current_timestamp
QUALIFY row_number() over(partition by col1 order by col8 DESC, col9) = 1
order by col1, col2
不可以。答案是不要使用*并且只列出要返回的列。除了此列语法之外,没有*。如果引入此语法,其中一个问题是,在架构中添加或删除列可能会导致查询返回的列数发生潜在的意外更改,而查询本身不会发生任何更改。如果我是你,我不希望引入此语法,拉尼特b@迪亚多给出了一个很好的理由;我们中的许多人都被意外行为所困扰,这一切都是因为有人在部署的对象中使用了*,并且底层DDL发生了更改。Visual Studio中的一个伟大的新功能是将select*标记为错误,并拒绝编译您甚至不需要购买加载项。只需选择查询并按Ctrl+Shift+Q键即可弹出设计器。它将自动展开列。否。答案是不使用*并且只列出您想要返回的列。除了此列语法之外,没有*。如果引入此语法,其中一个问题是,在架构中添加或删除列可能会导致查询返回的列数发生潜在的意外更改,而查询本身不会发生任何更改。如果我是你,我不希望引入此语法,拉尼特b@迪亚多给出了一个很好的理由;我们中的许多人都被意外行为所困扰,这一切都是因为有人在部署的对象中使用了*,并且底层DDL发生了更改。Visual Studio中的一个伟大的新功能是将select*标记为错误,并拒绝编译您甚至不需要购买加载项。只需选择查询并按Ctrl+Shift+Q键即可弹出设计器。它会自动展开列。这对我来说是一件新鲜事。谢谢。刚刚看到你的更新答案和谷歌的BigQuery参考。很酷的东西!很高兴我们想法一致。我指的就是这个,但不知道BigQuery有这个。非常感谢对那些投反对票的人来说,我所指的对你有意义吗?我不知道为什么投反对票。但可能是因为,在没有样本数据和预期结果的情况下,他们认为这是一个不完整的问题。虽然我认为这已经足够清楚了,而且您在尝试编写查询时也付出了一些努力。是的,要赢得声誉比较难
通过问题比通过答案更容易理解。答案更容易删除以重新获得代表,通过对答案进行向下投票,你自己失去了1个声誉,但通过对问题进行向下投票,你失去了0个代表好吧,它在2012年起作用。但无法在2008年进行测试。不过,它应该可以在2008年运行,因为orderby是在窗口运行之后处理的。所以我不明白为什么不。这对我来说是新的东西。谢谢。刚刚看到你的更新答案和谷歌的BigQuery参考。很酷的东西!很高兴我们想法一致。我指的就是这个,但不知道BigQuery有这个。非常感谢对那些投反对票的人来说,我所指的对你有意义吗?我不知道为什么投反对票。但可能是因为,在没有样本数据和预期结果的情况下,他们认为这是一个不完整的问题。虽然我认为这已经足够清楚了,而且您在尝试编写查询时也付出了一些努力。是的,通过提问比通过回答更难赢得声誉。答案更容易删除以重新获得代表,通过对答案进行向下投票,你自己失去了1个声誉,但通过对问题进行向下投票,你失去了0个代表好吧,它在2012年起作用。但无法在2008年进行测试。不过,它应该可以在2008年运行,因为orderby是在窗口运行之后处理的。所以我不明白为什么不。谢谢你的建议。谢谢你的建议。