Поиск данных из одной таблицы в другой таблице в t-sql (sql server2000)? - PullRequest
0 голосов
/ 07 октября 2009

У меня есть таблица A. В этой таблице нет PK, она просто хранит множество строк, которые могут быть идентифицированы только по комбинации значений в столбцах. Существует процедура, которая берет данные из таблицы A и из других таблиц, выполняет правильное сопоставление / обработку и передает таблицу B. Как проверить, правильно ли вставлены данные из таблицы A в таблицу B?
Это SQL Server 2000, поэтому ИСКЛЮЧЕНИЕ не является решением.

Может быть, какая-то процедура, которая будет включать:

  1. курсор получит строки из таблица А
  2. выберите на B (при правильном сопоставление столбцов)
  3. и затем, если соответствующая строка была найдено (выберите вернули некоторые данные) увеличить счетчик (количество правильно размноженные строки)
  4. если подходящей строки не найдено, положите Данные, которые мы искали в временная таблица (для последующего просмотра)

Обновление: Процедура, которая передает таблицу B, не помещает все строки из таблицы A в таблицу C. Кроме того, она также берет данные из другой таблицы (назовем ее C) и помещает их в B (но также не во все строки). Я подумал, что, возможно, использование одного курсора для проверки B на наличие данных из A, а затем другого курсора для проверки B на наличие данных из C было бы хорошим решением.

Ответы [ 2 ]

0 голосов
/ 07 октября 2009

Зачем вам курсор?

SELECT COUNT(*) --or simply the list of columns
FROM A LEFT JOIN B
          ON A.col1 = B.col1
             AND A.col2 = B.Col2
             AND ....
WHERE A.col1 IS NULL AND A.col2 IS NULL 

Вам может потребоваться указать несколько столбцов в предложении WHERE, чтобы проверить наличие NULL, если существует вероятность того, что некоторые из этих столбцов могут иметь значение NULL.

Это может быть не очень быстро, поэтому в зависимости от вашей структуры индекса вы можете сначала выполнить подсчет, чтобы проверить, есть ли у вас какие-либо несопоставленные строки, а затем выполнить поиск строк.

0 голосов
/ 07 октября 2009

Вы можете сделать NOT EXISTS для строк, которые не соответствуют по вашим критериям

SELECT Columns
FROM TableA
Where NOT EXISTS
(
SELECT 1
FROM TableB
WHERE 1=1
AND TableA.Column1 = TableB.Column1
AND TableA.Column2 = TableB.Column2
AND TableA.Column3 = TableB.Column3
AND TableA.Column4 = TableB.Column4
)

Вы можете сделать запрос для строк, которые соответствуют вашему критерию, но не соответствуют остальным данным

SELECT Columns
FROM TableA
INNER JOIN TableB
    ON  TableA.Column1 = TableB.Column1
    AND TableA.Column2 = TableB.Column2
    AND TableA.Column3 = TableB.Column3
    AND TableA.Column4 = TableB.Column4
)
WHERE TableA.Column11 <> TableB.Column11
OR    TableA.Column12 <> TableB.Column12
OR    TableA.Column13 <> TableB.Column13
OR    TableA.Column14 <> TableB.Column14

Теперь, когда у вас есть оба набора отключенных записей, вы можете применить необходимую логику.

Большинство людей здесь дадут вам ответы на основе SET вместо ответов на основе CURSOR. В StackOverflow вы найдете много материала о том, почему бы не использовать CURSOR.

...