SQL Group By,Distinct confusion

时间:2015-12-17 07:15:40

标签: sql .net

我有一个链接到sql DB的程序,包含2个表 - SInfoCUSTOMERID (Primary Key) FIRSTNAME LASTNAME EMAIL

客户拥有正常的列:

SSheetID     (Primary Key)
CustomerID
SerialNumber

SInfo有关于客户的详细信息:

inner join

当我在.net中使用查询构建器时,我使用distinct来组合表,并使用过滤器来搜索序列号,但是当主键显示更多时我收到错误不止一次。

enter image description here

我尝试使用GROUP BY,但如果一个字段不同,我会收到错误,而 $scope.Users = ""; $scope.click = function () { var _reqObj = new Object(); _reqObj.Name = $scope.dropdown; _reqObj.Meth = "PD"; $.ajax({ method: 'POST', url: 'WebForm1.aspx', data: _reqObj, success: function (response) { $scope.Users = response; //double click disable purpose $scope.$apply(function () { $location.path("/PD"); }); } }); } 正在杀死我。

所以我的问题是,如果客户(CustomerID)具有多次相同的序列号,那么最佳做法是什么,但我只想显示一次CustomerID,但仍然填写FirstName,LastName,Email?< / p>

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

就像Turophile所说的那样我觉得SInfo表中的数据有问题。所以你应该先做的就是先清理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

答案 1 :(得分:1)

您可以在这种情况下使用自然联接,因为当您使用自然联接时,它将匹配具有相同客户ID的人,然后使用GROUP BY,这样它将显示一次名称。

select first_name, last_name, email
from customer natural join Sinfo
group by customerID, first_name, last_name, email

答案 2 :(得分: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 - 可能是有道理的。