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

Откуда:
Сообщений: 183
Есть две таблицы для каждой из которых сделан запрос SELECT.
Первый выдает результаты "как должно быть", второй "как есть на самом деле". Тип данных (nvarchar), количество полей и их названия одинаковы. Правда, в первом запросе имя поля выставляется в запросе "... AS FieldName ".
Сейчас сравниваю их визуально, копируя в Эксел.
Как можно сравнить их помощью SQL и можно ли вообще?
19 июн 15, 12:44    [17792010]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }


Arguments
<query_specification> | ( <query_expression> )
Is a query specification or query expression that returns data to be compared with the data from another query specification or query expression. The definitions of the columns that are part of an EXCEPT or INTERSECT operation do not have to be the same, but they must be comparable through implicit conversion. When data types differ, the type that is used to perform the comparison and return results is determined based on the rules for data type precedence.

When the types are the same but differ in precision, scale, or length, the result is determined based on the same rules for combining expressions. For more information, see Precision, Scale, and Length (Transact-SQL).

The query specification or expression cannot return xml, text, ntext, image, or nonbinary CLR user-defined type columns because these data types are not comparable.

EXCEPT
Returns any distinct values from the query to the left of the EXCEPT operand that are not also returned from the right query.

INTERSECT
Returns any distinct values that are returned by both the query on the left and right sides of the INTERSECT operand.
19 июн 15, 12:45    [17792021]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21053
select t1.*
from (первый запрос) as t1
left join (второй запрос) as t2 on t1.id=t2.id
where t2.id is null
19 июн 15, 12:46    [17792024]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
o-o
Guest
Akina
select t1.*
from (первый запрос) as t1
left join (второй запрос) as t2 on t1.id=t2.id
where t2.id is null


declare @t1 table (id int);
insert @t1 values (1), (1), (3);

declare @t2 table (id int);
insert @t2 values (1), (3), (3);

select t1.*
from @t1 as t1
left join @t2 as t2 on t1.id=t2.id
where t2.id is null
---
19 июн 15, 12:59    [17792110]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21053
o-o, обычно, когда нет привязки к конкретной структуре, поле с именем id в шаблоне обозначает primary key, или по крайней мере unique not null поле. Во всяком случае, для значительного большинства разумных из тех, кто в теме...
19 июн 15, 13:04    [17792162]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Malyav
Member

Откуда:
Сообщений: 183
Akina, спасибо. Но есть проблема.

У меня в обоих запросах используется ORDER BY, поэтому на первый раз получил

Сообщение 1033, уровень 15, состояние 1, строка 8
The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.
Сообщение 156, уровень 15, состояние 1, строка 13
Incorrect syntax near the keyword 'order'.


Убрал сортировку, теперь получаю


Сообщение 207, уровень 16, состояние 3, строка 1
Invalid column name 'id'.
Сообщение 207, уровень 16, состояние 3, строка 1
Invalid column name 'id'.
Сообщение 207, уровень 16, состояние 3, строка 1
Invalid column name 'id'.

То же самое при добавлении TOP 10000.
У меня SQL2000 MSDE.

Вот мои запросы (без сортировки или TOP)
select t1.*
from (
SELECT     Int2G.BSC, Int2G.CELL, Int2G_1.CELL AS CELLR
FROM         Int2G INNER JOIN
                      Int2G AS Int2G_1 ON Int2G.CELL <> Int2G_1.CELL
WHERE     (Int2G_1.CELL LIKE LEFT(Int2G.CELL, 6) + '%') and Int2G_1.cell <> Int2G.cell
) as t1
left join (
SELECT     BSC, CELL, CELLR
FROM         Nei2G
WHERE     (CELLR LIKE LEFT(CELL, 6) + '%')
) as t2 on t1.id=t2.id
where t2.id is null

В первом SELECT Int2G и Int2G_1 это одна и та же таблица, т.е. INNER JOIN на саму себя.
19 июн 15, 13:04    [17792165]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Malyav
on t1.id=t2.id

