小编Luk*_*zda的帖子

SQL Server - 具有相关性的条件聚合

背景:

最初的情况下是非常简单的.计算从最高收入到最低收入的每位用户的总运行总数:

CREATE TABLE t(Customer INTEGER  NOT NULL PRIMARY KEY 
              ,"User"   VARCHAR(5) NOT NULL
              ,Revenue  INTEGER  NOT NULL);

INSERT INTO t(Customer,"User",Revenue) VALUES
(001,'James',500),(002,'James',750),(003,'James',450),
(004,'Sarah',100),(005,'Sarah',500),(006,'Sarah',150),
(007,'Sarah',600),(008,'James',150),(009,'James',100);
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT *,
    1.0 * Revenue/SUM(Revenue) OVER(PARTITION BY "User") AS percentage,
    1.0 * SUM(Revenue) OVER(PARTITION BY "User" ORDER BY Revenue DESC)
         /SUM(Revenue) OVER(PARTITION BY "User") AS running_percentage
FROM t;
Run Code Online (Sandbox Code Playgroud)

LiveDemo

输出:

??????????????????????????????????????????????????????????
? ID ? User  ? Revenue ? percentage ? running_percentage ?
??????????????????????????????????????????????????????????
?  2 ? James ?     750 ? 0.38       ? …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server postgresql sql-standards

17
推荐指数
1
解决办法
415
查看次数

为什么SQL Server标量值函数会变慢?

为什么标量值函数似乎会导致查询在连续使用它们的次数越多,累积运行速度越慢?

我有这个表是用从第三方购买的数据构建的.

我已经删除了一些东西,以使这篇文章缩短...但只是让你了解事情是如何设置的.

