2008-11-25 8 views
1

J'ai une fonction qui exporte une table au format CSV et dans la requête que j'ai défini quels champs exporteront.Besoin d'aide joindre la table

Voici la requête:

SELECT lname, fname, email, address1, address2, city, 
state, zip, venue_id, dtelephone, etelephone, tshirt FROM volunteers_2009 

Le venue_id champ est l'identifiant du lieu qui est appelé dans une autre table (lieux)

Alors volunteers_2009.venue_id = venues.id

Lorsque j'ouvre le fichier CSV, il affiche l'ID de lieu que je comprends, mais j'ai besoin d'aide pour modifier la requête afin de mettre le nom du lieu (lieux.venue_name) dans le fichier CSV.

Toute aide est appréciée.

Répondre

1
SELECT a.lname, a.fname,a. email, a.address1,a. address2, a.city, 
    a.state, a.zip, a.venue_id, a.dtelephone, a.etelephone, a.tshirt, 
    COALESCE(b.venue_name,'') AS VenueName 
FROM volunteers_2009 a 
LEFT JOIN venues b ON b.id=a.venue_id 
+0

@Joel, cela a des implications sur les performances puisque vous effectuez une recherche de table et un appel de fonction pour chaque enregistrement. L'approche à deux passes (union all) effectue uniquement une recherche de table pour les ID de lieu non NULL et pas même pour les ID NULL (et aucun appel de fonction). – paxdiablo

+0

Bien que la performance n'aura probablement pas autant d'importance puisque vous utilisez MySQL de toute façon :-). – paxdiablo

+0

En fait, je vais clarifier cette dernière déclaration - je ne voulais pas dire que MySQL était une DB de jeu (comparée à DB2/z, mais c'est un autre problème), juste qu'elle est utilisée principalement dans les endroits où vous ne payez pas pour l'utilisation de l'UC (contrairement à l'unité centrale DB2). – paxdiablo

0

requête SQL standard pour cela (en supposant que vous voulez à la fois ID et le nom du lieu):

SELECT a.lname as lname, a.fname as fname, a.email as email, 
    a.address1 as address1, a.address2 as address2, a.city as city, 
    a.state as state, a.zip as zip, a.venue_id as venue_id, 
    b.venue_name as venue_name, a.dtelephone as dtelephone, 
    a.etelephone as etelephone, a.tshirt as tshirt 
FROM volunteers_2009 a, venues b 
WHERE a.venue_id = b.id 
AND a.venue_id IS NOT NULL 
UNION ALL 
SELECT a.lname as lname, a.fname as fname, a.email as email, 
    a.address1 as address1, a.address2 as address2, a.city as city, 
    a.state as state, a.zip as zip, a.venue_id as venue_id, 
    '' as venue_name, a.dtelephone as dtelephone, 
    a.etelephone as etelephone, a.tshirt as tshirt 
FROM volunteers_2009 a 
WHERE a.venue_id IS NULL 
+0

Fonctionne bien, sauf qu'il n'exporte pas les enregistrements qui n'ont pas de lieu-lieu dans ce champ. – Brad

+0

Voulez-vous dire qu'ils pourraient être NULL dans volunteers_2009; ou dites-vous qu'ils peuvent être mis à une valeur qui n'existe pas dans les lieux? – paxdiablo

+0

Évitez la syntaxe FROM A, B. Utilisez FROM A INNER JOIN B à la place. –

0

SELECT lname, fname, email, address1, adresse2, ville, état , zip, b .venue_name, téléphone, etéléphone, tshirt FROM volunteers_2009 a, lieux ba.venue_id = b. lieu

utiliser l'alias approprié dans le cas où les deux tables ont des colonnes ayant le même nom.

--- EDIT pour avoir toutes les lignes de jointure externe utiliser les sites comme

SELECT lname, fname, email, address1, adresse2, ville, état , zip, b.venue_name, dtelephone , etelephone, tshirt FROM volunteers_2009 a (+), lieux ba.venue_id = b. lieu