sql - 为 T-SQL SELECT 语句中的列组合动态生成唯一主键
问题描述
有人知道是否有办法在 MS SQL Server/Transact SQL SELECT 语句中生成唯一的整数主键?
我遇到的问题是我必须通过列组合(如复合主键)以编程方式合并 3 个数据表。组合不是实际的主键。
我的表看起来有点像这样:
Table 1: Base Table which is needed to be filled:
+----------+------+----------------+------------+----------+
|operatorid|opcode|bookkeeping_date|cash_amount |tip_amount|
+----------+------+----------------+------------+----------+
| 1 | 1 | 01.01.2018 |null |null |
+----------+------+----------------+------------+----------+
| 1 | 1 | 01.02.2018 |null |null |
+----------+------+----------------+------------+----------+
| 2 | 2 | 01.02.2018 |null |null |
+----------+------+----------------+------------+----------+
Table 2: Cash Data Table to be merged with base table
+----------+------+----------------+------------+
|operatorid|opcode|bookkeeping_date|cash_amount |
+----------+------+----------------+------------+
| 1 | 1 | 01.01.2018 |2.50 |
+----------+------+----------------+------------+
| 1 | 1 | 01.02.2018 |17.80 |
+----------+------+----------------+------------+
| 2 | 2 | 01.02.2018 |4.20 |
+----------+------+----------------+------------+
Table 3: Tip Data Table to be merged with base table:
+----------+------+----------------+----------+
|operatorid|opcode|bookkeeping_date|tip_amount|
+----------+------+----------------+----------+
| 1 | 1 | 01.01.2018 |3.50 |
+----------+------+----------------+----------+
| 1 | 1 | 01.02.2018 |4.20 |
+----------+------+----------------+----------+
| 2 | 2 | 01.02.2018 |0.00 |
+----------+------+----------------+----------+
如此简化的目标是通过合并数据表来填充“表 1:基表”。在选择数据表后,我们已经有了 ac# 方法来按主键管理合并。
我现在的问题是我没有唯一的主键,而是“operatorid”和“bookkeeping_date”的组合。
有没有一种方法可以修改每个表的 SELECT 语句,以通过哈希或校验和或类似的东西获得一个唯一的整数?
编辑:现金金额和小费金额是表选择语句中使用聚合 SUM() 的总和值。
此致
依附曲
解决方案
我确信这些表中的数据可以定期更改,并且由于总是可以引入历史记录而抛出任何排名或行号函数,因此最好走一条同时使用 operatorid 和 bookkeeping_date 的路线创建一个唯一的密钥。
一种简单的方法是将日期转换为整数值,并将 operatorid 附加到末尾。
2018 年 1 月 1 日变为“43099”。Operatorid 1 在末尾变为“1”(如果这些 ID 有机会变为更大的整数,则为“01”/“001”/“0001”)。
select
convert(int, convert(varchar(6), convert(int, (convert(datetime,replace(bookkeeping_date,'.','-'),110))))
+ convert(varchar(2), operatorid)) as unique_id
from (select 1 as operatorid, 1 as opcode, '01.01.2018' as bookkeeping_date, 3.50 as tip_amount) tip
在日期整数达到六位数之前您还有几个世纪的时间,这可能会导致一些并发症 - 但您也可以将日期整数转换为带有尾随零的东西,以适应它,如果它是一个问题。
推荐阅读
- razor-pages - 如何在没有重定向的情况下返回不同的 Razor 页面?
- javascript - 如何将javascript(js)映射传递给spring boot Controller?
- java - 连接池缺少连接
- google-apps-script - 合并来自 Google 表单提交的响应数据,其中受访者具有相同的姓名
- r - 如何更改从 R Markdown 生成的单词中的默认页面背景颜色?
- javascript - 为什么我在分析转换属性的过程中得到了意外的错误值 translate(Nan, 450)?
- delphi - 从 Windows 服务应用程序发送带有 delphi indy 的电子邮件
- django - 为什么 DjangoRF 序列化器 is_valid 为假?
- python - python函数的输出未排序
- excel - Excel:从条件中获取行