背景:
在最初的情况下是非常简单的.计算从最高收入到最低收入的每位用户的总运行总数:
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)
输出:
??????????????????????????????????????????????????????????
? ID ? User ? Revenue ? percentage ? running_percentage ?
??????????????????????????????????????????????????????????
? 2 ? James ? 750 ? 0.38 ? …
Run Code Online (Sandbox Code Playgroud) 为什么标量值函数似乎会导致查询在连续使用它们的次数越多,累积运行速度越慢?
我有这个表是用从第三方购买的数据构建的.
我已经删除了一些东西,以使这篇文章缩短...但只是让你了解事情是如何设置的.
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) 我不确定PostgreSQL
表所有者是什么意思.我注意到它改变了表本身的属性而不是所有者的属性,因为它是通过一个指定的
ALTER table SET OWNER role;
Run Code Online (Sandbox Code Playgroud) 因此用例如下 - 有一些参数,我想根据这些参数从一个表或另一个表中选择数据.
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理解在某个查询中只应扫描一个表?
如果您正在进行事务处理并执行DDL语句(例如截断表),那么事务将提交.
我想知道这是否总是如此,按照定义,或者是否有隐藏某个地方的设置会回滚事务而不是提交.
谢谢.
编辑澄清......
我不打算在截断后回滚.我只想确认已经执行的语句绝对会在DDL之前提交.只是想确保某个地方没有系统属性,有人可能会设置破坏我的代码.
据我所知,之前需要和DDL之后提交,但在概念上我还以为同样的一致性要求,可以用回退的DDL之前实现并提交后.
是否有任何网站允许测试Elixir
片段,保存它们并分享如下:
我找到类似的东西:http:
//www.tryerlang.org/和http://try-elixir.herokuapp.com/但他们不允许共享代码,第二次使用Elixir v0.10.2
.
我有一张桌子
它连接到另一个表
所有者可以是参与者,如果是,则所有者和参与者中的相同参考(进入用户表).所以我做了:
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
用来阻止重复检测,但是我可以绕过这一点而不会失去结果的清晰度吗?
(1,1)在SQL中的含义是什么?我的意思是在以下背景下:
create table PetOwner
(
Id int identity(1,1)
, Name nvarchar(200)
, Policy varchar(40)
)
Run Code Online (Sandbox Code Playgroud) 这是我正在尝试做的事情 - 我有一个包含大量列的表,并希望创建一个视图,其中一个列基于其他列中的某些值组合重新分配,例如
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 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)
现在我想要写的东西更具体的,例如通过/串连表的名字下面的查询(这只是例子):
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)
额外 ')
的非常难看和不方便.
第二个试验是使用Dynamic-SQL:
EXEC …
Run Code Online (Sandbox Code Playgroud) sql ×8
t-sql ×6
sql-server ×5
postgresql ×2
ddl ×1
elixir ×1
oracle ×1
select ×1
sql-function ×1
ssms ×1
transactions ×1
union ×1