2015-12-17 4 views
2

У меня есть программа, которая связана с sql DB, с двумя таблицами - Customers и SInfo.SQL Group By, Distinct confusion

Клиентов имеют нормальные колонки:

CUSTOMERID (Primary Key) 
FIRSTNAME 
LASTNAME 
EMAIL 

SInfo имеет подробности о Клиенте:

SSheetID  (Primary Key) 
CustomerID 
SerialNumber 

Когда я использую конструктор запросов .net, я использую inner join объединить таблицы, и используйте фильтр для поиска серийного номера, но я получаю сообщение об ошибке, когда первичный ключ отображается несколько раз.

enter image description here

Я пытался использовать distinct, но если одно поле было по-другому, я получил бы ошибку, и GROUP BY убивает меня.

Итак, мой вопрос в том, какова была бы лучшая практика, если Клиент (CustomerID) имеет один и тот же серийный номер более одного раза, но я просто хочу показать, что CustomerID один раз, но все еще заполняет FirstName, LastName, Email?

Любая помощь приветствуется.

+4

Сообщите нам ваш запрос? –

+0

Пожалуйста, не используйте изображения. Просто вставьте текст. – Turophile

+0

Покажите нам свою 'TRY'? – Ragul

ответ

1

Как что Turophile сказал я думаю, что данные в таблице SInfo получили некоторые problem.so, что вы должны сделать, это очистить таблицу SInfo первой или вы можете попробовать это:

select a.CustomerID,a.SerialNumber,b.FirstName from 
    (select distinct (CustomerID),SerialNumber from SInfo)a 
    inner join Customers b on a.CustomerID = b.CustomerID 
0

Различные варианты ...

через distinct:

select distinct c.* -- or better: more specific c. columns 
from SInfo s 
inner join Customers c on c.CUSTOMERID = s.CustomerID 
where s.SerialNumber = @serial 

через exists:

select * 
from Customers c 
where exists (
    select 1 from SInfo s 
    where s.CustomerID = c.CUSTOMERID 
    and s.SerialNumber = @serial) 

, но, как отмечено в комментариях: ограничение уникальности над SInfo.SerialNumber, или, возможно, охватывающих SInfo.SerialNumber and SInfo.CustomerID - вероятно, имеет смысл.

1

Вы можете использовать естественное соединение для этот случай, потому что, когда вы используете естественное соединение, он будет соответствовать людям с одинаковым идентификатором клиента, а затем использовать GROUP BY, чтобы он отображал имя один раз.

select first_name, last_name, email 
from customer natural join Sinfo 
group by customerID, first_name, last_name, email 
Смежные вопросы