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

Откуда:
Сообщений: 890
DECLARE @QuestionId int
DECLARE @CurrentDate date
DECLARE @PreviouseDate date
SET @QuestionId = 1300
SET @PreviouseDate = '2009-03-01'
SET @CurrentDate = '2009-05-01'
select @PreviouseDate, @CurrentDate

SELECT *
FROM 
	QuestionValues QV1
	FULL OUTER JOIN QuestionValues QV2 ON
			QV1.AttributeTypeValueId = QV2.AttributeTypeValueId
WHERE
	QV1.QuestionId = @QuestionId
	AND QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL
	AND QV2.QuestionId = @QuestionId
	AND QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL


вывод в атаче
вопрос собственно в том что стоит условие
SET @CurrentDate = '2009-05-01'
но запросу все равно, всеравно выводит с другой датой в последней калонке, сижу думаю, толи я не проснулся толь с памятью что то

К сообщению приложен файл. Размер - 0Kb
24 июн 09, 11:46    [7336580]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
select @@version показывайте.
24 июн 09, 11:48    [7336597]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Приоритеты операторов AND и OR
Другими словами, Вы забыли скобки

Это как 2+2*2 и (2+2)*2, тоже разный результат
24 июн 09, 11:49    [7336602]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
автор
Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
24 июн 09, 11:49    [7336606]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Guest
Var79,
у вас есть такое условие -
AND QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL

оно и срабатывает. так что видимо не проснулись;)
24 июн 09, 11:49    [7336608]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Var79
DECLARE @QuestionId int
DECLARE @CurrentDate date
DECLARE @PreviouseDate date
SET @QuestionId = 1300
SET @PreviouseDate = '2009-03-01'
SET @CurrentDate = '2009-05-01'
select @PreviouseDate, @CurrentDate

SELECT *
FROM 
	QuestionValues QV1
	FULL OUTER JOIN QuestionValues QV2 ON
			QV1.AttributeTypeValueId = QV2.AttributeTypeValueId
WHERE
	QV1.QuestionId = @QuestionId
	AND QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL
	AND QV2.QuestionId = @QuestionId
	AND QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL


вывод в атаче
вопрос собственно в том что стоит условие
SET @CurrentDate = '2009-05-01'
но запросу все равно, всеравно выводит с другой датой в последней калонке, сижу думаю, толи я не проснулся толь с памятью что то
А как Вы думаете, в каком порядке обрабатываются операторы OR и AND?
Расставьте в условии скобки.
Или почитайте про приоритеты операторов TSQL
24 июн 09, 11:50    [7336611]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
	QV1.QuestionId = @QuestionId
	AND ( QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL )
	AND QV2.QuestionId = @QuestionId
	AND ( QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL )
24 июн 09, 11:50    [7336613]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
Паганель
Приоритеты операторов AND и OR
Другими словами, Вы забыли скобки

Это как 2+2*2 и (2+2)*2, тоже разный результат

да действительно :) про скобки я забыл, но ...
	QV1.QuestionId = @QuestionId
	AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
	AND QV2.QuestionId = @QuestionId
	AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)
но запрос по прежнему НЕ показывает QV1.QuestionDate и QV2.QuestionDate с нулами

то есть если за одну дату нет значения, а за другую есть то в одном столбце таблички нужен нулл а в другом значение

вроде бы элементарные знания но меня озадачил запрос :( и как бы перерывов у меня в работе с transact-sql не было...
24 июн 09, 11:59    [7336700]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Guest
Var79,

тогда должно быть что-то вроде

   QV1.QuestionId = @QuestionId
	AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
	OR
    QV2.QuestionId = @QuestionId
	AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)
24 июн 09, 12:04    [7336735]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
iljy
Var79,

тогда должно быть что-то вроде

   QV1.QuestionId = @QuestionId
	AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
	OR
    QV2.QuestionId = @QuestionId
	AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)

Тогда уж:
(
   QV1.QuestionId = @QuestionId
	AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
)
	OR
(
    QV2.QuestionId = @QuestionId
	AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)
)
24 июн 09, 12:05    [7336743]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Guest
Var79,



вернеет нет, вот так:

   (QV1.QuestionId = @QuestionId OR QV1.QuestionId isNULL)
	AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
	AND (QV2.QuestionId = @QuestionId OR QV2.QuestionId IS NULL)
	AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)

