Flower@12 Ответов: 2

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


У меня есть 3 таблицы и одна таблица просмотра они есть
1)CompanyMaster(CompanyID,Com.Name)
2)DepartmentMaster(Отдел.Удостоверение личности,Depart.Name)
3)NatureOFWork(NatOFWorkID.ИД,уходите.ID,NatOfWork)
4)ShiftMAster(ShiftMAsterID,CompanyID)
4)ShiftDetail(ShiftMAsterID,Depart.ID,NatOFWorkID,ShiftName,NoOfPerson)
Просмотр таблицы есть
1)ShiftNo(Id,ShiftName)
Id ShifTName
1 S1
2 С2
3 S3
Теперь мой вопрос заключается в том, чтобы объединить эти таблицы и представления, чтобы получить следующий формат ответа

Ком.Название Отдела.Наименование Нац.Работа ShiftName Нет.Человек
Азбука Dept1 Работы1 С1 10
Азбука Dept1 Работы1 С2 20
Азбука Dept1 Работы1 С3 30

Что я уже пробовал:

Я попробовал выполнить следующий запрос

Выберите CompName А.,Б. DepartName,С. NAtureOfWork,Д. ShiftName,Ф. NoOfPersons
от tblCompanyMaster A,vwShiftName D,tblDepartMaster B
присоединяйтесь к tblNatOfWorkDetail C на C. DeptId=B. DeptID,
tblShiftMaster е
внутреннее соединение tblCompanyMaster G на G. CompID=E. companyID
Левое внешнее соединение tblShiftDetail F на F. ShiftID=E.ShiftID
Где A. CompID=1

Но это видно
Com.Name Dept.Name Nat.Work ShiftName No.Persons
ABc       Dept1     Work1   S1        10
ABC       Dept1     Work1   S2        10
ABC       Dept1     Work1   S3        10
ABc       Dept1     Work1   S1        20
ABC       Dept1     Work1   S2        20
ABC       Dept1     Work1   S3        20
ABc       Dept1     Work1   S1        30
ABC       Dept1     Work1   S2        30
ABC       Dept1     Work1   S3        30


Пожалуйста, помогите мне..

CHill60

Нам понадобятся образцы данных для всех таблиц. У вас явно есть несколько элементов на один идентификатор на одном из них

Santosh kumar Pithani

Ваш вид "ShiftNo" имеет (3 строки), поэтому он возвращает записи как M*N ( просмотр строк * каждой записи таблицы).Нет никакой связи между представлением и другими таблицами, поэтому дайте правильное отношение.

RmcbainTheThird

наряду с образцами данных поможет схема

[no name]

1)CompanyMaster(CompanyID numeric,Com.Наименование тип nvarchar)
2)DepartmentMaster(Отдел.Идентификационный номер,отбыть.Наименование тип nvarchar)
3)NatureOFWork(NatOFWorkID.Идентификационный номер,отбыть.ID числовой,NatOfWork nvarchar)
4)ShiftMAster(ShiftMAsterID числовой,CompanyID числовой)
4)ShiftDetail(ShiftMAsterID numeric,Depart.ID числовой,числовой NatOFWorkID,ShiftName тип nvarchar,NoOfPerson числовые

ZurdoDev

Похоже, вам придется объединиться. Или вам может понадобиться исправить соединение. Мы не знаем, каковы ваши данные, поэтому я не уверен, что вы хотите, чтобы мы сделали.

2 Ответов

Рейтинг:
5

CHill60

Вы использовали соединения непоследовательно ... перечисление таблиц, разделенных запятыми, а затем использование предложения WHERE очень старомодно, сбивает с толку и не рекомендуется. Использование явного соединения с положениями.

Одна из причин, по которой вы получаете слишком много данных, заключается в том, что вы не включили в предложение WHERE ничего, что указывало бы, как эти таблицы должны быть объединены (и, следовательно, почему этот подход не рекомендуется).

У вас нет абсолютно никакой необходимости в этом представлении, поскольку необходимые вам детали уже находятся на ShiftDetail - присоединение к большему количеству таблиц, чем вам нужно, часто может привести к возвращению нескольких строк, когда вы ожидали только одну.

То же самое относится и к самосоединению обратно к CompanyMaster (G)- почему это вообще существует?

Упрощенный запрос теперь выглядит следующим образом:

Select A.CompName,B.DeptNAme,C.NatOfWork,F.ShiftName,F.NoOfPersons
from #CompanyMaster A
inner join #ShiftMAster E ON A.CompID=E.companyID
inner Join #ShiftDetail F on F.ShiftID=E.ShiftID
LEFT OUTER join #NatOfWork C on C.DeptId=F.DeptID
LEFT OUTER JOIN #DepartmentMAster B ON B.DeptId = F.DeptID
Where A.CompID=1
Гораздо легче увидеть, что происходит. Однако если я выполню этот запрос, то все равно получу несколько строк. Если я включу ORDER BY A.CompName,B.DeptNAme,C.NatOfWork,F.ShiftName,F.NoOfPersons Я получаю подсказку (я использовал данные из вашего удаленного комментария) :
ABC	Dept1	Work1	S1	5
ABC	Dept1	Work1	S1	10
ABC	Dept1	Work1	S2	6
ABC	Dept1	Work1	S2	20
ABC	Dept1	Work1	S3	7
ABC	Dept1	Work1	S3	30
ABC	Dept1	Work2	S1	5
ABC	Dept1	Work2	S1	10
ABC	Dept1	Work2	S2	6
ABC	Dept1	Work2	S2	20
ABC	Dept1	Work2	S3	7
ABC	Dept1	Work2	S3	30
Эта первая строка Dept1, Work1, S1 5 people неверна - элемент с 5 людьми на самом деле принадлежит NatOfWork Work2 так почему же он вышел как Work1?

Причина в том, что соединения должны быть более конкретными, ShiftDetail включает в себя идентификатор NatOfWork, но до сих пор мы его игнорировали. Измените запрос на
Select A.CompName,B.DeptNAme,C.NatOfWork,F.ShiftName,F.NoOfPersons
from #CompanyMaster A
inner join #ShiftMAster E ON A.CompID=E.companyID
inner Join #ShiftDetail F on F.ShiftID=E.ShiftID
LEFT OUTER join #NatOfWork C on C.DeptId=F.DeptID AND C.NatWorkID = F.NAtOFIDLEFT OUTER JOIN #DepartmentMAster B ON B.DeptId = F.DeptID
Where A.CompID=1
ORDER BY  A.CompName,B.DeptNAme,C.NatOfWork,F.ShiftName,F.NoOfPersons
и вы получите желаемые результаты.

Вы можете найти эту статью CodeProject полезной Визуальное представление SQL-соединений[^]


[no name]

Спасибо вам сэр

CHill60

С удовольствием!

Рейтинг:
20

Santosh kumar Pithani

--Its a estimated query it will help for you..
SELECT 
 A.CompName 
,B.DepartName 
,C.NAtureOfWork 
,F.ShiftName
,F.NoOfPersons
FROM 
 ShiftMAster AS E
INNER JOIN CompanyMaster AS  A 
                         ON (A.companyID=E.companyID)
INNER JOIN ShiftDetail AS F 
                         ON (F.ShiftMAsterID=E.ShiftMAsterID) 
INNER JOIN DepartmentMaster AS B 
                         ON (B.DepartID=F.DepartID)
INNER JOIN NatOfWorkDetail AS C 
                         ON (C.NatOFWorkIDID=F.NatOFWorkIDID
						        AND C.DepartID=F.DepartID
							 )
     
	 WHERE A.CompID=1 
	        --AND EXISTS(select 1 FROM ShiftNo AS D WHERE  D.ShifTName=F.ShiftName)


CHill60

Однако это не дает тех результатов, которых хотела ОП Мои извинения, я все неправильно понял

Santosh kumar Pithani

Никто не ждет извинений от мастеров.Мы не знаем, какой запрос является правильным или неправильным, это ошибка OP, то есть я дал все внутренние соединения.В противном случае мой ответ был бы другим с правильными соединениями

CHill60

"Никто не ждет извинений от мастеров" . Я всегда стараюсь признаться, когда ошибаюсь. Мы все вместе находимся в этом учебном путешествии :-)