1
votes

SQL AND pour voir si deux indicateurs sont définis dans deux tables différentes?

SELECT 1 FROM
(SELECT 1 FROM mytable1 WHERE parentid = 'ID1' AND flag = 'Y') as X,
(SELECT 1 FROM mytable2 WHERE id = 'ID2' AND flag = 'Y') as Y 
I'm making a query to see if two flags are set in two tables, where 'parentid' and 'id' are both primary keys. The query should return a row only if both flags are set to 'Y', or return nothing otherwise, then I do stuff with that result in my backend code.I've tested this and it works but I feel like it looks wonky and could be optimized. Any ideas?

2 commentaires

Quelle technologie SQL utilisez-vous? Comment ces clés sont-elles associées entre les 2 tables? Pouvez-vous créer une jointure sur eux et ajouter la logique à la clause where?


Cela fonctionne comme prévu lorsque ces colonnes sont uniques


3 Réponses :


1
votes

Votre requête est correcte (même si j'utiliserais CROSS JOIN . Cependant, je préférerais une ligne avec une valeur spécifique. Je la formulerais comme suit:

SELECT (CASE WHEN EXISTS (SELECT 1 FROM mytable1 WHERE parentid = 'ID1' AND flag = 'Y') AND
                  EXISTS (SELECT 1 FROM mytable2 WHERE id = 'ID2' AND flag = 'Y')
             THEN 1 ELSE 0
        END) as flag

Selon votre base de données, vous aurez peut-être besoin de from dual .


0 commentaires

0
votes

Il vaut mieux utiliser JOIN au lieu de faire des sous-requêtes

SELECT mytable1.parentid, mytable2.id 
FROM mytable1
JOIN mytable2 ON mytable2.flag = "Y" AND mytable1.flag = "Y"


1 commentaires

C'est totalement faux - le drapeau égal à y n'est jamais ce qui joindrait deux tables et en SQL un guillemet simple ' est utilisé pour désigner des chaînes de caractères



2
votes

Pour obtenir ce que vous voulez:

SELECT CASE WHEN a.flag = 'Y' AND b.flag = 'Y' THEN 1 ELSE 0 END AS result
    FROM TABLE ( VALUES 1 ) AS always(present)
        LEFT JOIN mytable1 AS a ON a.parentid = 'ID1'
        LEFT JOIN mytable2 AS b ON b.id = 'ID2'

Mais en fait, je préférerais une requête avec LEFT JOIN, qui donne toujours une ligne, comme ceci:

SELECT 1
    FROM mytable1 AS a, mytable2 AS b
    WHERE a.parentid = 'ID1' AND a.flag = 'Y'
        AND b.id = 'ID2' AND b.flag = 'Y' 


0 commentaires