2015-10-14 1 views
2

У меня есть запрос, который возвращает данные клиента из таблицы temp. В таблице temp хранится только номер клиента и фамилии. Он имеет около 320 записей для людей, которые имеют право на участие в программе.Наличие в SQL-заявлении не возвращает точных результатов

create table #customers 
(
customer_no int, 
fname varchar(20), 
lname varchar(55) 
) 

Что мне нужно сделать из базы данных говорят, дайте мне все от всей нашей базы данных, который имеет сочетание имени и фамилии (найти дубликаты). Нам также нужно вытаскивать адреса, но мы не хотим использовать номер клиента в нашем поиске, потому что мы нуждаемся в нем позже, но на данный момент мы хотим, чтобы сравнение было строго на имя и фамилию.

select distinct a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
where (
     lname in (select lname from #customers) and 
     fname in (select fname from #customers) 
     ) 
order by a.lname, a.fname 

поэтому запрос возвращается с хорошим длинным списком записей - однако, потому что есть много комбинаций дубликатов (это возвращает номер клиента несколько раз).

, например:

customer_no fname mname lname street1    city 
86224371 John NULL Cornid 11 Maplewood Dr. New Haven 
86224371 John NULL Cornid 11 Maplewood Drive Hartford 
86313525 John NULL Cornid 11 Maplewood Dr  Hartford 
86390546 John Seth Cornid 11 Maplewood dr. New Haven 

Так что данные верны. Единственная проблема заключается в том, что я хочу подавить первую строку - я хочу сказать, что даю только уникальные номера клиентов. Я хочу, чтобы мой выход будет:

customer_no fname mname lname street1    city 
    86224371 John NULL Cornid 11 Maplewood Dr. New Haven 
    86313525 John NULL Cornid 11 Maplewood Dr  Hartford 
    86390546 John Seth Cornid 11 Maplewood dr. New Haven 

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

select distinct a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
where (
     lname in (select lname from #customers) and 
     fname in (select fname from #customers) 
     ) 
group by a.customer_no, 
      a.fname, 
      a.mname, 
      a.lname, 
      b.street1, 
      b.street2, 
      b.city, 
      b.state, 
      b.postal_code 
having count(a.customer_no) > 1 
order by a.lname, a.fname 

я писал выше, включают наличие количества customer_no> 1, но он не работает, потому что она возвращает пустой набор данных.

сообщите пожалуйста. спасибо.

ответ

4

Вы должны использовать объединение

select 
     a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
from T_CUSTOMER a 
join T_ADDRESS b on a.customer_no = b.customer_no 
join #customers c on a.lname = c.lname and a.fname = c.fname 
order by a.lname, a.fname 

как примечание стороны, если вы должны использовать отчетливый вы, вероятно, делают это неправильно.


иногда вам нужно сделать, это:

join #customers c on upper(a.lname) = upper(c.lname) and upper(a.fname) = upper(c.fname) 

иногда вам нужно сделать, это:

join #customers c on trim(a.lname) = trim(c.lname) and trim(a.fname) = trim(c.fname) 

Это может быть другой вопрос, но в комментарии ниже

У нас есть запись с несколькими адресами и ее возврат и подсчитывается несколько раз. Но я только хочу, чтобы это произошло, если имена разные - и число клиентов отличаются

Чтобы только «считать», когда я хотел бы сделать это:

select * from 
(
    select a.customer_no, 
     a.fname, 
     a.mname, 
     a.lname, 
     b.street1, 
     b.street2, 
     b.city, 
     b.state, 
     b.postal_code 
     row_number(partition by a.fname, a.lname, a.customer_no 
        order by street1, stree2) as rn 
    from T_CUSTOMER a 
    join T_ADDRESS b on a.customer_no = b.customer_no 
) x 
where rn = 1 

Не я хотел бы предложить лучшее поле чем street1 в качестве порядка, например, дату обновления или дату создания.

+0

Извинения за изменения здесь ... это не работает. У меня есть первый набор записей, возвращающихся дважды. 86224371, 86224371, 86313525, 86390546. Да, адреса разные, но мне все равно. Мне нужно предоставить пользователю уникальные номера клиентов. поэтому мне нужно, чтобы это было 86224371, 86313525, 86390546. – Elizabeth

+0

нормально, как он не работает ... чего вы ожидали от того, что он не делает? – Hogan

+0

У нас есть запись с несколькими адресами и ее возвращение и подсчет несколько раз. Но я хочу только, чтобы это произошло, если имена разные, а номера клиентов разные. – Elizabeth