2011-05-01 1 views
4

J'ai une requête SQL qui fonctionne bien, sauf que je voudrais apporter les résultats d'une autre colonne dans la première DB avec elle. Voilà ce que j'ai actuellement:requête SQL UNION avec champ supplémentaire dans les résultats

SELECT parts1.PART_NBR, parts1.NIIN 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

C'est ce que je veux essentiellement (bien sûr cela ne marchera pas):

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

Comment puis-je écrire la requête afin qu'il fait la même chose mais en fait ramène le champ supplémentaire dans les résultats?

Répondre

5

Créer un champ vide, retour NULL

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION ALL 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

EDIT: De votre commentaire, vous voyez les résultats que

Part Number: 21223 NIIN: 008194914 Name: CAPACITOR 
Part Number: 21223 NIIN: 011241926 Name: HEAT SINK 
Part Number: 21223 NIIN: 003901600 Name: KNIFE 
Part Number: 21223 NIIN: 003901600 Name: 
Part Number: 21223 NIIN: 008194914 Name: 
Part Number: 21223 NIIN: 011241926 Name: 

Les premiers résultats viennent de la table parts1 la deuxième de parts2, les champs vides Name sont où vous retournez NULL. De l'information que vous avez donnée je ne vois pas pourquoi vous employez un UNION pour obtenir les résultats de ces deux tables car elles semblent contenir les mêmes informations excepté la première table a également le champ Name.

Ne serait-il pas préférable de JOIN les tables sur le numéro de pièce/référence afin de sélectionner le nom?

EDIT: Comme vous l'avez dit dans votre commentaire, vous avez déjà été trouvé un jeu de résultats DISTINCT en raison de l'utilisation UNION. Avec le champ NULL, les lignes ne sont plus uniques et la requête renvoie toutes les lignes.

J'ai dit dans un commentaire que je ne vois pas ce que l'instruction UNION en cours fait pour vous car il semble que la même information soit les deux tables. Y at-il plus à cette requête que ce que vous nous avez dit?

+0

Quand je fais ce que je reçois les mêmes résultats à deux reprises que le premier jeu a le champ supplémentaire et ne marche pas ensemble seconed. – Erik

+0

Intéressant, quelle base de données utilisez-vous (SQL Server, MySQL, etc)? – Tony

+0

Référence: 21223 NOI: 008194914 Nom: CONDENSATEUR Référence: 21223 NOI: 011241926 Nom: RADIATEUR Référence: 21223 NOI: 003901600 Nom: COUTEAU Référence: 21223 NOI: 003901600 Nom: Référence: 21223 NIIN : 008194914 Nom: Numéro de pièce: 21223 NIIN: 011241926 Nom: – Erik

0

Simple comme ci-dessous:

select part_number, niin, max(field) 
from (  
    SELECT parts1.PART_NBR part_number, parts1.NIIN niin, parts1.ANOTHER_FIELD field 
    FROM parts1 
    WHERE parts1.PART_NBR='$pn' 
    UNION 
    SELECT parts2.REFERENCE_NUMBER part_number, parts2.NIIN niin, "" field 
    FROM parts2 
    WHERE parts2.REFERENCE_NUMBER='$pn') 
group by part_number, niin 

Vous avez juste besoin d'accueillir un espace réservé dans la deuxième requête pour correspondre à l'emplacement supplémentaire sur le terrain de la première.

+0

Cela ne fait que ramener les résultats à deux reprises. La deuxième fois, ils n'ont pas ce champ. Comme: Référence: 21223 NOI: 008194914 Nom: CONDENSATEUR Référence: 21223 NOI: 011241926 Nom: RADIATEUR Référence: 21223 NOI: 003901600 Nom: COUTEAU Référence: 21223 NOI: 003901600 Nom: Référence : 21223 NIIN: 008194914 Nom: Numéro de pièce: 21223 NIIN: 011241926 Nom: – Erik

+0

Pouvez-vous donner un exemple de ce que votre sortie attendrait? – cmutt78

+0

Numéro de pièce: 21223 NIIN: 008194914 Nom: CAPACITOR Numéro de pièce: 21223 NIIN: 011241926 Nom: HEAT SINK Numéro de pièce: 21223 NIIN: 003901600 Nom: COUTEAU – Erik

0

Vous devez avoir des colonnes correspondantes, mais vous pouvez placer une "fausse" colonne dans la seconde qui revient null ou quelle que soit la valeur par défaut que vous voulez.

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 
2
SELECT parts.PART_NBR, parts.NIIN, parts1.ANOTHER_FIELD 
FROM (
     SELECT parts1.PART_NBR, parts1.NIIN 
     FROM parts1 
     WHERE parts1.PART_NBR = '$pn' 
     UNION 
     SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
     FROM parts2 
     WHERE parts2.REFERENCE_NUMBER = '$pn' 
    ) AS parts(PART_NBR, NIIN) 
    LEFT OUTER JOIN parts1 
    ON parts.PART_NBR = parts1.PART_NBR AND 
     parts.NIIN = parts1.NIIN  
Questions connexes