2011-05-15 5 views
2

J'ai deux tables. Un des événements et un des articles.
Chaque événement a un article lié, mais les articles peuvent exister sans événements correspondants.
Ce que je veux faire est obtenir une liste de tous les articles et avoir une pseudo-colonne bool qui indique si l'article a un événement lié ou non.
c.-à-d. S'il existe une ligne dans [Events] où ArticleID = l'articleID actuel alors vrai, sinon faux.sql server 2008 r2 - pseudo-colonne conditionnelle

+0

Vous pouvez faire comme dans cette réponse. http://stackoverflow.com/questions/5992673/get-current-record-for-a-subquery-in-t-sql/5992772#5992772 –

+0

@Mikael Eriksson - Merci pour le commentaire. C'est aussi une bonne solution, mais celle de BobTodd est meilleure car elle est persistante (Si je peux la faire fonctionner éventuellement) –

Répondre

3

Utilisez une colonne calculée persistante

d'abord créer une fonction pour retourner true ou false

-- This function will provide the computed column definition 
CREATE FUNCTION udf_article_has_events (@id int) 
RETURNS bit 
WITH SCHEMABINDING 
AS 

BEGIN 

DECLARE @retval bit 

set @retval = 0 
if exists(select * from [Events] where ArticleId = @id) 
    set @retval = 1 


RETURN @retval 

END 

ajouter ensuite la colonne calculée comme celui-ci

Alter TABLE [dbo.Article] Add HasEvents As dbo.udf_events_exist(id) 
+0

@BobTodd - Juste un problème - J'obtiens l'erreur suivante: "Colonne calculée 'HasEvents' dans la table 'cmsArticle 'ne peut pas être persisté car la colonne est non-déterministe " –

+0

ive a ajouté l'attribut schemabinding –

+0

@Elad - Je suis sûr que vous ne pourrez pas persister. La valeur de la fonction changera si vous supprimez une ligne de la table 'Events'. –

1

Si la valeur doit être persisté, vous besoin d'un déclencheur after insert et delete sur la table Event pour mettre à jour la colonne Article.HasEvents

CREATE TRIGGER SetHAsEvents 
ON dbo.[Events] 
FOR INSERT 
AS 
    Update Article Set HasEvents = dbo.udf_article_has_events(inserted.ArticleId) 
    Where Id = inserted.ArticleId 
GO 

avantage d'une colonne est persistante qu'il peut être indexé

1

Créer une vue de ce

SELECT *, CASE 
      WHEN E.ArticleID IS NULL THEN false 
      ELSE true 
      END as EventExist 
FROM Article A 
LEFT JOIN Events E ON A.ArticleID = E.ArticleID