Nishant.Chauhan80 Ответов: 3

Пожалуйста, помогите! Выберите запрос в SQL


ID	Name	   Designation	Level	        userid
15	Sh. B.M. Babbar	SDE-R2	00010104	       ELE15
16	Sh. Surinder  	AE-R2	0001010401	        ELE16
17	Sh. Roop Lal	JE-R2	000101040101	ELE17
18	Sh. Mansatinder	JE-R3	000101040102	ELE18
328	testnews	    JE_R2	000101040103	JE_R2
329	testnews	   JE_R2	000101040104	JE_R2
330	testnew12	   AE-R3	000101040105	AE-R3
331	testnews	   AE-R3    000101040106	AE-R3



Это мой employeeList столом и над следующей таблице результата, Сде(Сде-Р2) в качестве родителя в соответствии с ае как ребенок и ае(ае-Р2) в соответствии Йе как subchild desiganation. я хочу получить только sde под данными AE через уровень

я пробую этот запрос "Выберите * из списка сотрудников, где уровень типа '00010104%"но показываю все записи

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

я хочу показать только дочерние данные по родительским данным (SDE-R2 00010104)
"
16	Sh. Surinder  	AE-R2	0001010401	        ELE16
"

CHill60

Ваша структура данных не ясна - как "уровень" указывает на родительские или дочерние данные?

Nishant.Chauhan80

уровень указывает на иерархию
Сде родителей
AE ребенок
Subchild Йе

я хочу показать только дочерние данные через родительский уровень

CHill60

Так что включите это в свое предложение where ... и обозначение типа " AE%"

Jörgen Andersson

Это перечисляемый путь. Это один из трех основных способов хранения иерархических данных. То же самое, что MS использует в hierarchyid

OriginalGriff

В этом нет никакого смысла. Ваш запрос будет - правильно - показывать все записи, потому что это то, что вы сказали ему сделать.
Однако совершенно непонятно, что именно вы хотите показать - я понятия не имею, что такое "уровень", где хранятся "данные АЭ" или какие на Земле должны быть отношения.

Начните с того, что покажите нам, какие именно выходные данные вы хотите получить, и объясните, почему другие строки не должны включаться.

Nishant.Chauhan80

я хочу показать только дочерние данные по родительским данным (SDE-R2 00010104)

"16 Ш. Суриндер ае-Р2 0001010401 ЕЛЕ16"

OriginalGriff

Да, но ..... мы понятия не имеем, как вы определяете понятия "родитель" и "ребенок" - и это совсем не очевидно из ваших данных. Что определяет его как "родителя", а шляпа говорит: "это дитя ..."?
Обычно у вас есть столбец "ID" и столбец "ParentID", который ссылается на него (часто через отношение внешнего ключа). Но я не вижу здесь ничего подобного.

Jörgen Andersson

Это перечисляемый путь, в отличие от списка смежности или вложенного набора

OriginalGriff

А это очень плохая идея ... :вздох:

Jörgen Andersson

Скажите microsoft :-)
https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference?view=sql-server-2017

Все они имеют свое применение. На моей предыдущей работе мы в конечном итоге использовали как перечислимые пути, так и списки смежности по соображениям производительности.
Довольно хороший обзор здесь: https://www.cnblogs.com/ttltry-air/archive/2012/08/10/2633164.html

3 Ответов

Рейтинг:
2

Slacker007

я хочу показать только дочерние данные по родительским данным (SDE-R2 00010104)

псевдо SQL запрос:

Select * from <<ChildTable>>
Inner join <<ParentTable>>
on <childtable.FKID>> = <<ParentTable.PKID>>
Where <<ParentTable.<<level>> like '00010104%'


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

Select * это хорошо для тестирования и для дампов данных, но это все, ИМХО.


Рейтинг:
2

Jörgen Andersson

Поскольку вам нужен только уровень ниже этого запроса, вы должны выполнить эту работу:

SELECT   *
FROM    EmployeeList
WHERE   LEVEL LIKE '00010104__'

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

И да, никогда не используйте SELECT * в производственном коде.


Рейтинг:
0

CHill60

Я думаю, что решение 1 попало не с того конца палки. Основываясь на вашем комментарии, Вам просто нужно добавить предложение and И в свой запрос (и, как указал Slacker007, исправить свой список столбцов). например.

Select ID, Name, Designation, Level, userid
from EmployeeList where level like '00010104%'
and Designation like 'AE%'
Если вы также хотите включить упомянутое вами обозначение "sub-child", то добавьте предложение OR, но вам нужно будет заключить его в скобки, например
Select ID, Name, Designation, Level, userid
from EmployeeList where level like '00010104%'
and ( Designation like 'AE%' or Designation like 'JE%' )