Comment utiliser NOT dans une requête SQL relationnelle

lorsque je sélectionne une table comme ceci: select count(*) from products renvoie 12900 résultat.

J'ai une requête relationnelle qui renvoie plusieurs relations de table comme ceci:

 SELECT category.name, manifacturer.name, supplier.name, product.name FROM products as product, suppliers as supplier, manifacturers as manifacturer, categories as category WHERE product.sid=supplier.id AND product.manid = manifacturer.id AND product.catid = category.id 

Cette requête renvoie 12873 résultat,

Je ne peux donc pas find queldatatables ne correspondent pas. Comment puis-je find ces données perdues? Je n'ai pas utilisé de requête mais je n'ai renvoyé aucun résultat.

Vous pouvez voir que les loggings ne correspondent pas avec FULL OUTER JOIN comme ceci:

 SELECT prod.id, rel.id FROM ( SELECT category.name, manifacturer.name, supplier.name, product.name FROM products as product, suppliers as supplier, manifacturers as manifacturer, categories as category WHERE product.sid=supplier.id AND product.manid = manifacturer.id AND product.catid = category.id ) as rel FULL OUTER JOIN products as prod ON rel.id = prod.id 

Vous pouvez donc voir les identifiants null et non null dans la list.

Tout d'abord, vous devez apprendre à utiliser une syntaxe de join correcte et explicite:

 SELECT category.name, manifacturer.name, supplier.name, product.name FROM products as product join suppliers as supplier on product.sid = supplier.id join manifacturers as manifacturer on product.manid = manifacturer.id join categories as category on product.catid = category.id; 

Ensuite, si vous voulez des non-correspondances, passez à la left join et searchz les non-correspondances dans la clause where :

 SELECT category.name, manifacturer.name, supplier.name, product.name FROM products as product left join suppliers as supplier on product.sid = supplier.id left join manifacturers as manifacturer on product.manid = manifacturer.id left join categories as category on product.catid = category.id WHERE supplier.id IS NULL OR manifacturer.id IS NULL or category.id IS NULL; 

En plus de mes commentaires sur l'alias ci-dessus, vous devriez utiliser la syntaxe de jointure "plus récente" introduite dans ANSI-92. Remarquez combien less de code il y a ici pour la même chose. La façon dont vous avez écrit votre code toutes vos jointures étaient des jointures internes, puisque vous voulez renvoyer des lignes sans correspondance, je les ai remplacées par des jointures à gauche.

 SELECT c.name, m.name, s.name, p.name FROM products p left join suppliers s on p.sid = s.id left join manifacturers m on p.manid = m.id left join categories c on p.catid = c.id 

Ci-dessous la requête renvoie les loggings dont les produits ne sont pas présents dans votre requête:

 SELECT * FROM Products P WHERE (P.sid,P.mainid,P.catid) NOT IN ( SELECT DISTINCT product.sid ,product.mainid ,product.catid FROM products AS product ,suppliers AS supplier ,manifacturers AS manifacturer ,categories AS category WHERE product.sid = supplier.id AND product.manid = manifacturer.id AND product.catid = category.id )