Le code SQL simple m'évite .. Syndiquer deux tables incompatibles
-
19-08-2019 - |
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;
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