Найти недостающую строку с помощью SQL - PullRequest
1 голос
/ 01 апреля 2011

У меня есть таблица TRANSACTIONS со столбцами:

TRANSACTIONKEY (int) Primary Key
TRANSACTIONTYPEKEY (int) 
RECEIPTNUMBER (varchar)

TRANSACTIONTYPEKEY может иметь значения в диапазоне от 1 до 50. Там ДОЛЖЕН быть строкой TRANSACTIONSс TRANSACTIONTYPEKEY = 1, и тогда может быть любое количество других TRANSACTIONTYPEKEY записей - даже дубликаты некоторых (еще один вопрос в другой раз).

Меня попросили предоставить отчет, который показывает всеквитанции (RECEIPTNUMBER), которые имеют запись для TRANSACTIONTYPEKEY = 50 , но не имеют TRANSACTIONTYPEKEY запись = 1 .Руководство обнаружило полдюжины случайно и хочет знать в полной мере, и эта таблица содержит почти 50 000 строк транзакций.

Возможно ли это с помощью SQL?Я использую SQL Server 2000 и T-SQL, чтобы быть конкретным.

Я пытался

SELECT RECEIPTNUMBER 
FROM   TRANSACTIONS 
WHERE  TRANSACTIONTYPEKEY = 50 
AND    TRANSACTIONTYPEKEY NOT IN (SELECT TRANSACTIONTYPEKEY FROM TRANSACTIONS WHERE TRANSACTIONTYPEKEY <> 1)

, но этот запрос продолжается и продолжается!Я должен отменить это.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Попробуйте это:

SELECT a.RECEIPTNUMBER  
    FROM TRANSACTIONS  a
 WHERE a.TRANSACTIONTYPEKEY = 50  
   AND  NOT EXISTS
                (
                    SELECT 1 
                      FROM TRANSACTIONS b
                     WHERE b.RECEIPTNUMBER = a.RECEIPTNUMBER 
                       AND b.TRANSACTIONTYPEKEY = 1
                )
1 голос
/ 01 апреля 2011

Предположим, что фильтр находится на TRANSACTIONTYPEKEY, а соединение - на TRANSACTIONKEY

SELECT T1.RECEIPTNUMBER 
FROM   TRANSACTIONS T1
WHERE
     T1.TRANSACTIONTYPEKEY = 50 
AND  NOT EXISTS (SELECT * FROM TRANSACTIONS T2
                       WHERE T2.RECEIPTNUMBER = T1.RECEIPTNUMBER --oops. fixed
                          T2.TRANSACTIONTYPEKEY > 1)
...