2011-09-27 7 views
2

J'essaie d'obtenir la différence entre les instructions 2 select.Obtenez la différence entre deux instructions SELECT

Voici la première select:

SELECT 1

SELECT * 
FROM h_log_material 
LEFT JOIN h_log_stkpnl 
ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05' 
and h_log_material.mtrl_type='BL' 

sortie est 4917

SELECT 2

Voici deuxième select:

SELECT * 
FROM h_log_material 
LEFT JOIN h_log_stkpnl 
ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05' 
and h_log_material.mtrl_type='BL' 
and h_log_stkpnl.op_id like '%STOCK-IN%' 

sortie est 4870

Je voudrais obtenir la différence SELECT 1 - SELECT 2

Comme sortie j'ai besoin des lignes qui ne sont pas sélectionnez 2.

J'ai essayé ceci mais il renvoie 0.

SELECT * 
FROM h_log_material 
LEFT JOIN h_log_stkpnl 
ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05' 
and h_log_material.mtrl_type='BL' 
and not exists 
(SELECT * 
FROM h_log_material 
LEFT JOIN h_log_stkpnl 
ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05' 
and h_log_material.mtrl_type='BL' 
and h_log_stkpnl.op_id like '%STOCK-IN%') 

Répondre

3

Le 2ème SELECT ressemble à un sous-ensemble de la première, vous pouvez donc faire

SELECT COUNT(*) - COUNT(CASE 
          WHEN h_log_stkpnl.op_id LIKE '%STOCK-IN%' THEN 1 
         END) 
FROM h_log_material 
     LEFT JOIN h_log_stkpnl 
     ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
WHERE h_log_material.WO_ID = 'E11TMB7M05' 
     AND h_log_material.mtrl_type = 'BL' 

Modifier

Après cet éclaircissement que vous avez besoin des colonnes non COUNT essayez celui-ci sur

SELECT * 
FROM h_log_material 
     LEFT JOIN h_log_stkpnl 
     ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
      AND h_log_stkpnl.op_id LIKE '%STOCK-IN%' 
WHERE h_log_material.WO_ID = 'E11TMB7M05' 
     AND h_log_material.mtrl_type = 'BL' 
     AND h_log_material.MODULE_UNIQUE_ID IS NULL 

Votre première requête fait un LEFT JOIN mais la clause WHERE sur le second le convertit npour une jointure interne efficace. Donc, la différence entre les requêtes devrait être les lignes où il n'y a pas de correspondance h_log_stkpnl ou la correspondance n'est pas LIKE '%STOCK-IN%' (Je pense!)

+0

Ce travail, en tant que sortie j'ai besoin des lignes qui ne sont pas sélectionnez 2. –

+0

@John - Pourquoi tous vos exemples de requêtes en utilisant 'SELECT COUNT (*)' alors? Dans tous les cas 'et n'existe pas (SELECT count (*) ...' ne fonctionnera pas car 'COUNT (*)' retournera toujours quelque chose Même si 0. Que faire si vous essayez 'et n'existe pas (SELECT * ... ' –

+0

Désolé j'ai oublié enlevé * de SQL.J'ai testé quelque chose –

0

Vous ne spécifiez pas votre plate-forme, mais si vous utilisez SQL 2008 peut utiliser EXCEPT et INTERSECT pour comparer les résultats de deux requêtes.

+0

Sory j'ai oublié, c'est MySQL 5 –

1

Avez-vous essayé

and h_log_stkpnl.op_id not like '%STOCK-IN%' 

moins qu'il y ait des valeurs nulles (et celles-ci peuvent être compensées) qui devraient être la différence.

+0

Ce que j'essaie d'abord ...pas utile –

+0

@John - Ah, je vois que votre deuxième requête est essentiellement une jointure interne, donc la différence sera un peu plus importante. –

0

l'essayer

SELECT h_log_material.field1,h_log_material.field2 
    FROM h_log_material 
    LEFT JOIN h_log_stkpnl 
    ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
    where 
    h_log_material.WO_ID='E11TMB7M05' 
    and h_log_material.mtrl_type='BL' 

    minus 

    SELECT h_log_material.field1,h_log_material.field2 
    FROM h_log_material 
    LEFT JOIN h_log_stkpnl 
    ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
    where 
    h_log_material.WO_ID='E11TMB7M05' 
    and h_log_material.mtrl_type='BL' 
    and h_log_stkpnl.op_id like '%STOCK-IN%' 
+0

Ça ne marche pas. Erreur de base de données MySQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'SELECT count (*) DE –

+0

Lisez attentivement la requête si le problème continue à envelopper la deuxième requête "()" – Nightw0rk

+0

@ Nightw0rk - 'MySQL 'ne supporte certainement pas' minus' (ou 'except') –

Questions connexes