我有两张桌子。客户和图像。
我加入这些并且只在图像是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"显然是错的 这感觉过于简单,但我已经有一段时间了,无法弄明白。
我只需要一行,因为ImageId为空
答案 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