Выберите данные из одной таблицы, где поле больше, чем у другого поля в другой таблице - PullRequest
0 голосов
/ 06 сентября 2011

Я хочу иметь возможность выбирать данные из Таблицы A, где Поле1 больше, чем Поле2 в Таблице B.

В моей голове я представляю, что это что-то вроде этого

    Select TableA.*
    from TableA
    Join TableB 
    On TableA.PK = TableB.FK

    WHERE TableA.Field1 > TableB.Field2

Яс использованием SQL Server 2005 и таблиц TableA.Field1 и tableB.Field2 выглядят следующим образом:

2004102881010 - data type - Vrachar 

Мои PK и FK выглядят следующим образом:

0908232      - data type - nvarchar

Проблема в том, что этот запрос выполняется ALLданные отображаются, а не только строки, в которых поле Field1 больше.

Cheers:)

Ответы [ 3 ]

0 голосов
/ 06 сентября 2011

Это похоже на проблему с отсутствующими нулями: 20041028 * 0 * 81010

В вашем запросе нет ничего плохого, кроме ваших данных. Рассмотрим 2001-01-01 01:01:01, это будет выглядеть как: 200111111 Это следует рассматривать как: 20010101010101

0 голосов
/ 06 сентября 2011

Операторы сравнения (>, <), используемые для строк (varchars, nvarchars и т. Д.), Работают в алфавитном порядке. Например, «9»> «11» - это правда. Вы можете попробовать выполнить преобразование типов данных ...

WHERE cast(A.field1 as int) > cast(B.field2 as int)
0 голосов
/ 06 сентября 2011

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

;
with TABLEA (PK, Field1) AS
(

    -- Sample row that is filtered out
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50))
    -- This is bigger than what's in B
    UNION ALL SELECT CAST('0908232' AS nvarchar(10)), CAST('2005102881010' AS varchar(50))
)
, TABLEB(FK, Field2) AS
(
    -- This matches row 1 above and will be excluded
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50))
)
SELECT TableA.*
FROM TableA
INNER JOIN TableB 
ON TableA.PK = TableB.FK
WHERE TableA.Field1 > TableB.Field2

Результаты

PK        Field1
0908232   2005102881010
...