使用查询&更新列值加入

时间:2016-01-15 17:34:48

标签: sql sql-server

我正在尝试在我的数据库中实际发生交易时建立一个日期,因为系统按交易ID使用了跟踪而不是日期。以下查询是我尝试过的,已经运行但未更新任何值的查询:

     Static hostname: xxxx
     Icon name: computer-laptop
     Chassis: laptop
     Boot ID: b3a1f952c514411c8c4xxxxxxxxxxxx
     Operating System: Ubuntu 14.04.3 LTS
     Kernel: Linux 3.19.0-43-generic
     Architecture: x86_64

我已经测试了以下查询,以确保我正在寻找的值是正确的,没有任何问题:

UPDATE dbo.transactions
SET t.time_ran=e.time_ran
FROM transactions t
CROSS JOIN eod_master e
WHERE(t.clinic=e.clinic) AND (t.tran_num BETWEEN e.start_tran_num AND e.end_tran_num)

由于没有任何错误,我不确定为什么没有更新这些值。我的SELECT t.tran_num, t.clinic, e.time_ran, t.date_entered, t.clinic FROM transactions t CROSS JOIN eod_master e WHERE(t.clinic=e.clinic) AND (t.tran_num BETWEEN e.start_tran_num AND e.end_tran_num) 抛出一个错误t.time_ran时遇到了错误但我在测试时通过删除该表的别名来解决它。

更新:

只是为了澄清表格的设置方式。我有35个不同的The multi-part identifier "t.time_ran" could not be bound.值,每个商家每天都有clinicstart_tran_numend_tran_num是一天结束时的time_ran。 IE的开始和结束声明不会重叠,IE:第一天从1开始,到200结束,第二天自动从201开始,等等。

enter image description here

以下是数据结果的模拟示例。我在所有提供的见解之后尝试了以下代码而没有任何更改。 datetime列中没有NULL值,当前所有eod_master.time_ran都为空,因此查询不应尝试放入已存在的相同值。

transations.time_ran

2 个答案:

答案 0 :(得分:1)

你可以尝试在UPDATE语句中使用Alias,所以:

UPDATE
  t
SET
  t.time_ran=e.time_ran
FROM
  transactions t
  INNER JOIN eod_master e ON
    t.clinic=e.clinic
WHERE
  t.tran_num BETWEEN e.start_tran_num AND e.end_tran_num;

UPDATING加入时我遇到了类似的问题。

答案 1 :(得分:0)

交叉连接(可以)为每一行返回多个结果;您无法更新以将其设置为等于1个以上的值,因此您需要使用常规连接,而不是交叉连接。鉴于您使用范围执行此操作,您可能需要使用子查询来查找匹配的单个事务,并从中进行更新。