А где у вас поля с именами id ?
19 июн 15, 13:06    [17792180]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
o-o
Guest
Akina
o-o, обычно, когда нет привязки к конкретной структуре, поле с именем id в шаблоне обозначает primary key, или по крайней мере unique not null поле. Во всяком случае, для значительного большинства разумных из тех, кто в теме...

мой пример как раз про то, что результат произвольного запроса -- это совсем необязательно *различные* строки.
19 июн 15, 13:12    [17792235]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Malyav
Member

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

:-) Ага! Исправил!

) as t2 on t1.BSC=t2.BSC
where t2.BSC is null


Как я понимаю, это проверка на то, что во второй таблице строк меньше, чем в первой.

Всем спасибо. Теперь буду искусственно вводить разницу в исходные таблицы, чтобы проверить правильность выполнения запроса. Сейчас результаты совпадают, чтобы узнать, как оно будет при различных несовпадениях (у меня три поля в каждой таблице).
19 июн 15, 13:21    [17792310]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Malyav
Как я понимаю, это проверка на то, что во второй таблице строк меньше, чем в первой.

А для вас только количество записей означает, что наборы данных различаются ?
19 июн 15, 13:23    [17792328]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
sega1999
Member

Откуда:
Сообщений: 9
Я бы создал временные таблицы по каждому запросу:

select into #t1 POLE1,POLE2 FROM TABLE1
select into #t2 POLE1,POLE2 FROM TABLE2

Далее сравнивал бы две временный таблицы:

select * from #t1 t1
full join #t2 t2 on t1.pole1=t2.pole1 and t1.pole2=t2.pole2

where t1.pole is null OR t2.pole1 is null

получим разницу по данным
19 июн 15, 13:28    [17792372]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
afgm
Member

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

