Имя: Пароль:
IT
 
"ОБЪЕДИНИТЬ ВСЕ" в запросе MS SQL
0 Vladal
 
10.05.12
18:36
У меня есть простой запрос по трём таблицам. Я хочу скомпоновать существующие не повторяющиеся записи.

SELECT distinct [DBCode] as Id, [DBCode] as Door, null as DocIn, null as Cards FROM [EX].[dbo].[DoorCounters]
union all
SELECT distinct [DBCode] as Id, null as door, [DBCode], null  as docin FROM [EX].[dbo].[DocumentsIn]
union all
SELECT distinct [DBCode] as Id, null as door, null as docin, [DBCode] as DisCounts FROM [EX].[dbo].[DiscountCards]

Поле DBCode - идентификатор распределенной базы. Я хочу получить такую таблицу:

Id    Door    DocIn    Cards
AT    AT    AT    AT
AG    AG    AG    NULL
AJ    AJ    NULL    NULL
BX    BX    BX    BX
AR    AR    AR    AR

Т.е. нет входящих документов от базы AJ и нет карточек от баз AJ и AG
А d моём запросе получается такая:

Id    Door    DocIn    Cards
AT    AT    NULL    NULL
AG    AG    NULL    NULL
AJ    AJ    NULL    NULL
BX    BX    NULL    NULL
AR    AR    NULL    NULL
AG    NULL    AG    NULL
AR    NULL    AR    NULL
AT    NULL    AT    NULL
BX    NULL    BX    NULL
AR    NULL    NULL    AR
AT    NULL    NULL    AT
BX    NULL    NULL    BX

Как исправить?
1 acsent
 
10.05.12
18:37
сгруппировать и максимум
2 Vladal
 
10.05.12
18:38
ага. А каким словом это SQL?
3 aleks-id
 
10.05.12
18:40
groupby
4 Fragster
 
гуру
10.05.12
18:41
попутал union и join
5 Vladal
 
10.05.12
18:44
Грубо говоря, в 1С это я делал примерно так:

ВЫБРАТЬ
   Банки.Ссылка,
   Банки.Код КАК Банки,
   "" КАК Счета,
   "" КАК Карты
ИЗ
   Справочник.Банки КАК Банки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   БанковскиеСчета.Ссылка,
   "",
   БанковскиеСчета.Код,
   ""
ИЗ
   Справочник.БанковскиеСчета КАК БанковскиеСчета

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ИнформационныеКарты.Ссылка,
   "",
   "",
   ИнформационныеКарты.Код
ИЗ
   Справочник.ИнформационныеКарты КАК ИнформационныеКарты
---------------------------------------------------
(4) Джоин вооще ругается, что неправильная конструкция. Как его синтаксис узнать?
6 Fragster
 
гуру
10.05.12
18:45
(5).2 синтаксис такой же, как в 1с
7 Vladal
 
10.05.12
18:47
(6) не хотит.
8 catena
 
10.05.12
18:52
(4)Почему? "Объединить все" - это же как раз union all

Из(5) таблица (0) ну никак не получится.
9 Господин ПЖ
 
10.05.12
18:52
>Как его синтаксис узнать?

поставить BOL к скулю... или в msdn пошарить
10 Господин ПЖ
 
10.05.12
18:53
>Из(5) таблица (0) ну никак не получится.

+ 100
11 Vladal
 
10.05.12
18:54
(8) это я к примеру. Так как сделать таблицу в (0)?
12 catena
 
10.05.12
18:58
(11)Не знаю, я вообще не поняла, что требуется. Но из (5) точно не получится - там тоже будут "" во всех строках.
13 Vladal
 
10.05.12
18:59
(12) У меня есть три таблицы, я из них получаю идентификаторы баз, которые прислали свои данные (Выбрать Различные)
14 catena
 
10.05.12
19:00
(13)Нет, ты получаешь все различные идентификаторы баз и расставляешь их в разном порядке в строках. Зачем не понятно.
15 Vladal
 
10.05.12
19:01
Т.е. они шлют свои данные и в каждой строке свой ИД.

Я же хочу получить сводную таблицу, какие данные в целом пришли из каких баз?

Id    Door    DocIn    Cards
AT    AT      AT    AT
AG   AG     AG    NULL
AJ    AJ      NULL    NULL
BX    BX      BX    BX
AR    AR      AR    AR

Т.е. нет входящих документов от базы AJ и нет карточек от баз AJ и AG
16 Fragster
 
гуру
10.05.12
19:01
500 рублей
17 Vladal
 
10.05.12
19:03
Может, заменить значения? Если не Null, то просто "+". Тогда будет так:

