Question

Je sélectionne 1 champ dans 1 table et le stocke dans une table temporaire.

Parfois, cette table se termine par 0 rangée.

Je souhaite ajouter ce champ à une autre table comportant plus de 20 champs

Un syndicat régulier ne fonctionnera pas pour moi en raison de la non-concordance du champ. L'extérieur ne fonctionnera pas pour moi car il n'y a rien à comparer. NVL ne fonctionne pas sur la première table temporaire.

Quelqu'un sait comment faire?

MISE À JOUR:

J'ai omis de mentionner .... Lorsque la table qui récupère 1 champ trouve une correspondance dans d'autres cas, le code que j'utilise maintenant fonctionne ....

SELECT DISTINCT reqhead_rec.resp_name<br>
FROM reqhead_rec, biglist<br>
WHERE reqhead_rec.req_no = biglist.req_no
 AND reqhead_rec.frm = biglist.req_frm<br>
INTO TEMP grabname with no log;

SELECT biglist.*, grabname.resp_name<br>
FROM biglist, grabname<br>
ORDER BY prnt_item, account_amt<br>
INTO TEMP xxx with no log;
Était-ce utile?

La solution

Avec quel champ correspondrait-il? BTW, voici comment les aligner:

SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable

MISE À JOUR:

OK, après avoir lu votre mise à jour ... Je ne pense pas que vous souhaitiez une union, mais plutôt, et incroyablement simple SUBSELECT

SELECT
    *,
    (SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
    MyTable

Autres conseils

On dirait que vous voulez une jointure, pas une union.

Vous n'avez rien à comparer pour faire une jointure. Vous vous retrouvez avec un produit croisé si vous ne spécifiez aucune condition de jointure:

SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
  LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);

Lorsqu'il n'y a aucune ligne dans la table temporaire, le résultat de la requête ci-dessus est NULL.

Cependant, s'il y a plusieurs lignes dans la table temporaire, vous obtiendrez le produit croisé avec la première table. Je ne peux pas dire d'après votre question ce que vous voulez.

modifier: La condition de jointure exprimée dans la clause ON ou USING doit être facultative selon le standard SQL, mais au moins comme I testez-le dans MySQL 5.0, c'est une erreur de syntaxe d'omettre cette clause. Mais vous pouvez utiliser ON (1 = 1) .

modifier: en répondant à votre question dans le commentaire:

SELECT COALESCE(reqhead_rec.resp_name, dflt.resp_name) AS resp_name
FROM (SELECT 'default name' AS resp_name) dflt
  LEFT OUTER JOIN reqhead_rec ON (1=1)
WHERE reqhead_rec.req_no = biglist.req_no AND reqhead_rec.frm = biglist.req_frm 
INTO TEMP grabname WITH NO LOG;

En fait, vous pourrez peut-être ignorer le tableau temporaire. Il suffit de gauche joindre votre table principale à reahead_rec . Placez ces conditions dans la clause ON de la jointure et non dans la clause WHERE . Ensuite, utilisez COALESCE () dans la liste de sélection de cette requête pour donner un nom par défaut lorsqu'il n'en trouve pas un dans l'autre table.

SELECT b.*, COALESCE(r.resp_name, 'default name') AS resp_name
FROM biglist AS b
  LEFT OUTER JOIN reqhead_rec AS r
    ON (b.req_no = r.req_no AND r.frm = b.req_frm)
INTO TEMP xxx WITH NO LOG;

Essayez de sélectionner nvl (NULL, NULL) pour les valeurs manquantes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top