6
votes

Créer une requête qui retourne ID si la condition est appariée dans les lignes de deux tables

J'apprends SQL / SMDM et utiliser Postgres. Je veux retourner des rangées qui ont une certaine valeur dans une certaine colonne. Par exemple, dans Tableaux Tapis et Rideaux , je veux obtenir le ID S de lignes où la couleur est "jaune clair" < / code>. Je pense que j'ai besoin de rejoindre pour cela, mais je ne suis pas sûr de quel type.

Voici ce que j'ai: xxx

Les deux tables ont le ID Attribut.

À propos de l'apprentissage Joindre , lequel dois-je apprendre d'abord? Je tire moi-même au pied si j'essaie d'apprendre tous à la fois (comme différentes ressources comprenaient des «variantes» différentes).

Important Je cherchais une réponse où le ID ne serait renvoyé que si les rideaux et le tapis étaient "jaune clair".


0 commentaires

4 Réponses :


2
votes

Étant donné que les résultats sont pour deux tables disjointes, vous voulez réellement un syndicat à la place:

select id, 'curtains' as source from curtains where color = 'lightyellow'
  union 
select id, 'carpets' as source from carpets where color = 'lightyellow'


3 commentaires

Vous voudrez peut-être inclure une colonne de chaîne littérale dans la requête pour indiquer si chaque ligne de sortie décrit un identifiant de rideau ou un identifiant de tapis.


@Tanzeebkhalili Qu'est-ce que le mot "disjoint" comme dans les tables disjointes signifie?


Il ressemble à Union est ce que l'affiche veut. Mais dans les littéraux PostgreSQL utilisent des guillemets simples comme dans 'rideaux' comme source . Édité pour vous.



2
votes

Si vous souhaitez le résultat pour correspondre à deux table, essayez ceci:

select id
  from curtains
      ,carpets
  where curtain.color = carpets.color;


2 commentaires

Mais pas seulement correspondant entre deux tables, la couleur doit être "jaune clair"


@Eleritas que de simplement ajouter et couleur = 'jaune clair' avant le point-virgule.



2
votes

Ces deux requêtes vous donneront le résultat que vous souhaitez ... XXX


0 commentaires

13
votes

avez lu Votre question sur Meta sur cette question particulière, permettez-moi d'expliquer pourquoi les trois réponses sont bien correctes - comme c'est comme la façon dont vous avez travaillé.

J'ai inclus des exemples de toutes les trois réponses et le schéma qu'ils travaillent sur: p> xxx pré>

(bouquet d'instructions d'insertion) p> xxx pré>

Un intersect utilise deux déclarations et ramène les résultats correspondants. Dans ce cas, vous recherchez toutes les lignes qui ont une couleur assortie de «jaune clair». P>

Je ne peux pas vous donner un exemple dans MySQL car il ne le supporte pas (comme vous le pouvez. Voir ci-dessous, il n'est pas nécessaire de donner les mêmes résultats). P>

Une requête syndicale de deux instructions Sélectionnez chacune avec une clause où la clause WHERE permet uniquement la couleur de «jaune clair» renvoyera les mêmes données. Bien qu'un syndicat puisse être utilisé pour renvoyer des données qui ne correspondent pas, la clause WHERE dans chaque instruction SELECT signifie qu'il ne renvoie que les rangées que vous souhaitez. P> xxx pré>

Aww, c'est mauvais vrai? Bien sûr, nous n'avons pas spécifié la clause WHERE: P>

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a 
    -> join carpet b on a.color=b.color
    -> and a.id=b.id
    -> and a.material=b.material
    -> where a.color='Light Yellow';
Empty set (0.00 sec)


7 commentaires

Ce que j'aurais souhaité de votre exemple de données est juste ID = 3. NO ID = 1 parce que même si dans la couleur de tapis = "jaune clair" en rideau couleur = "violet" pour id = 1.


Êtes-vous sûr que la requête est logiquement équivalente à SELECT ID de CutTrain où color = 'jaune clair' intersect Sélectionnez ID de la moquette où color = 'jaune clair'; ?


@Eleritas Oui, testez-le pour vous-même. La requête que vous venez de coller il n'y a pas de différence pour vous en utilisant Union tout à la place de l'intersect. Enfin, comprendre comment les jointures de travail vous laisseront faire un lot plus que en utilisant des intersects seuls.


Oui cela a fonctionné, il faut avoir mal tapé la première fois. Merci un tas! Les réponses précédentes répondaient donc à une question différente (je pose cette question de façon rhétorique, car j'avais eu trop de rangées)?


@Eceleritas, je pense qu'ils répondaient tous assez proches de ce que vous vouliez (et exactement ce que vous avez demandé dans la question, mais également en supposant que vous puissiez élargir leurs solutions plus loin). Ce que j'ai écrit ici, c'est presque un tutoriel personnalisé sur les jointures: p


@Eceleritas au fait, tandis que j'apprécie le gage de gratitude dans le marathon impie des upvotes, l'algorithme méchant va courir demain et les emmenera tout de suite - lisez ceci: meta.stackexchange.com/a/126857/190322


@Eceleritas Hey Mate, je voulais vous suggérer de jeter un coup d'œil à cela question et réponse que j'ai écrit aujourd'hui après avoir posté cette réponse hier :)