Id   Door  DocIn  Cards
AT     +    +    +
AG     +    +    NULL
AJ     +    NULL    NULL
BX     +    +    +
AR     +    +    +
18 Vladal
 
10.05.12
19:03
(16) 500 рублей на 1слансер. Это миста
19 Vladal
 
10.05.12
19:03
(16) Вот ты просто подскажи, как написать, я же не прошу вместо меня писать.
20 Fragster
 
гуру
10.05.12
19:03
(18) ну, чем мог - помог в (4)
21 Vladal
 
10.05.12
19:03
те более, я уже селал какие-то шаги
22 Vladal
 
10.05.12
19:04
(20) Скажи, как этот джоин работает в моём примере? Мне скуль ругается на синтаксис, что нельзя в джоине писать селект
23 catena
 
10.05.12
19:06
Ааа, кажется врубилась.

Ну тогда действительно join on
24 Fragster
 
гуру
10.05.12
19:08
(22) можно, точно также, как в 1с
25 catena
 
10.05.12
19:08
(22)Ты соединения в 1с умеешь делать? То же самое, "соединение....по" = "join ... on"
26 Vladal
 
10.05.12
19:09
не объединить? вложенный запрос
27 catena
 
10.05.12
19:10
(26)Зачем там вложенный?
28 Vladal
 
10.05.12
19:11
вроде соединения по влоэенным запросам
29 Fragster
 
гуру
10.05.12
19:13
(28) зря отказался от (16)
30 catena
 
10.05.12
19:13
Кстати, можно и (0) допилить, наверное... как-то так:

select ID, max(Door), max(DocIn), max(Cards ) from(SELECT distinct [DBCode] as Id, 1 as Door, 0 as DocIn, 0 as Cards FROM [EX].[dbo].[DoorCounters]
union all
SELECT distinct [DBCode] as Id, 0 as door, 1, 0 as docin FROM [EX].[dbo].[DocumentsIn]
union all
SELECT distinct [DBCode] as Id, 0 as door, 0 as docin, 1 as DisCounts FROM [EX].[dbo].[DiscountCards])

group by Id
31 Vladal
 
10.05.12
19:13
(27),(25) куда совать join?


SELECT DISTINCT DBCode AS Id, DBCode AS Door, NULL AS DocIn, NULL AS Cards
FROM         EX.dbo.DoorCounters
join SELECT DISTINCT DBCode AS Id, NULL AS door, DBCode, NULL AS docin
FROM         EX.dbo.DocumentsIn
join SELECT DISTINCT DBCode AS Id, NULL AS door, NULL AS docin, DBCode AS DisCounts
FROM         EX.dbo.DiscountCards

Ругается на ошибку
32 Vladal
 
10.05.12
19:13
(30) Я так делал, ошибка:
33 Vladal
 
10.05.12
19:13
Сообщение 8120, уровень 16, состояние 1, строка 8
Столбец "EX.dbo.DiscountCards.DBCode" недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.
34 Fragster
 
гуру
10.05.12
19:14
(31) блин, сделай в 1с запрос уже в конструкторе, а потом тупо промптом переведи
35 catena
 
10.05.12
19:15
(33)Ты обманываешь
36 Vladal
 
10.05.12
19:15
(35) ну то на мой вариант. На твой пишет так:

Сообщение 156, уровень 15, состояние 1, строка 7
Неправильный синтаксис около ключевого слова "group".

Могу в тимвьюере показать
37 catena
 
10.05.12
19:16
(31)Делай джойн с таблицей, а не с селектом.
38 catena
 
10.05.12
19:16
(36)Поназови
39 catena
 
10.05.12
19:17
select tt.ID, max(tt.Door), max(tt.DocIn), max(tt.Cards ) from
(SELECT distinct [DBCode] as Id, 1 as Door, 0 as DocIn, 0 as Cards FROM [EX].[dbo].[DoorCounters]
union all
SELECT distinct [DBCode] as Id, 0 as door, 1, 0 as docin FROM [EX].[dbo].[DocumentsIn]
union all
SELECT distinct [DBCode] as Id, 0 as door, 0 as docin, 1 as DisCounts FROM [EX].[dbo].[DiscountCards]) as tt

group by tt.Id
40 Vladal
 
10.05.12
19:18
(39) Так сработало!

(38) ID 613 418 502

Сообщение в тимвьюер пошли, в ответе пароль
41 catena
 
10.05.12
19:21
(40)Так заработало же уже :)
42 Vladal
 
10.05.12
19:21
(41) Спасибо, catena!
Ошибка? Это не ошибка, это системная функция.