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?
3 Réponses :
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)
Merci beaucoup, c'est ce que je cherchais!
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 = ?;
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.
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.