web-dev-qa-db-fra.com

Comment obtenir une valeur booléenne dans une opération de sélection basée sur une autre table?

J'ai deux tables: Message et Attachments (qui représentent des types d'entités qui ont une relation unique) comme suit:

CREATE TABLE message (
    messageId ..., 
    [from]..., 
    [to]..., 
    subject..., 
    body...
);

CREATE TABLE attachments (
    messageId..., 
    filename...
);

Je souhaite sélectionner les données du message de base et inclure une colonne de bits pour indiquer si le message a des pièces jointes ou non. J'essaie d'utiliser Exist dans l'opération indiquée ci-dessous:

SELECT  
M.*,
hasAttachments = EXISTS(SELECT AttachmentId 
                          FROM Attachment 
                         WHERE messageId = M.messageId),
FROM Message M

Mais cela ne fonctionne pas - quelle est la façon de faire ce que je cherche?

3
kacalapy

Je le ferais avec une déclaration de cas:

select
    m.*,
    hasAttachments = CASE WHEN EXISTS(select * from Attachment where messageId = M.messageId) then 1 else 0 end
from Message M

ou alors

select distinct 
    m.*,
    hasAttachments = CASE WHEN a.AttachmentId is not null then 1 else 0 end
from Message m
left join Attachment a on a.MessageId = m.MessageId
6
Marian
select  
    M.*,
   CAST(select COUNT(*) from Attachment A where A.messageId = M.messageId) AS bit) AS hasAttachments,
FROM Message M

ou alors

select  
    M.*,
   CAST(hasAttachments AS bit) AS hasAttachments,
FROM
  Message M
  CROSS APPLY
  (select COUNT(*) AS hasAttachments
   from Attachment A
    where A.messageId = M.messageId) A2
3
gbn