у вас же поле QuestionID тоже NULL будет если парной строки нет
24 июн 09, 12:06    [7336746]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Guest
Гавриленко Сергей Алексеевич,

приоритет AND выше OR ;)
24 июн 09, 12:08    [7336760]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
спасибо ребята, но пока нет нужного мне результата
щас еще раз проверю исходные данные, вдруг там и правда нету пропусков значений :)
позже выложу скрипт заполнения данных
24 июн 09, 12:14    [7336816]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
скрипт создания таблицы и заполнения данных в атаче

обратите внимание на

(AttributeTypeValueId = 36) OR (AttributeTypeValueId = 35)

36 го нет в 2009-03-01
а 35 нет в 2009-05-01


очень не удобно такие простые вещи спрашивать но что делать если сегодня не получается :(

К сообщению приложен файл (testCreateFillTable.sql - 12Kb) cкачать
24 июн 09, 12:30    [7336924]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
select @@version

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
24 июн 09, 12:31    [7336933]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
может я не правильный тип джоина использую, что он мне нуллы не выдает,

в общем вот этот запрос то что мне нужно
SELECT * FROM
(
SELECT * FROM QuestionValues
WHERE QuestionValues.QuestionId = @QuestionId AND QuestionValues.QuestionDate = @PreviouseDate
) qv1 FULL OUTER JOIN  
(
SELECT * FROM QuestionValues
WHERE QuestionValues.QuestionId = @QuestionId AND QuestionValues.QuestionDate = @CurrentDate
) qv2 ON QV1.AttributeTypeValueId = QV2.AttributeTypeValueId
просто казалось что одним запросом можно добится того же :(
24 июн 09, 12:46    [7337065]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
кто нибудь скажет, это нормальное поведение, или какая то специфика 2008го
24 июн 09, 12:53    [7337119]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Member

Откуда:
Сообщений: 8711
Var79,

ну вообще последний вариант тоже состоит из одного запроса, причем он явно эффективней - сервер сможет использоать индексы.
24 июн 09, 12:56    [7337142]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Var79
кто нибудь скажет, это нормальное поведение
Это нормальное поведение
Ваши условия типа
Var79
*.QuestionId = @QuestionId AND ...
как бы превращают outer join в inner, и в результате
Var79
он мне нуллы не выдает
24 июн 09, 12:59    [7337159]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
iljy
ну вообще последний вариант тоже состоит из одного запроса

я имел в виду один селект, просто раз в природе есть под запрос (когда несколько селектов) то когда один селект в некотором смысле можно сказать и "один запрос" :)

Паганель
как бы превращают outer join в inner

да конечно но
(QV1.QuestionId = @QuestionId OR QV1.QuestionId IS NULL)
AND (QV1.QuestionDate = @PreviouseDate OR QV1.QuestionDate IS NULL)
AND (QV2.QuestionId = @QuestionId OR QV2.QuestionId IS NULL)
AND (QV2.QuestionDate = @CurrentDate OR QV2.QuestionDate IS NULL)
как бы должны его обратно превратить в outer, чего не происходит

и вопрос чисто филосовский, кто не прав :) моя персональная математика или ms sql 2008 :)
24 июн 09, 13:17    [7337303]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
Var79
Member

Откуда:
Сообщений: 890
в общем снова все не так устроено в жизни как мне нравится :)
24 июн 09, 13:22    [7337324]     Ответить | Цитировать Сообщить модератору
 Re: лыжи не едут Ж%-)  [new]
iljy
Member

Откуда:
Сообщений: 8711
Var79,

мир не совершенен;)

хотите разобраться - сделайте так:


SELECT *
FROM 
	QuestionValues QV1
	FULL OUTER JOIN QuestionValues QV2 ON
			QV1.AttributeTypeValueId = QV2.AttributeTypeValueId
WHERE
   ISNULL(QV1.AttributeTypeValueId,QV2.AttributeTypeValueId) in (35,36) AND
   ISNULL(QV1.QuestionDate, QV2.QuestionDate) in (@PreviouseDate, @CurrentDate)

и посмотрите, что за данные получаются. У меня 2005й, и ваш скрипт данные не заполняет. на будущее - выкладывайте даты в виде строк, а не binary.
24 июн 09, 13:32    [7337410]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить