#sql #sql-server #odbc #sql-server-2012-express
#sql #sql-сервер #odbc #sql-server-2012-express
Вопрос:
Я пытаюсь создать запрос для объединения 4 моих таблиц в предварительно созданную таблицу, мой запрос выполнялся гладко для первых 3 таблиц. Вот мой запрос (* запрос и таблицы уже упрощены)
INSERT INTO goaltable
SELECT b.employeeID, b.employeeName, a.grupID,
a.shiftID, b.scheduleDate, b.scheduleWorkTime,
c.hierarchyID, c.companyID, c.city1, c.phone,
d.machineID, d.tapDate, e.tapTime, e.tapID
FROM mstrattendance AS b LEFT JOIN workgrup AS a
ON b.employeeID = a.employeeID
AND b.scheduleDate = a.scheduleDate
LEFT JOIN mstremployee as c
ON b.employeeID = c.employeeID
--working query limit
LEFT JOIN rawfpmachine as d
ON b.employeeID = d.employeeID AND b.scheduleDate = d.tapDate
RIGHT JOIN rawfpmachine as e
ON b.employeeID = c.employeeID AND b.scheduleDate = d.tapDate;
Я уже пробовал другой запрос для последней части кода, но он продолжает возвращать нулевые значения или делает все таблицы нулевыми.
Вот мои таблицы
CREATE TABLE "mstrattendance" ("employeeID" varchar(16),"employeeName" varchar(64),"scheduleDate" varchar(10),"scheduleWorkTime" varchar(5));
INSERT INTO mstrattendance ("employeeID","employeeName","scheduleDate","scheduleWorkTime")
VALUES
('193011','Asuk','13-08-2016','07:30'),
('193011','Asuk','14-08-2016','07:00'),
('193011','Asuk','15-08-2016','99:99'),
('193015','Bara','13-08-2016','07:30'),
('193015','Bara','14-08-2016','07:00'),
('193015','Bara','15-08-2016','99:99'),
('193015','Anna','13-08-2016','99:99'),
('124012','Anna','14-08-2016','07:30'),
('124012','Anna','15-08-2016','07:00');
CREATE TABLE "workgrup" ("employeeID" varchar(16),"shiftID" varchar(4),"scheduleDate" varchar(10),"grupID" varchar(3));
INSERT INTO workgrup ("employeeID","shiftID","scheduleDate","grupID")
VALUES
('193011','1P1','13-08-2016','PO'),
('193011','1P1','14-08-2016','PO'),
('193011','1P1','15-08-2016','PO'),
('193015','1P1','13-08-2016','PO'),
('193015','1P1','14-08-2016','PO'),
('124012','1P2','14-08-2016','FA');
CREATE TABLE "mstremployee" ("employeeID" varchar(16),"companyID" varchar(4),"hierarchyID" varchar(10),"city1" varchar(32),"phone" varchar (16));
INSERT INTO mstremployee ("employeeID","companyID","hierarchyID","city1","phone")
VALUES
('193011','ALU','1001021','Kartaja','0832851'),
('193015','ALU','1001021','Kartaja','0832117'),
('124012','GLA','1002003','Angertang','0811345');
CREATE TABLE "rawfpmachine" ("employeeID" varchar(16),"machineID" varchar(4),"tapDate" varchar(10),"tapTime" varchar(5),"tapID" varchar (2));
INSERT INTO rawfpmachine ("employeeID","machineID","tapDate","tapTime","tapID")
VALUES
('193011','001','13-08-2016','07:50','00'),
('193011','002','13-08-2016','12:02','02'),
('193011','002','13-08-2016','12:56','03'),
('193011','001','13-08-2016','16:40','01'),
('193015','001','13-08-2016','07:58','00'),
('193015','002','13-08-2016','12:01','02'),
('193015','002','13-08-2016','12:58','03'),
('193015','001','13-08-2016','16:33','01'),
('124012','003','14-08-2016','07:54','00'),
('124012','004','14-08-2016','12:03','02'),
('124012','004','14-08-2016','12:56','03'),
('124012','003','14-08-2016','16:38','01'),
('193011','001','14-08-2016','07:58','00'),
('193011','001','14-08-2016','16:01','01');
моя цель — создать таблицу, подобную этой
CREATE TABLE "goaltable" ("employeeID" varchar(16),"employeeName" varchar(64),"scheduleDate" varchar(10),"scheduleWorkTime" varchar(5),"shiftID" varchar(4),"groupID" varchar(3)),"companyID" varchar(4),"hierarchyID" varchar(10),"city1" varchar(32),"phone" varchar (16),"machineID" varchar(4),"tapDate" varchar(10),"tapTime" varchar(5),"tapID" varchar (2));
INSERT INTO goaltable ("employeeID","employeeName","scheduleDate","scheduleWorkTime","shiftID","grupID","companyID","hierarchyID","city1","phone","machineID","tapDate","tapTime","tapID")
VALUES
('193011','Asuk','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832851','001','13-08-2016','07:50','00'),
('193011','Asuk','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832851','002','13-08-2016','12:02','02'),
('193011','Asuk','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832851','002','13-08-2016','12:56','03'),
('193011','Asuk','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832851','001','13-08-2016','16:40','01'),
('193015','Bara','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832117','001','13-08-2016','07:58','00'),
('193015','Bara','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832117','002','13-08-2016','12:01','02'),
('193015','Bara','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832117','002','13-08-2016','12:58','03'),
('193015','Bara','13-08-2016','07:30','1P1','PO','ALU','1001021','Kartaja','0832117','001','13-08-2016','16:33','01'),
('124012','Anna','14-08-2016','07:30','1P2',,'FA','GLA','1002003','Angertang','0811345','003','14-08-2016','07:54','00'),
('124012','Anna','14-08-2016','07:30','1P2','FA','GLA','1002003','Angertang','0811345','004','14-08-2016','12:03','02'),
('124012','Anna','14-08-2016','07:30','1P2','FA','GLA','1002003','Angertang','0811345','004','14-08-2016','12:56','03'),
('124012','Anna','14-08-2016','07:30','1P2','FA','GLA','1002003','Angertang','0811345','003','14-08-2016','16:38','01'),
('193011','Bara','14-08-2016','07:00','1P1','PO','ALU','1001021','Kartaja','0832117','001','14-08-2016','07:58','00'),
('193011','Bara','14-08-2016','07:00','1P1','PO','ALU','1001021','Kartaja','0832117','001','14-08-2016','16:01','01');
любая помощь приветствуется, заранее благодарю.
* ОБНОВЛЕНИЕ вот мой самый новый и близкий к цели запрос
INSERT INTO goaltable
SELECT b.employeeID, b.employeeName, b.scheduleDate, b.scheduleWorkTime, a.grupID,
a.shiftID, c.companyID, c.hierarchyID, c.city1, c.phone,
d.machineID, d.tapDate, d.tapTime, d.tapID
FROM mstrattendance AS b LEFT JOIN workgrup AS a
ON b.employeeID = a.employeeID
AND b.scheduleDate = a.scheduleDate
LEFT JOIN mstremployee as c
ON b.employeeID = c.employeeID
INNER JOIN rawfpmachine as d
ON b.employeeID = d.employeeID AND b.scheduleDate = d.tapDate
--this query is worked
но я все еще не такой, как моя таблица целей, потому что там все еще есть дубликат, только когда есть выходной.
и… Я не могу опубликовать изображение.. Как вы можете видеть, дублирование происходит каждый раз scheduleDate
, когда значение 99:99
остальных строк велико (или я не заметил)
и я не должен использовать WHERE scheduleWorkTime <> '99:99';
Комментарии:
1. «t продолжает возвращать нулевые значения или делает целые таблицы нулевыми»: пожалуйста, разверните. Внешние соединения используются, когда вы хотите включить строки, в которых нет совпадающей строки с другой стороны. Учитывая как левое, так и правое внешние соединения, я ожидал бы увидеть много нулей.
2. У вас проблема с правильным соединением. Вы устанавливаете
e
в качестве псевдонимаrawfpmachine
однако вы нигде не используетеe
часть соединения3. Я пытаюсь использовать
d
только вместоd
иe
, тогда моя память перегружена, почему idk, она возвращает много строк. и извините, если мой английский недостаточно хорош @Rumpelstinsk4. Я не понимаю, что вы подразумеваете под расширением?, этот последующий запрос (после безопасного предела) — моя последняя попытка, прежде чем спрашивать здесь, в SO, я попробовал использовать и другие объединения, как я считаю нужным (по крайней мере, в моей логике). Есть ли какой-либо способ решить эту проблему без использования объединений? или более простые объединения? @Richard
5. Развернуть: добавьте больше деталей. Может быть, пример данных, которые вы получаете, наряду с примером того, что вы ожидаете. Также сократите свой код (меньше столбцов …) до минимального повторного создания.