2015-09-18 2 views
0

Dans ma requête, je sélectionne une colonne qui ne peut pas exister car cette colonne provient d'une sous-requête dans une jointure. (La sous-requête peut me donner 0 lignes)Requête SQL utilisant la jointure interne avec une sous-requête 0 Ligne

Par conséquent, dans ce cas, je veux sélectionner 0 au lieu de la colonne "temp.Quantity".

Le code:

SELECT 
    bx.BX_BoxNum, 
    temp.Quantity -- <- this column 
FROM BOX bx 
INNER JOIN (SELECT BX_Id, SUM(BX_Quantity) AS Quantity FROM BOX 
      WHERE BX_Top_S = 'True' GROUP BY BX_Id) temp 
    ON bx.BX_Id = temp.BX_Id 
WHERE bx.BX_BoxNum = 10 

Parfois, un numéro de boîte est vide! Et j'essaie d'avoir une ligne avec "BOX n ° 10 - 0" au lieu de rien

Pourriez-vous s'il vous plaît aidez-moi?

+1

Aucun problème avec une barrière de la langue. Nous partageons une langue en commun, t-sql. Voici un excellent article pour vous aider à converser ce genre de chose dans notre langue commune. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Utilisez une jointure outter (habituellement une jointure à gauche) si vous voulez retourner les résultats même si la deuxième requête/sous-requête ne renvoie rien et vous ne voulez pas une utilisation nulle coalesce pour le transformer en zéro – jean

Répondre

0
SELECT bx.BX_BoxNum, ISNULL(temp.Quantity, 0) 
FROM BOX bx 
left outer JOIN (SELECT BX_Id, SUM(BX_Quantity) AS Quantity FROM BOX 
WHERE BX_Top_S = 'True' GROUP BY BX_Id) temp ON bx.BX_Id = temp.BX_Id 
WHERE bx.BX_BoxNum = 10 

Les jointures externes permettent d'effectuer des sélections lorsqu'un côté d'une jointure ne renvoie rien. Les jointures internes doivent avoir des lignes des deux côtés de la jointure (comme vous l'avez trouvé!). Google pour les différences entre les jointures GAUCHE, DROITE et FULL Outer.

+0

merci pour votre aide :) –

0
SELECT bx.BX_BoxNum, SUM(COALESCE(temp.Quantity, 0)) AS Quantity 
FROM BOX bx 
    LEFT JOIN BOX temp ON bx.BX_Id = temp.BX_Id AND temp.BX_Top_S = 'True' 
WHERE bx.BX_BoxNum = 10 
GROUP BY bx.BX_BoxNum 
+0

merci pour votre aide, mais j'avais besoin d'une sous-requête parce que la requête j'ai écrit ici est une version simplifiée de ma vraie requête. ^^ –

+0

L'idée principale - vous devriez utiliser LEFT/RIGHT OUTER JOIN au lieu de INNER JOIN. Seulement dans ce cas, vous pouvez obtenir "BOX n ° 10 - 0" si la sous-requête ne retourne aucun enregistrement. –