Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 22:35   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию SQL MS Server: примеры "многоярусной" выборки данных

Добрый вечер!
Посоветуйте, где можно посмотреть интересные примеры одновременной выборки данных как минимум из 4 таблиц.
Может быть у Вас что-то есть из личной практики?
А то у меня хромают JOIN - вроде бы все так просто, пока дело до реальных заданий не доходит.
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 03.11.2011, 22:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот интересная интерпретация
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.11.2011, 09:27   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот мой пример:
Код:
		insert into orant2.dbo.KS (IDModel,IDAsm,IDPart,Штуки)
			select distinct
			  m0.ID as IDModel
			  ,pTo.ID as IDAsm
			  ,pWhat.ID as IDPart
			  ,r.KOLKOMP					  0,SYSDATETIME()
			from orant.OIS_READY.RELCOMP r
			 left join orant2.dbo.Models m0 on m0.Naim=r.OBIZDKUDA
			 left join orant2.dbo.Models m on m.Naim=r.OBIZDCHTO
			 left join orant2.dbo.Parts pTo on (pTo.IDModel=m.ID)and(pTo.Обозначение=r.OBKOMPKUDA)
			 left join orant2.dbo.Parts pWhat on (pWhat.IDModel=m.id)and(pWhat.Обозначение=r.OBKOMPCHTO)
			where (YEAR(r.DATEOUT)=3000)and(r.OBIZDKUDA=@Model)
В одной таблице спаяны все данные (1 НФ), я их этим запросом вычленяю, убирая мусор.
Проблема была в том что связки были разбросаны по всей таблице, и ключевыми полями были текстовые поля с названиями узлов а не кодами.
Т.е. эта огромная таблица была одновременно и справочником и рабочей территорией.
Пришлось конвертировать в таблицу идентификаторов.
Узел сборки мог иметь кучу уровней входимости (детали в деталях...).
Поэтому приходилось несколько алиасов создавать.

Вот еще жуткая функция:
Код:
CREATE FUNCTION [dbo].[ВзятьСборку4]
(
  @Model nvarchar(20),@Asm nvarchar(20),@Obozn nvarchar(10)
)
RETURNS TABLE
AS
RETURN
(
	Select
	   ks.ID as idks,
	   m.id as IDModel
	  ,p2.id as ID
	  ,m2.naim as Применяемость
	  ,p2.[Обозначение]
      ,p2.[Наименование]
      ,p2.[Характеристика]
      ,p2.[ГОСТ]
      ,p2.[Принадлежность]
      ,p2.[Масса]
      ,ks.Штуки
      ,p2.[Формат]
      ,p2.[Позиция]
      ,p2.[Зона]
      ,p2.[Примечание]
      ,p2.[Материал строкой] as Материал
      /*,mt.Name+' '+mt.gost as Материал]*/
      ,p2.[Файл],
       (Select * from Исполнитель(p2.Разработал)) as Разработал,
       (Select * from Исполнитель(p2.Проверил)) as Проверил,
       (Select * from Исполнитель(p2.техконтроль)) as Техконтроль,
       (Select * from Исполнитель(p2.Утвердил)) as Утвердил,
       (Select * from Исполнитель(p2.Нормоконтроль)) as Нормоконтроль,
       (Select * from Исполнитель(p2.Принял)) as Принял,
       (select top 2 COUNT(*) as [Количество применений]  from ks ks2
			 left join Parts p3 on p3.ID=ks2.IDPart
			where (ks2.IDPart=p2.id)and(ks2.idmodel<>p3.IDModel)and(ks2.idmodel<>m.id))
		 as [Количество применений]
	from KS
	 join models m on (m.ID=ks.IDModel)and(m.Naim=@Model)
	 left join parts p on (p.ID=ks.IDAsm)
	 left join parts p2 on (p2.ID=ks.IDPart)
	 left join models m2 on (m2.ID=p2.IDModel)
	 --left join Материалы mt on (p2.Материал=mt.idmat)
		Where
	 --Если просто получить главную сборку
	 (
	  (@Asm='0')or(@Asm is null)and(p.Обозначение is null)
	 )
	or -- Если получить некую сборку
	(
	 (@Asm<>'0')and(not @Asm is null)and(p.Обозначение=@Asm)and(@Obozn is null)
	)
	or -- Найти по части обозначения везде
	(
	  (@Asm is null)or(@Asm='')and(not @Obozn is null)and(p2.Наименование like '%'+@Obozn+'%')
	)
	or --Найти в конкретной сборке
	(
	 (not @Asm is null)and(@Asm<>'')and(p.Обозначение=@Asm)and(not @Obozn is null)and(p2.Наименование like '%'+@Obozn+'%')
	)


	--order by p2.[Тип документа], p2.Обозначение
)
GO
Выборка узлов сборки с возможностью поиска по обозначению. Если обозначение не определено - выдать все.
Короче этой функой я хотел убить двох зайцив - и общая выборка и поисковая система. получилось однако
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2011, 19:58   #4
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Ага, спасибо мальчики, буду разбираться. А то тут проверочная работа была - и в результате, куски я прописала, а связать так, чтобы все это вместе работало не могу. А за огрызки оценки не ставят.
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55
Подскажите ссылку на примеры к книге Архангельского "Программирование в Делфи7". SkAndrew Свободное общение 0 24.11.2008 12:17