0
votes

Comment SELECT avec plusieurs conditions? (O ... ET ... DANS (...))

Par exemple: dans ma base de données j'ai 3 tables: COMPANY, COUPON et COMPANY_COUPON. La table COMPANY a des champs: ID et NAME, la table COUPON a: ID, TITLE et TYPE, la table COMPANY_COUPON a: ID des COMPANies et ID des COUPONs qu'ils possèdent.

Donc, en java pour obtenir tous les coupons de l'entreprise J'utilise la commande:

SELECT * FROM company_coupon WHERE company_id = 1 AND coupon_id = (SELECT * FROM coupon WHERE type = camping)

Et je la mets dans Collection.

Mais j'ai besoin de quelque chose pour obtenir tous les coupons de l'entreprise par type, quelque chose comme:

SELECT coupon_id FROM company_coupon WHERE company_id = ?

bien sûr celui-ci ne fonctionne pas, mais je cherche quelque chose comme ça.

Je sais que je peux tout obtenir coupons de la société et les mettre dans Collection, puis supprimez simplement tous les coupons qui ne correspondent pas au type spécifié, mais y a-t-il un moyen de faire ce processus dans la base de données par des commandes SQL?


0 commentaires

3 Réponses :


2
votes

Utilisez uniquement une colonne avec un opérateur IN

SELECT * 
  FROM COMPANY_COUPON 
 WHERE COMPANY_ID = 1 
   AND COUPON_ID IN (SELECT COUPON_ID FROM COUPON WHERE TYPE = CAMPING)


1 commentaires

Merci beaucoup, c'est ce que je cherchais!



2
votes

Je pense que vous voulez juste une join :

SELECT cc.COUPON_ID
FROM COMPANY_COUPON cc JOIN
     COUPON c
     ON cc.COUPON_ID = c.ID
WHERE cc.COMPANY_ID = ? AND c.TYPE = ?;


0 commentaires

2
votes

Vous pouvez utiliser WHERE IN ici:

SELECT cc.*
FROM COMPANY_COUPON cc
WHERE
    cc.COMPANY_ID = 1 AND
    EXISTS (SELECT 1 FROM COUPON c WHERE c.TYPE = 'CAMPING' AND c.ID = cc.COUPON_ID);

Vous pouvez également utiliser EXISTS , qui est probablement le meilleur moyen de écrivez votre logique:

SELECT *
FROM COMPANY_COUPON
WHERE COMPANY_ID = 1 AND COUPON_ID IN (SELECT ID FROM COUPON WHERE TYPE = 'CAMPING');

L'utilisation de EXISTS peut surpasser la réalisation d'une jointure entre les deux tables, car la base de données peut s'arrêter dès qu'elle trouve premier match.


3 commentaires

Merci beaucoup, c'est ce que je cherchais!


@VladimirKraykin Toutes les réponses données devraient fonctionner, et toutes méritent des votes positifs. Vous ne pouvez pas faire cela, mais pour référence future, il est bon de récompenser les réponses utiles en les votant (je pense que vous pouvez le faire après 500 ou 1000 points de répétition).


Oui, je voudrais tous les voter, mais maintenant je ne peux plus.