Как объединить 4 или более таблиц с разными объединениями, избегая незначительного дублирования

#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, она возвращает много строк. и извините, если мой английский недостаточно хорош @Rumpelstinsk

4. Я не понимаю, что вы подразумеваете под расширением?, этот последующий запрос (после безопасного предела) — моя последняя попытка, прежде чем спрашивать здесь, в SO, я попробовал использовать и другие объединения, как я считаю нужным (по крайней мере, в моей логике). Есть ли какой-либо способ решить эту проблему без использования объединений? или более простые объединения? @Richard

5. Развернуть: добавьте больше деталей. Может быть, пример данных, которые вы получаете, наряду с примером того, что вы ожидаете. Также сократите свой код (меньше столбцов …) до минимального повторного создания.