0
votes

SQL - rejoindre deux requêtes et définir également une valeur par défaut quand il n'y a pas de match

est-il possible de fusionner les deux requêtes suivantes et d'avoir également une valeur par défaut hors connexion code> pour Statut code> quand il n'a pas d'entrée pour correspondre?

Exemple: h3> xxx pré> xxx pré>

deuxième requête: h3>

Remarque: lorsque l'état n'est pas égal à 1, il n'y a pas d'entrée pour cela dans le tableau2. Donc, dans le tableau deux, nous n'avons que des entrées en ligne. P> xxx pré> xxx pré>

je veux que la sortie finale soit quelque chose comme p>

-------------------------------------------
Objects         |   Objects_count  | Status
-------------------------------------------
Unitied_states  |   2              | Online
Germany         |   2              | Offline
Turkey          |   1              | Online
Kuwait          |   2              | Offline


6 commentaires

Veuillez étiqueter votre moteur SQL et fournir des échantillons de données sous forme tabulaire.


Est-ce que cela répond à votre question? Quelle est la différence entre "Join interne" et " Rejoindre "?


L'expression de votre deuxième requête est redondante car le où la clause assure que tous les valeurs Status seront "en ligne" . S'il vous plaît expliquer ce que votre deuxième requête est réellement destinée à accomplir.


Votre deuxième requête est invalide: la valeur Statut n'est pas incluse dans la clause (code> ni partie d'une opération globale. Pourquoi votre deuxième requête a-t-elle un groupe en clause mais n'effectue aucune opération d'agrégation du tout?


Quelles sont les colonnes clés dans table1 et table2 ?


Objets est la clé Tableau1 et Table2 . BTW Votre solution a fonctionné. Merci


3 Réponses :


0
votes

Essayez les éléments suivants à l'aide de Joindre de gauche code> Table1 et Table2 sur Objets CODE>.

select 
    t1.Objects, 
    coalesce(COUNT (t1.*), 0) as  Objects_count,
    case 
        when t2.status = 1 then 'Online'
        else 'Offline'
    end as Status 
from table1 t1
left join table2 t2
on t1.Objects = t2.Objects
GROUP BY 
    Objects,  
    case 
        when t2.status = 1 then 'Online'
        else 'Offline'
    end 


0 commentaires

0
votes

Oui, c'est possible, en faisant un joint externe code>.

Je suppose également que vous voulez code> joindre code> sur les objets sur les objets code> Colonne: P>

SELECT
    COALESCE( t1.Objects, t2.Objects ) AS Objects,
    COALESCE( t1.Objects_Count, 0 ) AS Objects_Count,
--  t2.Status,
    CASE t2.status WHEN 1 THEN 'Online' ELSE 'Offline' END AS status
FROM
    (
        SELECT
            Objects,
            COUNT(*) AS Objects_count
        FROM
            table1
        GROUP BY
            Objects

    ) AS t1

    FULL OUTER JOIN
    (
        SELECT
            Objects, 
            status
        FROM
            table2

    ) AS t2 ON t1.Objects = t2.Objects


3 commentaires

@Utilisateur . . . Basé sur votre question Joindre complet est surkill et non nécessaire pour cette requête.


@Gordonlinoff Quand j'ai écrit ma réponse, je n'étais pas sûr si table1 et table2 représentait des sous-ensembles distincts de toutes les données ou non.


. . Le commentaire a été dirigé vers l'OP, pas chez vous. C'est une approche fine si nécessaire, mais rien dans la question ne suggère vraiment qu'il est nécessaire - il n'y a pas de 0 s dans les résultats des échantillons, par exemple.



0
votes

J'utiliserais une sous-requête corrélée: xxx

Ceci renvoie toutes les lignes de Table1 avec l'état.

alternativement, si < Code> Table2 n'a pas de lignes en double, vous pouvez utiliser un simple joindre rejoindre et agrégation: xxx


4 commentaires

Mise à jour ma question avec les jointures de gauche. Je veux tester votre requête, mais je ne suis pas sûr comment utiliser des alias lorsqu'il y a d'autres jointures de gauche. Pouvez-vous mettre à jour votre réponse?


@utilisateur . . . (1) Ne mettez pas à jour une question après avoir reçu une réponse, en particulier d'une manière qui invalide les réponses. Qui attire les bowvotes sur cette réponse. (2) Vous pouvez avoir Syntaxicalement Mettez rejoindre dans la réponse, mais le où la clause le transforme simplement en une jointure intérieure. Vous devriez probablement demander une nouvelle question avec des données d'échantillonnage appropriées, des résultats souhaités et des explications.


Ok, je reviendrai la question à son état d'origine.


Pouvez-vous mettre à jour votre réponse pour adapter quelques jointures de gauche, puis alias? Je pense qu'une nouvelle question demandant comment le faire ressembler à votre requête pourrait apporter des bowvotes.