CREATE TABLE [dbo].[GIS_Location](
        [ID] [int] IDENTITY(1,1) NOT NULL, --PK
        [Lat] [int] NOT NULL,
        [Lon] [int] NOT NULL,
        [Postal_Code] [varchar](7) NOT NULL,
        [State] [char](2) NOT NULL,
        [City] [varchar](30) NOT NULL,
        [Country] [char](3) NOT NULL,

CREATE TABLE [dbo].[Address_Location](
    [ID] [int] IDENTITY(1,1) NOT NULL, --PK
    [Address_Type_ID] [int] NULL,
    [Location] [varchar](100) NOT NULL,
    [State] [char](2) NOT NULL,
    [City] [varchar](30) NOT NULL,
    [Postal_Code] [varchar](10) NOT NULL,
    [Postal_Extension] [varchar](10) NULL,
    [Country_Code] [varchar](10) NULL,
Run Code Online (Sandbox Code Playgroud)

然后我有两个查找LAT和LON的函数.

CREATE FUNCTION [dbo].[usf_GIS_GET_LAT]
(
    @City VARCHAR(30),
    @State CHAR(2)
) …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2005 sql-function

16
推荐指数
2
解决办法
4万
查看次数

什么是PostgreSQL表所有者?

我不确定PostgreSQL表所有者是什么意思.我注意到它改变了表本身的属性而不是所有者的属性,因为它是通过一个指定的

ALTER table SET OWNER role;
Run Code Online (Sandbox Code Playgroud)

postgresql

16
推荐指数
3
解决办法
1万
查看次数

表函数中的条件UNION ALL

因此用例如下 - 有一些参数,我想根据这些参数从一个表或另一个表中选择数据.

create table dbo.TEST1 (id int primary key, name nvarchar(128))
create table dbo.TEST2 (id int primary key, name nvarchar(128))
Run Code Online (Sandbox Code Playgroud)

所以我创建了这样的函数:

create function [dbo].[f_TEST]
(
    @test bit
)
returns table
as
return (
    select id, name from TEST1 where @test = 1

    union all

    select id, name from TEST2 where @test = 0
)
Run Code Online (Sandbox Code Playgroud)

当我使用常量运行它时,执行计划很棒 - 只扫描一个表

select * from dbo.f_TEST(1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,当我使用变量时,计划并不是那么好 - 两个表都被扫描

declare @test bit = 1

select * from dbo.f_TEST(@test)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那么是否有任何提示(或技巧)强制SQL Server理解在某个查询中只应扫描一个表?

sql t-sql sql-server sql-execution-plan sql-server-2016

16
推荐指数
1
解决办法
730
查看次数

DDL语句是否总是为您提供隐式提交,或者您是否可以获得隐式回滚?

如果您正在进行事务处理并执行DDL语句(例如截断表),那么事务将提交.

我想知道这是否总是如此,按照定义,或者是否有隐藏某个地方的设置会回滚事务而不是提交.

谢谢.

编辑澄清......

我不打算在截断后回滚.我只想确认已经执行的语句绝对会在DDL之前提交.只是想确保某个地方没有系统属性,有人可能会设置破坏我的代码.

据我所知,之前需要和DDL之后提交,但在概念上我还以为同样的一致性要求,可以用回退的DDL之前实现并提交后.

sql oracle ddl transactions

15
推荐指数
3
解决办法
4万
查看次数

Elixir在线IDE /游乐场网站

是否有任何网站允许测试Elixir片段,保存它们并分享如下:

我找到类似的东西:http: //www.tryerlang.org/http://try-elixir.herokuapp.com/但他们不允许共享代码,第二次使用Elixir v0.10.2.

elixir

15
推荐指数
2
解决办法
4879
查看次数

数据类型文本不能用作UNION,INTERSECT或EXCEPT运算符的操作数,因为它不具有可比性

我有一张桌子

  • Id(PK)
  • 所有者int
  • DescriptionText文本

它连接到另一个表

  • Id(FK)
  • 参与者int

所有者可以是参与者,如果是,则所有者和参与者中的相同参考(进入用户表).所以我做了:

SELECT TableA.Id,TableA.Owner,TableA.Text
FROM TableA
WHERE TableA.Owner=@User
UNION
SELECT TableA.Id,TableA.Owner.TableA.Text
FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id)
WHERE TableB.Participant = @User
Run Code Online (Sandbox Code Playgroud)

此查询应返回所有不同的数据集,其中某个@User是所有者或参与者或两者.

如果SQL Server不抛出,它会

数据类型文本不能用作UNION,INTERSECT或EXCEPT运算符的操作数,因为它不具有可比性.

由于Id是PK,而Text来自同一个表,为什么SQL Server想要比较Text呢?

我可以UNION ALL用来阻止重复检测,但是我可以绕过这一点而不会失去结果的清晰度吗?

sql t-sql sql-server union

15
推荐指数
1
解决办法
2万
查看次数

(1,1)在SQL中的含义是什么?

(1,1)在SQL中的含义是什么?我的意思是在以下背景下:

create table PetOwner
(
    Id      int identity(1,1)
,   Name        nvarchar(200)
,   Policy  varchar(40)
)
Run Code Online (Sandbox Code Playgroud)

sql t-sql

15
推荐指数
2
解决办法
2万
查看次数

在SQL中的SELECT*中重命名单列,选择除列之外的所有列

这是我正在尝试做的事情 - 我有一个包含大量列的表,并希望创建一个视图,其中一个列基于其他列中的某些值组合重新分配,例如

Name, Age, Band, Alive ,,, <too many other fields)

我想要一个将重新分配其中一个字段的查询,例如

Select *, Age = 
CASE When "Name" = 'BRYAN ADAMS' AND "Alive" = 1 THEN 18
     ELSE "Age"
END
FROM Table
Run Code Online (Sandbox Code Playgroud)

但是,我现在拥有的架构是 Name, Age, Band, Alive,,,,<too many>,, Age

我可以在我的选择陈述中使用'AS'来制作它 Name, Age, Band, Alive,,,,<too many>,, Age_Computed.

但是,我想要达到Name, Age, Band, Alive.,,,,Age实际上是计算年龄的原始模式 .

我可以选择重命名SELECT * and A_1 as A, B_1 as b吗?(然后A_1完全消失)或选择性*我可以选择除特定列之外的所有列?(这也将解决前一个声明中提出的问题)

我知道我列举所有列并创建适当查询的hacky方式,但我仍然希望有一种"更简单"的方法来实现这一点.

sql select

14
推荐指数
2
解决办法
2万
查看次数

SQL Server将标识符传递给存储过程/动态SQL

背景:

SQL Server Management Studio允许定义自己的查询快捷方式(Tools > Options > Environment > Keyboard > Query Shortcuts):

在此输入图像描述

图片来自:http://social.technet.microsoft.com/wiki/contents/articles/3178.how-to-create-query-shortcuts-in-sql-server-management-studio.aspx

my_schema.my_table
-- highlight it
-- press CTRL + 3 and you will get the number of rows in table
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它以基本形式连接查询(据我所知只在最后).查询:

SELECT COUNT(*) FROM my_schema.my_table;
Run Code Online (Sandbox Code Playgroud)

尝试#1

现在我想要写的东西更具体的,例如通过/串连表的名字下面的查询(这只是例子):

SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID(...)
Run Code Online (Sandbox Code Playgroud)

所以当我写入查询快捷方式时:

SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID('
Run Code Online (Sandbox Code Playgroud)

我必须使用:

my_schema.my_table')
-- highlight it
-- press CTRL + 3
Run Code Online (Sandbox Code Playgroud)

额外 ')的非常难看和不方便.

尝试#2:

第二个试验是使用Dynamic-SQL:

EXEC …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server ssms

14
推荐指数
1
解决办法
650
查看次数