Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Связь с таблицей  [new]
Etamin419
Member

Откуда: Stk
Сообщений: 30
Добрый день!
Имеется такая таблица
CREATE TABLE [dbo].[regEnergoCalc] (
  [nId] int IDENTITY(1, 1) NOT NULL,
  [id_calc] int NULL,
  [step] varchar(100),
  [cMaterialCode] varchar(50))

из этой таблицы делается выборка записей например по id_calc = 2027, и также эта таблица соединена с со своей копией regEnergoCalc1, где там идет выборка по id_calc = 2032, связь между таблицей осуществлена по столбцу step (строки идентичны!) FULL OUTER JOIN
вопрос в том, что когда я включаю отображение столбцов regEnergoCalc.cMaterialCode и regEnergoCalc1.cMaterialCode, строки увеличиваются в несколько раз. как можно еще связать таблицу не прибегая к использованием курсора.
запрос:
+

SELECT     regEnergoCalc.id_calc, regEnergoCalc.cMaterialCode, regEnergoCalc.step, regEnergoCalc_1.id_calc AS Expr1, regEnergoCalc_1.cMaterialCode AS Expr2
FROM         regEnergoCalc FULL OUTER JOIN
                      regEnergoCalc regEnergoCalc_1 ON regEnergoCalc.step = regEnergoCalc_1.step
WHERE     (regEnergoCalc.id_calc = 2027) AND (regEnergoCalc_1.id_calc = 2032) AND (regEnergoCalc.step NOT IN ('Погрузка в вагонетки', 'Доставка сух. закладки +180', 
                      'Доставка сух. закладки +260'))
GROUP BY regEnergoCalc.id_calc, regEnergoCalc.step, regEnergoCalc.cMaterialCode, regEnergoCalc_1.id_calc, regEnergoCalc_1.cMaterialCode

результат:
+
id_calc cMaterialCode step id_calc1 cMaterialCode1
2027 NULL Буровзрывные работы +180 2032 NULL
2027 NULL Буровзрывные работы +260 2032 NULL
2027 5966 Доставка сырья до склада +260 2032 5965
2027 5966 Доставка сырья до склада +260 2032 5966
2027 5966 Доставка сырья до склада +260 2032 5968
2027 5966 Доставка сырья до склада +260 2032 5969
2027 5968 Доставка сырья до склада +260 2032 5965
2027 5968 Доставка сырья до склада +260 2032 5966
2027 5968 Доставка сырья до склада +260 2032 5968
2027 5968 Доставка сырья до склада +260 2032 5969

как нужно:
+
id_calc cMaterialCode step id_calc1 cMaterialCode1
2027 NULL Буровзрывные работы +180 2032 NULL
2027 NULL Буровзрывные работы +260 2032 NULL
NULL NULLДоставка сырья до склада +260 2032 5965
2027 5966Доставка сырья до склада +260 2032 5966
2027 5968Доставка сырья до склада +260 2032 5968
2027 5969Доставка сырья до склада +260 2032 5969
24 окт 12, 14:29    [13368742]     Ответить | Цитировать Сообщить модератору
 Re: Связь с таблицей  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
судя по требуемому результату нужно добавить

AND (regEnergoCalc.cMaterialCode = regEnergoCalc_1.cMaterialCode)
24 окт 12, 14:52    [13368897]     Ответить | Цитировать Сообщить модератору
 Re: Связь с таблицей  [new]
Etamin419
Member

Откуда: Stk
Сообщений: 30
LexusR
судя по требуемому результату нужно добавить

AND (regEnergoCalc.cMaterialCode = regEnergoCalc_1.cMaterialCode)


При это теряется часть данных, где должны быть пустые строки, т.е. остается такое выражение:
+

2027 5966 Доставка сырья до склада +260 2032 5966
2027 5968 Доставка сырья до склада +260 2032 5968
2027 5969 Доставка сырья до склада +260 2032 5969
24 окт 12, 15:19    [13369136]     Ответить | Цитировать Сообщить модератору
 Re: Связь с таблицей  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Etamin419,

AND isnull(regEnergoCalc.cMaterialCode, 'НетТакогоКода') = isnull(regEnergoCalc_1.cMaterialCode, 'НетТакогоКода')
24 окт 12, 15:26    [13369189]     Ответить | Цитировать Сообщить модератору
 Re: Связь с таблицей  [new]
Etamin419
Member

Откуда: Stk
Сообщений: 30
Alexander Titkin
Etamin419,

AND isnull(regEnergoCalc.cMaterialCode, 'НетТакогоКода') = isnull(regEnergoCalc_1.cMaterialCode, 'НетТакогоКода')

Спасибо, помогло отобразить пустые записи по столбцу cMaterialCode, но не отображается последняя запись которая есть во второй таблице regEnergoCalc_1

Результат:
+
2027 null Буровзрывные работы +180 2032 null
2027 null Буровзрывные работы +260 2032 null
null null Доставка сырья до склада штольни +180 2032 5965
2027 5966 Доставка сырья до склада штольни +180 2032 5966
2027 5967 Доставка сырья до склада штольни +180 2032 5967
2027 5968 Доставка сырья до склада штольни +180 2032 5968
2027 5969 Доставка сырья до склада штольни +180 2032 5969

PS: красным отмечено недостающая строка
уже и запрос весь сделал по аналогу isnull
Запрос:
SELECT     isnull(regEnergoCalc.id_calc,''), isnull(regEnergoCalc.cMaterialCode,''), isnull(regEnergoCalc.step,''), isnull(regEnergoCalc_1.id_calc,'') AS Expr1, 
isnull(regEnergoCalc_1.cMaterialCode,'') AS Expr2
FROM         regEnergoCalc FULL OUTER JOIN
                      regEnergoCalc regEnergoCalc_1 ON isnull(regEnergoCalc.step,'') = isnull(regEnergoCalc_1.step,'')
WHERE     (regEnergoCalc.id_calc = 2027) AND (regEnergoCalc_1.id_calc = 2032) AND (regEnergoCalc.step NOT IN ('Погрузка в вагонетки', 'Доставка сух. закладки +180', 
                      'Доставка сух. закладки +260'))AND (isnull(regEnergoCalc.cMaterialCode,'') = isnull(regEnergoCalc_1.cMaterialCode,''))
GROUP BY isnull(regEnergoCalc.id_calc,''), isnull(regEnergoCalc.step,''), isnull(regEnergoCalc.cMaterialCode,''), isnull(regEnergoCalc_1.id_calc,''), 
isnull(regEnergoCalc_1.cMaterialCode,'')
order by isnull(regEnergoCalc.step,'')

25 окт 12, 06:28    [13371994]     Ответить | Цитировать Сообщить модератору
 Re: Связь с таблицей  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Etamin419,

WHERE     (regEnergoCalc.id_calc = 2027 or regEnergoCalc.id_calc is null)
25 окт 12, 20:26    [13376627]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить