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

Откуда:
Сообщений: 572
Есть 2 таблицы.
Нужно их сравнить.
Почитал, что тут рекомендуют и всё сделал.

Т.е где-то так:

SELECT FName FROM
(
SELECT FName, 1 as TAB_ID from #A
UNION ALL
SELECT FName, 2 as TAB_ID from #B
)tmp
group by FName
HAVING SUM(TAB_ID) in (1)

Работает.

А надо что бы показывало всё в одну строку. К примеру, поле ТАРИФ было показано из обоих таблиц.Тогда сразу видно разницу и где ошибка.
А с таким кодом как выше, при HAVING SUM(TAB_ID) in (1,2) вернёт 2 строки.

Так вот, как сравнить и показать (если есть разница) эту строку(и) с полями из обеих таблиц.

Спасибо,
23 июн 09, 19:06    [7334944]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Чтобы все в одну строку было, надо join или exists использовать.
23 июн 09, 19:17    [7334966]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
pshik
Member [заблокирован]

Откуда:
Сообщений: 572
Гавриленко Сергей Алексеевич
Чтобы все в одну строку было, надо join или exists использовать.


Это как?

Сначало сравнить, а потом?
23 июн 09, 19:32    [7334997]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Нужна связь 1:1 по какому-то ключу.
Если ещё и порядок полей в таблице одинаков (например, в триггере таковы inserted и deleted), то
SQL2005/2008
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE EXISTS(SELECT #A.* EXCEPT #B.*);
Если порядок полей в * не гарантируется, то поля перечислять явно.
Для 2000-го можно, конечно, так
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE (SELECT COUNT(*) FROM (SELECT #A.F1,#A.F2,#A.F3 UNION SELECT #B.F1,#B.F2,#B.F3)T)=2;
Но опыт показывает, что это тормозит
23 июн 09, 20:38    [7335141]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iljy
Guest
iap
Нужна связь 1:1 по какому-то ключу.
Если ещё и порядок полей в таблице одинаков (например, в триггере таковы inserted и deleted), то
SQL2005/2008
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE EXISTS(SELECT #A.* EXCEPT #B.*);
Если порядок полей в * не гарантируется, то поля перечислять явно.

? не будет так работать. а таблицы кстати - симметричны, т.е. нужна разность в обе стороны? тогда вариант с EXCEPT не покатит. Можно такой вариант:
SELECT * FROM
#a FULL JOIN #b ON #a.id = #b.id
WHERE #a.F1 != #b.F1 or  #a.F2 != #b.F2 ...
если поля nullable - проверка усложнится. Для 2000 он тоже подойдет.
23 июн 09, 21:06    [7335196]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
pshik
Member [заблокирован]

Откуда:
Сообщений: 572
iljy
iap
Нужна связь 1:1 по какому-то ключу.
Если ещё и порядок полей в таблице одинаков (например, в триггере таковы inserted и deleted), то
SQL2005/2008
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE EXISTS(SELECT #A.* EXCEPT #B.*);
Если порядок полей в * не гарантируется, то поля перечислять явно.

? не будет так работать. а таблицы кстати - симметричны, т.е. нужна разность в обе стороны? тогда вариант с EXCEPT не покатит. Можно такой вариант:
SELECT * FROM
#a FULL JOIN #b ON #a.id = #b.id
WHERE #a.F1 != #b.F1 or  #a.F2 != #b.F2 ...
если поля nullable - проверка усложнится. Для 2000 он тоже подойдет.


Да уж....

При сравнении таблиц, в первой половине UNION у меня 1 таблица, а с другой стороны 7 таблиц, которые я привёл к тому же виду, что и первая таблица.
И как это всё увязать в вами предложенное?

Я пока пробую результат UNION ALL организовать в PIVOT,но что-то пока тоже никак.
23 июн 09, 21:21    [7335226]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
iap
Нужна связь 1:1 по какому-то ключу.
Если ещё и порядок полей в таблице одинаков (например, в триггере таковы inserted и deleted), то
SQL2005/2008
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE EXISTS(SELECT #A.* EXCEPT #B.*);
Если порядок полей в * не гарантируется, то поля перечислять явно.

? не будет так работать. а таблицы кстати - симметричны, т.е. нужна разность в обе стороны? тогда вариант с EXCEPT не покатит. Можно такой вариант:
SELECT * FROM
#a FULL JOIN #b ON #a.id = #b.id
WHERE #a.F1 != #b.F1 or  #a.F2 != #b.F2 ...
если поля nullable - проверка усложнится. Для 2000 он тоже подойдет.
Почему в обе стороны, если INNER JOIN?
Всё прекрасно работает.
А WHERE #a.F1 != #b.F1 or #a.F2 != #b.F2 недостаточно, надо ещё NULL обрабатывать.
Хотя этот способ, без сомнения, самый эффективный.
Но если надо сравнить, например, по 400-ам полям?
23 июн 09, 21:21    [7335227]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
pshik
iljy
iap
Нужна связь 1:1 по какому-то ключу.
Если ещё и порядок полей в таблице одинаков (например, в триггере таковы inserted и deleted), то
SQL2005/2008
SELECT *
FROM #A JOIN #B ON #A.ID=#B.ID
WHERE EXISTS(SELECT #A.* EXCEPT #B.*);
Если порядок полей в * не гарантируется, то поля перечислять явно.

? не будет так работать. а таблицы кстати - симметричны, т.е. нужна разность в обе стороны? тогда вариант с EXCEPT не покатит. Можно такой вариант:
SELECT * FROM
#a FULL JOIN #b ON #a.id = #b.id
WHERE #a.F1 != #b.F1 or  #a.F2 != #b.F2 ...
если поля nullable - проверка усложнится. Для 2000 он тоже подойдет.


Да уж....

При сравнении таблиц, в первой половине UNION у меня 1 таблица, а с другой стороны 7 таблиц, которые я привёл к тому же виду, что и первая таблица.
И как это всё увязать в вами предложенное?

Я пока пробую результат UNION ALL организовать в PIVOT,но что-то пока тоже никак.
Хоть бы версию сервера сказали...

Если в упомянутых Вами 8-ми таблицах есть поле, которое должно у них совпадать
(наверно, это FName, по нему таблицы надо связать JOINом), а остальные поля совпадают по смыслу и порядку следования в SELECT *,
то SELECT #A.* EXCEPT SELECT * FROM #B EXCEPT SELECT * FROM #C ...
вернёт запись из #A, если такой же нет ни в #B, ни в #C, ни в ...
Иначе ничего не вернёт. Верно? Это не то, что Вам нужно?

Давайте скрипт CREATE TABLE всех таблиц и INSERT для тестовых данных плюс нужный результат - поговорим более предметно.
23 июн 09, 21:35    [7335253]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
pshik
Member [заблокирован]

Откуда:
Сообщений: 572
SQL Server 2005

Спасибо
Буду пробовать
23 июн 09, 21:39    [7335263]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Разумеется, предложенный мною скрипт не вернёт записи, которых просто нет в #B (там же INNER JOIN).
Но к моему результату можно же прибавить UNIONом EXCEPT по всем полям.
Короче, дайте пример, посмотрим!
23 июн 09, 21:47    [7335274]     Ответить | Цитировать Сообщить модератору
 Re: Организовать данные, как?  [new]
iljy
Guest
iap
Почему в обе стороны, если INNER JOIN?
Всё прекрасно работает.

сори, я невнимательно глянул. работает.
В обе стороны - это был вопрос:) изначально человек получает только строки, которые есть в первой таблице и нет во второй.

iap

Но если надо сравнить, например, по 400-ам полям?


про NULL - я написал
если поля nullable - проверка усложнится.

если полей 400 - тогда конечно сложновато получится, но что-то мне подсказывает, что результат join из 2 таблиц по 400 полей в любом случае будет суров! да и скриптов таблиц нету, про конкретику судить сложно. А поскольку версию не указали - я привел универсальный вариант.
23 июн 09, 21:55    [7335287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить