小编Mat*_*lie的帖子

仅提交在TRANSACTION中进行的可能ROLLBACK的特定更改

这是对原始问题的重要编辑,使其更简洁,涵盖现有答案提出的要点......

是否可以在单个事务中对多个表进行多次更改,并仅回滚一些更改?

在下面的TSQL中,我不希望回滚"myLogSP"所做的任何更改.但是,如果需要,各种myBusinessSP所做的所有更改都应该回滚.

BEGIN TRANSACTION  

    EXEC myLogSP

    EXEC @err = myBusinessSPa
    IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END

    EXEC myLogSP

    EXEC @err = myBusinessSPb
    IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END

    EXEC myLogSP

    EXEC @err = myBusinessSPc
    IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END

    EXEC myLogSP

COMMIT TRANSACTION
RETURN 0
Run Code Online (Sandbox Code Playgroud)

顺序很重要,myLogSPs必须在myBusinessSPs之间和之后发生(myLogSPs接受myBusinessSPs所做的更改)

同样重要的是,所有myBusinessSP都发生在一个事务中以维护数据库完整性,并允许所有更改在必要时回滚.

就好像我希望myLogSP的行为就好像它们不是交易的一部分.这只是一个不方便的事实,它们碰巧在一个内部(由于需要在myBusinessSP之间调用.)

编辑:

最终答案是"不",唯一的选择是重新设计代码.要么使用表变量进行日志记录(因为变量不会被回滚),要么将业务逻辑重新设计为不需要事务...

sql locking transactions sql-server-2005 transaction-isolation

5
推荐指数
1
解决办法
2380
查看次数

时间绑定层次结构的最佳关系数据库表示

大家认为什么是SQL中有时间限制的层次结构的最佳表示?

我的意思是:
- 在任何给定的日期,你有一个普通的树层次结构
- 这个层次结构可以从一天到
另一个变化- 每个孩子在任何给定的日期仍然只有一个父

第1天......

Business
 |
 |-Joe
 |  |-Happy
 |  |-Sneezy
 |  |-Doc(*)
 |
 |-Moe
    |-Bashfull
    |-Sleepy
Run Code Online (Sandbox Code Playgroud)

第2天......

Business
 |
 |-Joe
 |  |-Happy
 |  |-Sneezy
 |
 |-Moe
    |-Doc(*)
    |-Bashfull
    |-Sleepy
Run Code Online (Sandbox Code Playgroud)

孩子可以在任何时候第一次加入层次结构,或者完全离开层次结构.(例如,新员工和退休员工.)

主要考虑因素:

  • 更新层次结构
  • 查看日期范围内的整个层次结构
  • 报告层次结构中的整个子树
  • 报告日期范围内的整个子树

我知道我现在是怎么做的,但我对其他人怎么做可能很感兴趣:)

编辑

我天真地假设了一些考虑,所以会更明确......

  • 每个"团队"或"人员"在其他地方的维度表中都会有唯一的ID
  • 其他事实表将使用这些ID(例如,存储性能指标)
  • 该结构需要促进跨日期范围的历史报告
  • 使用ETL或触发器来维护替代结构是一种选择

通用性质是最重要的(仅形成通用关系模式的一部分),结合易于使用的驱动报告(对于任何日期范围的树的任何部分)以及可靠更新的能力.

sql database reporting hierarchy

5
推荐指数
1
解决办法
1942
查看次数

WHERE子句中的"条件条件"(要应用的条件取决于"模式"标志)

我有一种情况,我已经用两种不同的方式解决了这个问题,但是想知道人们对选项的看法,以及他们是否还有其他选择......

系统正在处理数据的"间隔".

  • 所有数据都分配到"间隔"
  • 间隔由Fact表中的"interval_start"DATETIME表示
  • Dimenstion表保存"interval"的持续时间(对于不同的实体可以是不同的)
  • Dimension表中还有一个"mode"标志


SQL查询中需要以下规则...

模式0
如果记录条目在事实表中,则可以对其进行处理.
(无限制.)

模式1
如果"interval_start"过去,则记录仅对处理有效.(已经开始的时间间隔,但不一定完成.)

模式2
如果整个"间隔"是过去的,则记录仅对处理有效.(已完成的时间间隔.)


为此创建的第一个WHERE子句如下......