Несколько подводных камней при таком сравнении:
  • могут быть null значения в исходных данных
  • могут дублироваться данные в одной из таблиц

    Решение не для MS SQL 2000, но для истории:
    declare @t1 table (str1 nvarchar(20), str2 nvarchar(20))
    declare @t2 table (str1 nvarchar(20), str2 nvarchar(20))
    insert into @t1 values('test1', 'test1'),('test1', 'test1'), ('test2', 'test2')                    , (null, 'test4')
    insert into @t2 values('test1', 'test1'),                    ('test2', 'test2'), ('test3', 'test3'), (null, 'test4')
    
    ;with t1 as (
      select ROW_NUMBER() over(partition by t1.str1, t1.str2 order by t1.str1, t1.str2) as id,
             t1.*
         from @t1 t1
    ),
    t2 as (
      select ROW_NUMBER() over(partition by t2.str1, t2.str2 order by t2.str1, t2.str2) as id,
             t2.*
         from @t2 t2
    )
    select * from t1
    except
    select * from t2
    
    /* -- обратный случай
      select * from t2
      except
      select * from t1 */
    
  • 19 июн 15, 14:02    [17792665]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Malyav
    Member

    Откуда:
    Сообщений: 183
    Glory
    Malyav
    Как я понимаю, это проверка на то, что во второй таблице строк меньше, чем в первой.

    А для вас только количество записей означает, что наборы данных различаются ?


    Во второй таблице "как есть на самом деле", больше записей, чем в первой быть просто не может. Т.е. если разница есть, то во второй таблице записей будет меньше. И тогда мне обязательно надо знать, какие записи из первой таблицы в ней отсутствуют.
    19 июн 15, 14:19    [17792820]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Malyav
    Т.е. если разница есть, то во второй таблице записей будет меньше.

    А если разница будет не в количестве записей, а в значениях полей ?
    19 июн 15, 14:22    [17792856]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Malyav
    Member

    Откуда:
    Сообщений: 183
    Glory
    Malyav
    Т.е. если разница есть, то во второй таблице записей будет меньше.

    А если разница будет не в количестве записей, а в значениях полей ?


    Этого не может быть. Вторая таблица может содержать лишь только те значения, что есть в первой. Если все прописано правильно, то записи в обоих выборках будут совпадать. Если что-то пропущено, то во второй выборке записей будет меньше. И мне надо узнать, что именно пропущено. И устранить :-)
    19 июн 15, 14:55    [17793117]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Malyav
    Этого не может быть.

    почему ? у вас страховой полис на случай, если кто-то поменяет значения в записях ?

    Malyav
    Вторая таблица может содержать лишь только те значения, что есть в первой.

    Зачкем вы тогда их сравниваете ?

    Malyav
    Если все прописано правильно, то записи в обоих выборках будут совпадать.

    Ну так вы и проверяете случай, когда все получилось неправильно
    19 июн 15, 14:57    [17793140]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    ART-CODE
    Member

    Откуда:
    Сообщений: 1092
    По всей видимости там репликация и ТС желает проверять все ли перенеслось.
    Ну, можно max(id) просто сравнивать и докачивать записи в подписчика если в публикаторе он больше.
    А еще можно Merge применить - одним запросом сразу и разницу выяснить, и недостающие записи накатить, если таковые будут.
    Ну, тут только разумное ограничение поставить, например только для строк выше id такого-то,
    который был в прошлый раз гарантированно смерджен и запомнен (про output помним, да ?).
    19 июн 15, 20:41    [17795017]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Akina
    Member

    Откуда: Зеленоград, Москва, Россия
    Сообщений: 21053
    o-o, если имеются дублирующиеся записи, вопрос теряет смысл. Или требует дополнения о том, что для дубликатов необходимо выдать их в колиестве COUNT2-COUNT1.
    20 июн 15, 11:15    [17796541]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли узнать, совпадают ли результаты Select из разных таблиц, с помощью SQL  [new]
    Malyav
    Member

    Откуда:
    Сообщений: 183
    Glory
    Malyav
    Этого не может быть.

    почему ? у вас страховой полис на случай, если кто-то поменяет значения в записях ?

    Malyav
    Вторая таблица может содержать лишь только те значения, что есть в первой.

    Зачкем вы тогда их сравниваете ?


    Я должен объяснить, для чего я использую эти запросы.
    Базовая станция сотовой связи 2G содержит от 1 до 6 секторов. Номер сектора (семизначный) это номер станции (например 112222) с добавлением к нему порядкового номера сектора. Т.е. сектора с 4 по 6 будут 1122224, 1122225, 1122226. При движении абонента в процессе разговора и переходе его из зоны действия одного сектора в другой без разъединения должны быть прописаны связи "сектор-сосед" как между секторами разных (расположенных рядом) станций, так и между секторами внутри одной станции каждый с каждым. Моя текущая задача - проверить полноту выполнения только второй части этой установки. Для этого я придумал сравнить текущее состояние настроек с тем, как теоретически должно быть. Может быть есть и лучший вариант, но я додумался до такого. Итак.

    Есть список всех существующих на сети секторов, из которого я формирую список всех возможных связей. Каждый сектор с каждым внутри одной станции
    WHERE     (Int2G_1.CELL LIKE LEFT(Int2G.CELL, 6) + '%')
    
    кроме "сам на себя"
    Int2G_1.cell <> Int2G.cell
    

    Это первый селект "как должно быть" в теории. В данном случае я применил join таблицы на саму себя.

    Также есть список существующих (прописанных в реальности) связей. Тут проще. Среди них я выбираю только связи секторов внутри одной соты
    WHERE     (CELLR LIKE LEFT(CELL, 6) + '%')
    
    Это второй селект "как есть на самом деле". Перечень секторов здесь гарантированно не может не соответствовать перечню секторов из первого селекта, поэтому я ответил "этого не может быть". Прописать соседство можно только для существующих секторов а удаление сектора влечет за собой автоматическое удаление прописанных с его участием соседств.

    Если количество записей совпало, значит все соседи прописаны (что у меня и получилось). Если нет, то во второй таблице записей будет меньше и надо искать, какие соседи не прописаны.
    Из-за того, что я не слишком искушен в SQL я мог воспользоваться Экселом для такого поиска. Но мне хотелось доделать все в SQL. Это и интереснее и быстрее. Вот я и обратился к форуму. Не в первый уже раз получил квалифицированную помощь и поддержку, за что все спасибо.
    22 июн 15, 13:47    [17801922]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить