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?
3 Réponses :
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
.
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"
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
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'
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