簡體   English   中英

SQL更新值是來自另一個表的值

[英]SQL update value to be value from another table

我有三個可以全部由某些ID連接的表,並且我需要基於其中一個表中已經存在的值來填充新列。

這是模式:

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_attendance_code_group` int(11) DEFAULT '18',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO users (user_attendance_code_group) VALUES 
  (1),
(1),
(3),
(2),
(2),
(2);

CREATE TABLE `attendance_time_index` (
  `time_index_id` int(11) NOT NULL AUTO_INCREMENT,
  `time_index_value` varchar(45) NOT NULL,
  `time_index_user_id` int(11) NOT NULL,
  `time_index_default` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`time_index_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO attendance_time_index (time_index_value, time_index_user_id) VALUES 
  ('AM', 3),
('PM', 3),
  ('AM', 4),
('PM', 4),
  ('AM', 5),
('PM', 5),
  ('AM', 6),
('PM', 6),
  ('AM', 7),
('PM', 7),
  ('AM', 8),
('PM', 8);

CREATE TABLE `attendance_code_groups` (
  `group_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `group_am_default` varchar(3) DEFAULT NULL,
  `group_pm_default` varchar(3) DEFAULT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO attendance_code_groups (group_am_default, group_pm_default) VALUES 
  ('A','B'),
('X','Y'),
  ('1','2');

我需要更新time_index_default同來自值列group_am_defaultgroup_pm_default取決於值是否在time_index_value (上午或下午)

更新查詢將是什么?

我嘗試了以下操作,但是子查詢返回的行多...

UPDATE attendance_time_index SET time_index_default = (
SELECT test FROM (SELECT CASE WHEN ati.time_index_value = 'PM' THEN acg.group_pm_default ELSE acg.group_am_default END AS test
FROM attendance_time_index ati
JOIN users u ON ati.time_index_user_id = u.user_id
JOIN attendance_code_groups acg ON u.user_attendance_code_group = acg.group_id) AS x) 

如果有幫助,這里有一個SQLFiddle ... http://sqlfiddle.com/#!2/1846e/4

UPDATE attendance_time_index ati 
JOIN users u ON ati.time_index_user_id = u.user_id
JOIN attendance_code_groups acg ON u.user_attendance_code_group = acg.group_id
SET ati.time_index_default = CASE WHEN ati.time_index_value = 'PM' THEN acg.group_pm_default ELSE acg.group_am_default END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM