2010-03-20 3 views
0

Le tableau A contient les colonnes ID et AName, le tableau B contient les colonnes BName et ID. B.ID est la clé étrangère de A.ID.Une question à propos de l'instruction SQL complexe

Ecrire une instruction SQL pour afficher des données telles que: AName colonne impression et C qui décrivent si le tableau B a ID dans le tableau A, si elle existe 1 ou bien 0.

Donc, si A est:

1 aaa 
2 bbb 

B est:

something,2 

sortie est:

aaa,0 
bbb,1 
+5

On dirait que possible question de devoirs. –

+4

Complexe? C'est la base de données 101, dans la vraie vie, vous n'écrirez presque jamais une requête aussi simple. – HLGEM

Répondre

4

Quelque chose comme ce qui suit fonctionnera pour SQL Server

SELECT 
    A.AName, 
    CASE 
     WHEN B.ID IS NOT NULL THEN 1 
     ELSE 0 
    END AS C 
FROM 
    TableA A 
LEFT JOIN 
    TableB B 
ON 
A.ID = B.ID 

Voir la LEFT JOIN? Cela renverrait un ensemble de résultats incluant toutes les lignes du tableau A et inclurait des valeurs du tableau B où les champs dérivés de la table B sont utilisés dans la clause SELECT et sont satisfaits par le critère JOIN; dans votre exemple, la valeur pour B.ID sera 2 pour la ligne dans le tableau A avec ID 2. Conevrsely, B.ID valeur sera NULL pour la ligne dans le tableau A avec ID 1. Afin de transformer ces valeurs en 1 ou 0 Ensuite, nous utilisons une instruction CASE et vérifions si la valeur est nulle ou non et renvoyons la valeur appropriée en fonction de l'évaluation de cette expression.

See this answer for more information on JOIN clauses

+0

Dans certains SGBD, la deuxième valeur pourrait être écrite plus simplement comme 'ISNULL (B.ID) AS C'. –

+0

ISNULL retournera la valeur de B.ID (si elle existe) plutôt que 1, ce qui est ce que le problème demande. –

2
  1. Ce n'est pas une requête complexe.
  2. La réponse précise dépend du produit de base de données que vous utilisez, que vous n'indiquez pas.
  3. Vous devez rechercher le mot-clé OUTER JOIN dans votre manuel SQL, ainsi que la fonction CASE ou IIF SQL.
2

Vous pouvez utiliser une sous-requête au lieu d'un LEFT JOIN:

données de test (en utilisant MySQL):

CREATE TABLE a (id int, aname varchar(100)); 
CREATE TABLE b (bname varchar(100), id int); 

INSERT INTO a VALUES ('1', 'aaa'); 
INSERT INTO a VALUES ('2', 'bbb'); 
INSERT INTO b VALUES ('something', '2'); 

Requête:

SELECT 
    a.aname, 
    CASE EXISTS(SELECT b.id FROM b WHERE b.id = a.id) 
     WHEN 1 THEN '1' 
     ELSE '0' 
    END AS output 
FROM a; 

Sortie:

+-------+--------+ 
| aname | output | 
+-------+--------+ 
| aaa | 0  | 
| bbb | 1  | 
+-------+--------+