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

Откуда: Питер
Сообщений: 670
Есть таблицы:
CREATE TABLE [dbo].[Dates] (
	[Dates_date] [datetime] NOT NULL (первичный ключ)
) ON [PRIMARY]

(Эта таблица заполнена всеми датами за год (366 записей))

CREATE TABLE [dbo].[Products] (
	[ID] [int] IDENTITY (1, 1) NOT NULL (первичный ключ),
	[Name] [varchar] (255) COLLATE Cyrillic_General_CI_AS NOT NULL ,
.......................
) ON [PRIMARY]

CREATE TABLE [dbo].[Storages] (
	[ID] [int] IDENTITY (1, 1) NOT NULL (первичный ключ),
	[Name] [varchar] (255) COLLATE Cyrillic_General_CI_AS NOT NULL ,
.......................
) ON [PRIMARY]

Мне нужно получить выборку всех дат, и на каждую чтоб было пересечение всех складов и товаров. Пример:

Dates:
01.01.2004
02.01.2004

Products:
1
2

Storages:
10
20
30

Результат:
01.01.2004 1 10
01.01.2004 1 20
01.01.2004 1 30
01.01.2004 2 10
01.01.2004 2 20
01.01.2004 2 30
02.01.2004 1 10
02.01.2004 1 20
02.01.2004 1 30
02.01.2004 2 10
02.01.2004 2 20
02.01.2004 2 30
16 июн 04, 14:22    [745299]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Не понял... А что тут сложного?

select t1.Dates_date, t2.Name, t2.Name
          from Dates t1 CROSS JOIN
          Products t2 CROSS JOIN
          Storages

Или я, действительно что-то не понял?
16 июн 04, 14:43    [745401]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
miniСЛОН
Member

Откуда: Москва, Россия; Ванкувер, Канада
Сообщений: 413
Слишком просто чтобы быть правдой :)
16 июн 04, 14:48    [745429]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Вроде правда. Щас проверяю. Просто я ставил сначала from Products CROSS JOIN Storages и всё это дело RIGHT JOIN-ил к датам... В этом была ошибка?
16 июн 04, 14:51    [745446]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ale-805
В этом была ошибка?

угу
16 июн 04, 14:54    [745457]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Вобщем ошибка была в этом, но дальше произошел затык. :( Видимо придется объяснить задачу целиком. Хочу создать представление (таблицу фактов для OLAP-куба).
Есть описанные выше таблицы Складов, Товаров и Дат, также существует таблица-регистр движений:
CREATE TABLE [dbo].[RegProductsMovement] (
	[RegProductsMovement_id] [int] IDENTITY (1, 1) NOT NULL ,
	[doc_date] [datetime] NOT NULL ,
	[storage_id] [int] NOT NULL ,
	[product_id] [int] NOT NULL ,
	[quantityIncome] [decimal](18, 3) NOT NULL ,
	[quantityOutlay] [decimal](18, 3) NOT NULL ,
	[quantityEnd] [decimal](18, 3) NOT NULL 
) ON [PRIMARY]
Незначимые поля я опустил, оставил только значимые.
Соответственно, в ней хранятся движения товаров по складам (quantityIncome = приход, quantityOutlay = расход, quantityEnd = остаток на конец этой операции). То есть по последнему движению данного товара по данному складу за сегодняшний день можно определить, сколько осталось товара на вечер этого дня. Если в этот день не было движения, то берется остаток из последнего найденного движения.
Так вот, я хочу скрестить все даты с товарами и складами в одну таблицу фактов, но у меня не получается. Построил запрос, но не могу дождаться его окончания, tempdb пухнет немеряно и не хватает дискового пространства для завершения операции. Но я чую, что я в запросе сделал что-то не так. Посмотрите:
SELECT
	new.Dates_date AS Dates_date,
	s.ID AS storage_id,
	p.ID AS product_id,
	isnull( SUM(new.quantity), 0 ) AS quantityNew
FROM
	(
		select
			Dates.Dates_date Dates_date,
			mov.storage_id storage_id,
			mov.product_id product_id,
			isnull( mov.quantityEnd, 0) quantity
		from
			Dates
			left join
			RegProductsMovement mov
			on Dates.Dates_date = mov.doc_date
	) new
	CROSS JOIN Storages s
	CROSS JOIN Products p
WHERE
	p.isFolder = 0
	and s.isFolder = 0
GROUP BY
	new.Dates_date,
	s.ID,
	p.ID
ORDER BY
	Dates_date,
	storage_id,
	product_id
16 июн 04, 16:50    [745998]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Блин, таблицу Dates уменьшил до одной записи, всё равно запрос уходит куда-то вдаль... :( Что делать?
16 июн 04, 17:19    [746127]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
Old Nick
Member

Откуда: Санкт-Петербург
Сообщений: 3147
Тебе для фактов нужно не CROSSJOIN использовать, а таблицу регистр, а в качестве измерений описанные выше таблицы
16 июн 04, 17:44    [746222]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Интересно, и как такую таблицу регистров использовать как таблицу фактов? Я ума не приложу. Ведь если в один день было 2 движения товара, то просто сложится два остатка на конец каждой операции, бред получится. Подскажите, как использовать регистр в качестве таблицы фактов для куба "Остатки"? Вся нужная информация изложена выше.
17 июн 04, 11:35    [747402]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ChA
Member

Откуда: Москва
Сообщений: 11134
А так ?
SELECT
  d.Dates_date,
  s.ID AS storage_id,
  p.ID AS product_id,
  ISNULL(SUM(mov.quantity), 0) AS quantityNew
FROM Storages s
CROSS JOIN Products p
CROSS JOIN Dates d
LEFT OUTER JOIN RegProductsMovement mov ON (
  mov.storage_id = s.id
  AND mov.product_id = p.id
  AND mov.doc_date = Dates.Dates_date
)
WHERE p.isFolder = 0 AND s.isFolder = 0
GROUP BY d.Dates_date, s.ID, p.ID
ORDER BY 1, 2, 3
У Вас в слиянии с RegProductsMovement не было условия на
  mov.storage_id = s.id
  AND mov.product_id = p.id
что, по видимому, и привело к слишком большому объему выборки.
CROSS JOIN - страшная вещь :)
17 июн 04, 17:53    [749002]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ChA
Member

Откуда: Москва
Сообщений: 11134
AND mov.doc_date = Dates.Dates_date
читать как
AND mov.doc_date = d.Dates_date
17 июн 04, 17:54    [749012]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN вроде хитрый какой-то...  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Вроде оно. Спасибо, Ча, буду разбираться.
17 июн 04, 18:24    [749121]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить