2010-07-06 4 views
1

J'ai une procédure stockée simple comme ceci:sélection sql de tables différentes en fonction booléenne

ALTER PROCEDURE [dbo].[spList_Report] 
    @id INT 


AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM 
    tblProducts as products 
    WHERE 
    product.intID = @id 

j'ai 2 tables utilisateur: MainUser et SubUser Les deux tables ont une colonne de clé étrangère productID qui est liée à la clé primaire intID de la table de produit intID. Ils ont tous les deux aussi une colonne emailAddress. La table de produit a également une colonne bit isMainUser.

Comment puis-je mettre à jour ma procédure stockée pour renvoyer la colonne emailAddress en fonction de la valeur isMainUser? Ainsi, si la valeur est true, elle sélectionne l'adresse e-mail de la table MainUser et, si elle est false, elle sélectionne l'adresse mailAddress de la table SubUser.

ce que je veux par exemple est une seule colonne emailAddress:

ALTER PROCEDURE [dbo].[spList_Report] 
    @id INT 


AS 
    SET NOCOUNT ON 

    SELECT 
    products.* 
    , myUser.emailAddress 
    FROM 
    tblProducts as products 
    WHERE 
    product.intID = @id 
+0

Quelle est la relation entre les produits et MainUser/SubUser? –

Répondre

3

Vous avez laissé des informations importantes. Je suppose que

  • Products peuvent être joints à MainUser sur un UserProductID
  • Products peut être joint à SubUser sur un UserProductID
  • Il y a 1 utilisateur principal pour chaque produit. (très probablement pas, mais qui devra être adressé lorsque vous nous avez donné plus d'informations)
  • Il ya 1 sous-utilisateur pour chaque produit.

Déclaration SQL

SELECT products.* 
      , CASE WHEN isMainUser=1 
      THEN MainUser.emailAddress 
      ELSE SubUser.emailAddress 
      END 
    FROM tblProducts as products 
      LEFT OUTER JOIN MainUser mu ON mu.UserProductID = products.UserProductID 
      LEFT OUTER JOIN SubUser su ON su.UserProductID = products.UserProductID  
    WHERE product.intID = @id 

Note qu'il est considéré comme une mauvaise pratique d'utiliser un SELECT *. SELECT * ne devrait jamais être présent dans le code de production.

0

Créer une vue sur les deux tableaux et se joindre à celle de votre proc

Questions connexes