2013-02-01 2 views
1

У меня есть такие значения в этих двух таблицах. Я хочу, чтобы проверить дубликаты в TableA и TableBСравнение строк в таблицах доступа MS

TABLEA 
    StaffName Shift Hrs 
    ABC   1  12 
    DEF     23 
    XYZ   2   


    TABLEB 
    StaffN  Sft Hrs 
    ABC   1  12 
    DEF     23 
    XYZ   2   

Однако, когда я сделать

SELECT * FROM TABLEA 
    WHERE NOT EXISTS 
    (SELECT * FROM TABLEB.StaffN = TABLEA.StaffName AND 
    TABLEB.Sft = TABLEA.Shift AND 
    TABLEB.Hrs = TABLEA.Hrs); 

Почему я бы вернулся из DEF и XYZ? это из-за пустой ценности? И как я могу изменить выбранный статус, чтобы проверить, является ли оба значения пустыми, то же самое.

ответ

1

Да, вы были правы подозревать NULLS.

Учитывайте 3 значения в строках «DEF»: DEF; Ноль; и 23. Человек может сказать, что эти строки являются дубликатами, потому что все 3 значения одинаковы в обеих таблицах.

Однако, подзапрос просит устройство db рассмотреть вопрос о том, TABLEB.Sft = TABLEA.Shift. И есть проблема ... Нуль никогда не может быть равным никому, даже другому Нулу.

Посмотрите, разъясняет ли это текущее окно окно.

? 1 = 1 
True 
? 1 = 2 
False 
? 1 = Null 
Null 
? Null = Null 
Null 

Таким образом, когда оба поля Null, сравнение TABLEB.Sft = TABLEA.Shift оценивается как Null. Двигатель db будет содержать только строки, где сравнение равно True, поэтому строки «DEF» исключены. И та же логика объясняет, почему строки «XYZ» исключены.

Вам нужно сравнение, которое возвращает True когда оба TABLEB.Sft и TABLEA.Shift являются Null, а также возвращает True, когда оба содержат одни и те же ненулевые значения.

(TABLEB.Sft Is Null AND TABLEA.Shift Is Null) 
OR 
(TABLEB.Sft = TABLEA.Shift) 

Попробуйте этот запрос:

SELECT * 
FROM 
    TABLEA AS a 
    INNER JOIN TABLEB AS b 
    ON a.StaffName = b.StaffN 
WHERE 
    (
     (a.Shift Is Null AND b.Sft Is Null) 
     OR 
     (a.Shift = b.Sft) 
    ) 
    AND 
    (
     (a.Hrs Is Null AND b.Hrs Is Null) 
     OR 
     (a.Hrs = b.Hrs) 
    ); 
+0

ва, но я получил 27 столбцов, смысл должны сделать это трудный путь? – 10e5x

+0

Да, это вызов. Но было бы проблемой расширить свой первоначальный подход до 27 столбцов. Вы можете использовать 'Nz()' как предлагаемое предложение @sgeddes, если ни один из сохраненных номеров не является нулем. Или замените другое «волшебное» число вместо нуля ... если все сохраненные числа положительны, вы можете использовать в качестве сравнения «Nz ​​(a.Shift, -1) = Nz (b.Sft, -1)»). – HansUp

+0

Остерегайтесь 'Nz()' можно использовать только тогда, когда запрос выполняется из сеанса доступа. Если вам нужно запустить запрос из внешнего Access (например, из Dot.Net или Classic ASP), 'Nz()' будет недоступен. В этом случае вы можете использовать 'IIf()' вместо: 'IIf (a.Shift Is Null, -1, a.Shift) = IIf (b.Sft Is Null, -1, b.Sft)' Нули сложны! – HansUp

1

Вы можете обернуть где критерии вокруг функции NZ, чтобы увидеть, если это помогает, как:

NZ(TABLEB.Hrs,0) = NZ(TABLEA.Hrs,0) 
Смежные вопросы