WHERE
    getDate() >=
        CASE [table].mode
            WHEN 0 THEN 0
            WHEN 1 THEN [log].interval_start
            WHEN 2 THEN [log].interval_start + [table].interval_period
            ELSE        NULL
        END
Run Code Online (Sandbox Code Playgroud)


有人担心这会使索引混淆优化条款.另一种方法是使用多个AND/OR条件.

WHERE
   ([table].mode = 0 AND getDate() >= 0)
OR ([table].mode = 1 AND getDate() >= [log].interval_start)
OR ([table].mode = 2 AND getDate() >= [log].interval_start + [table].interval_period)
Run Code Online (Sandbox Code Playgroud)


显然,哪个表现最好将取决于数据和索引等.但是,是否有人对我目前描述的"条件条件"有任何选择或替代方案?:)

干杯,垫子.

sql optimization conditional

5
推荐指数
2
解决办法
6951
查看次数

减少SQL代码中的冗余/重复

在stackoverflow的这个问题中,接受的答案涉及多次重复相同的代码片段.根据我的经验,许多人努力通过各种方式以各种方式封装代码片段来减少这种情况;
- 可维护性(更改的地方更少)
- 可读性(一次读取代码,然后每次都是"别名")
- 等等

使用链接问题中的代码,您将如何开始减少相同代码片段的重复?或者你会原样离开吗?

(不使用替代逻辑,但坚持使用REPLACE等,只是改变相同逻辑的现状.)

Select  Case
        When CharIndex('.', Replace(URL, 'www.','')) > 0 then
           Left(Replace(URL, 'www.',''), CharIndex('.',Replace(URL, 'www.',''))-1)
        Else
           Replace(URL, 'www.','')
        End as [CleanURL]
From dbo.YourTable 
Run Code Online (Sandbox Code Playgroud)

(接受的答案已更改,因此我将代码示例复制到此处.)

编辑

只是为了澄清,我认为我已经引起了混乱.

这不是:
- 如何封装这整段代码以便重复使用?

但它更确切地说:
- 如何减少这段代码中的冗余?

sql sql-server coding-style

5
推荐指数
1
解决办法
1903
查看次数

T-SQL 2008中的REPLACE功能与T-SQL 2005不同

我正在进行从SQL Server 2005到2008迁移数据库的项目.

在测试过程中,我发现了一个不一致 按照BOL http://msdn.microsoft.com/en-us/library/ms186862(v=SQL.100).aspx(2008)和http://msdn.microsoft.com/en-us/library/ ms186862(v = SQL.90).aspx(2005)返回varchar.到目前为止两者都是一样的.但是如果我们传递给REPLACE函数列类型char则会出现差异.看看这段代码

declare @test table
(
  testcharstring char(25)
) 

insert into @test
  select 'Hello'
  union
  select 'World'
  union
  select 'Hello world '

select 
  '"'+testcharstring+'"' as original
  ,'"'+replace(testcharstring,'a','A')+'"' as afterreplace
  --,'"'+replace(rtrim(testcharstring),'a','A')+'"'
from @test
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005的结果

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello"
"Hello world              " "Hello world"
"World                    " "World"
Run Code Online (Sandbox Code Playgroud)

SQL Server 2008的结果

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello                    "
"Hello world              " …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server replace

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

大型只读表上的MySQL性能

在此先感谢您的回答,并为我的英语不好对不起,我不是母语人士。

我们实际上是在开发带有后端的手机游戏。在此手机游戏中,我们有一个货币系统,我们会跟踪每笔交易以进行验证。

为了读取用户余额,我们有一个中间表,该表中的每笔交易都会更新用户余额,因此用户永远不会直接读取交易表,以减轻高流量的负担。

事务表在后台不时地唯一读取。

这是事务表的架构:

create table money_money_transaction (
  `id`              BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  `userID`          INT UNSIGNED NOT NULL,
  `amount`          INT NOT NULL,
  `transactionType` TINYINT NOT NULL,
  `created`         DATETIME NOT NULL,

  CONSTRAINT money_money_transaction_userID FOREIGN KEY (`userID`) REFERENCES `user_user` (`id`)
    ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

我们计划有很多用户,交易表可能会增长到10亿行,所以我的问题是:

  • 会影响其他表的性能吗?
  • 如果数据库太大而无法容纳在RAM中,那么MySQL是否有某种优化措施,仅将读取最多的表存储在RAM中?
  • MySQL是否能够正确扩展到十亿行?知道我们主要进行插入操作,并且唯一索引在id上(详细信息需要id),并且没有“批量插入”(在此表上不会同时进行1M插入)
  • 另外,我们在RDS服务器上,因此我们可以切换到Aurora,并根据需要尝试进行主-主或主-从复制。您认为这对您有帮助吗?

mysql sql database amazon-aurora

5
推荐指数
1
解决办法
141
查看次数

Pandas Dataframe聚合函数也可以计算nan值

我有以下数据框

\n
print(A)\n\n   Index  1or0\n0      1     0\n1      2     0\n2      3     0\n3      4     1\n4      5     1\n5      6     1\n6      7     1\n7      8     0\n8      9     1\n9     10     1\n
Run Code Online (Sandbox Code Playgroud)\n

我有以下代码(Pandas Dataframe 计算仅立即发生的出现次数),它计算一个接一个立即发生的值的出现次数。

\n
ser = A["1or0"].ne(A["1or0"].shift().bfill()).cumsum()\n\nB = (\n        A.groupby(ser, as_index=False)\n            .agg({"Index": ["first", "last", "count"],\n                  "1or0": "unique"})\n            .set_axis(["StartNum", "EndNum", "Size", "Value"], axis=1)\n            .assign(Value= lambda d: d["Value"].astype(str).str.strip("[]"))\n    )\n\nprint(B)\n\xe2\x80\x8b\n   StartNum  EndNum  Size Value\n0         1       3     3     0\n1         4       7     4     1\n2         8       8     1     0\n3         9      10     2     1\n
Run Code Online (Sandbox Code Playgroud)\n

问题是,当出现 NaN 值时,代码不会将它们放在一个间隔中,而是始终将它们计数为一个大小的间隔,而不是例如 3 …

python dataframe pandas

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

在SQL中检索列信息(复合键)

我有一个大型SQL数据库,我需要验证表和列的结构(而不​​是数据本身).所以我需要生成所有表的列表,然后为每个表生成所有列,然后为每个列生成其数据类型,长度/精度,序号位置,以及它是否是该表的主键的一部分.

我可以通过以下查询获得我需要的大部分内容:

SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何检查列是否是主键的一部分.另外,对于那些PK由多个列组成的表,我想知道键中每列的序号位置.到目前为止我发现的信息与设置密钥而不是读取密钥有关.

我有兴趣在SQL Server和Oracle中执行此操作.

sql sql-server oracle

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

相关表中每个条目的最小值总和

假设我有2个表,查询和排名.我想知道是否有可能在排名表中找到每个查询的最小值之和?

只有当用户单击特定查询的结果时,才会输入排名表.

rank(id,key,value)查询(id,key,value)

其中rank.id = query.id

5个条目的快照

rank table
-------------
Twp0+x1uZx1Y| Twp1PK8JWhng| 16 
Twp1KU6Pgxp4| Twp1VAF0jRyI| 5
Twp2KuoJWR-8| Twp2OR5X7h78| 1 
Twp354EADhYY| Twp4AQlqjxWg| 2

query table
------------
Twp0+x1uZx1Y| |sap
Twp0-XWZ3gpk| |
Twp1CIP+oh-Q| |
Twp1KU6Pgxp4| |virtual token
Twp14RxuSBzc| |
Run Code Online (Sandbox Code Playgroud)

sql sqlite min

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

如何在SAS中查询日期

我需要将一些数据从SAS导出到CSV,以便我可以将其移动到SQL Server并将其加载到那里.(服务器无法看到对方.)

在数据中是一个具有以下定义的字段:

  • Type = Number
  • 长度= 8
  • 格式= DATETIME18.

现在我只想看看日期范围内有多少条记录:

proc sql;

SELECT COUNT(*)
FROM BNA_BASE.base_agent_bna_cust_date
WHERE bna_outcome_ts >= '04Jun12:00:00:00'd
  AND bna_outcome_ts <  '11Jun12:00:00:00'd
;

quit;
Run Code Online (Sandbox Code Playgroud)

但我总是得到0,即使我在表中可以看到有记录符合我认为我正在查询的记录,例如06JUN12:12:42:57.

有谁可以指出我的愚蠢错误?

date sas

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