2015-10-07 2 views
0

У меня есть инструкция TSQL, которая запрашивает одну таблицу, которая ищет повторяющиеся номера уличных адресов. Например, «123 Street» соответствует «123 St.». Я использую CHARINDEX отделить строку, выбирая символы слева от строки, но до пространства, которые являются почти всегда цифры, как показано ниже:TSQL Azure SQL Server LEFT CHARINDEX

"SELECT NewId() as NewId," + 
      //We rename the dbo.User table as "a" then rename it again as "b" so we can look for duplicate Street Address numbers 
      "a.Id AS LeftID,a.DateSubmitted AS LeftDateSubmitted,a.Updated AS LeftUpdated," + 
      "a.Status AS LeftStatus,a.StreetAddress AS LeftStreetAddress," + 

      "b.Id AS RightID,b.DateSubmitted AS RightDateSubmitted,b.Updated AS RightUpdated," + 
      "b.Status AS RightStatus,b.StreetAddress AS RightStreetAddress " + 

      //We join the 2 virtual dbo.User tables where table b Id's are greater than table a meaning b records are newer 
      "FROM [User] a JOIN [User] b ON b.Id > a.Id AND " + 

      //LEFT selects the left most characters (usually numbers) in the StreetAddress field string before the space ' ' 
      //and eliminates the rest of the address isolating just the street address numbers for matching 
      "LEFT(a.StreetAddress,CHARINDEX(' ',a.StreetAddress)) = LEFT(b.StreetAddress,CHARINDEX(' ',b.StreetAddress)) " + 

      //Don't show orange or blue status records 
      "AND b.Status != 'Orange' AND a.Status != 'Orange' AND a.Status != 'Blue' AND b.Status != 'Blue' " + 

      //If a b record (newer) is red then ignore because it is completed and ignore a records (oldest) older than 90 days 
      "WHERE a.DateSubmitted >= (GetDate() - 90) AND b.Status != 'Red' " + 

      //Show newest records first 
      "ORDER BY b.DateSubmitted DESC" 

Это работает довольно хорошо до сих пор было замечено, что ложь позитивы подхватили, если человек поступил в адрес во всех колпачков, как показано ниже: Grid View

Мое понимание использования:

LEFT(a.StreetAddress,CHARINDEX(' ',a.StreetAddress)) 

приведет ли в крайней левой ча racters перед пространством, используемым для моего JOIN, но изображение выше показывает совпадения, которые не должны возникать? Пожалуйста, помогите начинающему SQL ...

ответ

1

Я не думаю, что запрос, который вы отправляете на сервер базы данных для получения этих результатов, является точным запросом, который вы генерируете с помощью этого кода. Это не только неправильное совпадение адресов ... вы также можете увидеть, что есть ID в b, которые меньше a. Установите точку прерывания, в которой вы отправляете запрос на сервер, и проверьте строку запроса и проверьте, что вы действительно отправляете.

+0

Я ценю ответ, но я не уверен, что ответ говорит мне, говоря, что запрос не доходит до сервера. Что именно привело бы вас к этой решимости? Спасибо Брайан, я попробую точку останова. –

+0

Я не думаю, что сервер выполняет запрос, который вы нам поделили, потому что строка, которую вы, кажется, строите с этим кодом, совсем не соответствует вашим результатам. Я не думаю, что это проблема с запросом, который вы намереваетесь, или с строками в данных ... Я думаю, что это проблема с логистикой отправки правильной строки на сервер. Я не могу помочь вам в этой части с информацией, которую вы поделили в своем вопросе. Это не просто совпадение адресов неправильно ... это игнорирует часть, которая также объединяется с идентификаторами. –

+0

Дело в том, что он хорошо работает уже много месяцев. На этой неделе это стало странно и только с адресами, набранными всеми шапками. При этом понятно, что с этой ограниченной информацией прямой ответ вряд ли достигнут. Я надеялся, что CHARINDEX и подсказка всех шапок могут вызвать звонок для кого-то, но это может быть красная селедка. Кроме того, несмотря на то, что в выражении SQL есть конкатенация, когда я его разрабатываю, это единственная строка в VS 2015 и оба результата совпадают. Но самое главное - это ваше предложение добавить точки останова, о которых я сейчас разъясняю. Тай Брайан! –