Сравнение полей в sql server 2008 r2, где есть и буквы, и цифры - PullRequest
0 голосов
/ 28 июля 2011

Я довольно новичок в программировании на T-SQL и столкнулся с проблемой, которую мне еще предстоит найти и ответить.Я надеялся, что эксперты здесь и скажут мне, где я ошибся.

Я пытаюсь сравнить 2 столбца серийных номеров с оператором not in, и он отлично работает, если в столбцах есть только цифры, но еслив серийном номере есть буква, которая просто возвращает все записи, а не только записи, которых нет во второй таблице.Ниже мой вопрос, я надеюсь, что кто-то может указать, что я сделал неправильно.Заранее спасибо.

@Transaction varchar (50)

AS

    SET NOCOUNT ON;

SELECT       transaction, equiptype, serialnum

FROM             table1

WHERE           ( serialnum NOT IN
        (SELECT serial_num
                      FROM   table2 ) AND transaction = @Transaction)

PS - это номер моей транзакции. Я фильтрую запись по

table1-

     [transaction] [equiptype] [serialnum]
       12345678        12         56742
       12345678        11         87529
       12345678         8         46259
       87654321         8          the143
       87654321        10          the527
       87654321        11          u3765

table2-

       [transdate]    [transaction]   [user]  [equiptype]  [serial_num] [status]
  7/28/11          12345678      test      12       56742     NewStock
        7/28/11        12345678      test         11         87529     NewStock
        7/28/11        87654321      test         11         u3765     NewStock
        7/28/11        87654321      test         10         the527    NewStock

Исходя из этой транзакции данных, 12345678 будет возвращать только последнюю запись с serialnum 46259, и это прекрасно работает, но если я попытаюсь сделать то же самое с транзакцией 87654321, она вернет все записи, как если бы не выполнено выполнение инструкции NOT IN вместосерийный номер the143.

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Может быть, это из Сбора серверов.Пожалуйста, попробуйте

SELECT TRANSACTION, equiptype, serialnum
FROM table1
WHERE  (serialnum  COLLATE SQL_Latin1_General_CP1_CI_AS  
        NOT IN (SELECT serial_num  COLLATE SQL_Latin1_General_CP1_CI_AS FROM table2 ) 
    AND TRANSACTION = @Transaction)
0 голосов
/ 29 июля 2011

Я думаю, что этот запрос может помочь вам

declare @Transaction varchar(50)
set @Transaction='something'

select table1.a,table1.b,table1.c ,table2.d 
from table1 
left join table2 
  on table1.b=table2.d 
where table2.d is null 
  and table1.a=@Transaction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...