如何在TSQL中满足条件时选择列

时间:2015-10-29 09:24:30

标签: sql sql-server tsql

我有两张桌子。客户和图像。

我加入这些并且只在图像是profilepicture时才从Images表中选择Image Id。

然而,如果用户有多张图片,但只有图片上的图片是个人资料图片,我仍然可以使用相同的用户返回多行。

我的代码:

SELECT DISTINCT c.Id, c.Name, c.LastName, c.Email, c.MobilePhoneNumber,
(SELECT CASE WHEN im.Isprofile = 1 THEN im.Id END) AS ImageId,
 im.ContentType 
   FROM Customers c
JOIN Images im ON im.CustomerId = c.Id

" CASE WHEN"显然是错的 这感觉过于简单,但我已经有一段时间了,无法弄明白。

编辑: 我得到这个结果: enter image description here

我只需要一行,因为ImageId为空

4 个答案:

答案 0 :(得分:2)

SELECT DISTINCT c.Id,
  c.Name, 
  c.LastName,
   c.Email,
  c.MobilePhoneNumber,
 (im.Id) AS ImageId, im.ContentType FROM Customers c
LEFT JOIN Images im ON im.CustomerId = c.Id and im.Isprofile = 1

希望这有帮助

答案 1 :(得分:2)

使用OUTER APPLY

SELECT c.Id, 
       c.Name, 
       c.LastName, 
       c.Email, 
       c.MobilePhoneNumber, 
       im.ID AS ImageID, 
       im.ContentType 
FROM Customers c
OUTER APPLY(SELECT TOP 1 ID, ContentType FROM Images im 
            WHERE im.CustomerId = c.Id AND im.Isprofile = 1) im

答案 2 :(得分:1)

这取决于你的实施,但从长远来看,你可能会从中受益。这相当于我在那里所做的,但CTE代替了它。

WITH ProfilePictures AS (
    SELECT ID, ContentType, CustomerId
    FROM Images i
    WHERE i.IsProfile = 1
)

SELECT c.Id, c.Name, c.LastName, c.Email, c.MobilePhoneNumber, im.Id AS ImageId, im.ContentType
FROM Customers c
    LEFT OUTER JOIN ProfilePictures im ON im.CustomerId = c.Id

此实现假定每个客户都有零个或一个标有IsProfile = 1的图像。

为了清楚起见,如果你只看一次或两次这个逻辑,那就太过分了。我只是想把客户与他们的照片联系起来可能是你做了很多事情,在这种情况下,抽出那些逻辑可以派上用场。

对于它的价值,如果我的解释是正确的,当然这取决于你,我很想放弃IsProfile位,并在Customers上为{{{{}}添加一个字段1}}使用适当的外键。然后,连接将非常简单,您不必担心保持这种逻辑。

答案 3 :(得分:1)

试一试:

SELECT 
    DISTINCT cust.Id
        ,cust.Name
        ,cust.LastName
        ,cust.Email
        ,cust.MobilePhoneNumber
        ,img.Id AS ImageId
        ,img.ContentType 
FROM Customers as cust
LEFT OUTER JOIN Images as img ON img.CustomerId = cust.Id and img.Isprofile = 1