Código simple de SQL me evade
-
19-08-2019 - |
Pregunta
Estoy seleccionando 1 campo de 1 tabla y lo guardo en una tabla temporal.
Algunas veces esa tabla termina con 0 filas.
Quiero agregar ese campo en otra tabla que tenga más de 20 campos
La unión regular no funcionará para mí debido a que el campo # no coincide. Exterior no funcionará para mí porque no hay nada para comparar. NVL no funciona en la primera tabla temporal.
¿Alguien sabe cómo hacerlo?
UPDATED:
No pude mencionar ... Cuando la tabla que recupera 1 campo encuentra una coincidencia en otros casos, este código que estoy usando ahora funciona ...
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;
Solución
¿Con qué campo coincidiría? Por cierto, aquí está cómo alinearlos:
SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable
ACTUALIZACIÓN:
OK, después de leer tu actualización ... no creo que quieras una UNION, sino un SUBSELECTO increíblemente simple
SELECT
*,
(SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
MyTable
Otros consejos
Parece que quieres unirte, no una unión.
No necesitas comparar nada para hacer una unión. Termina con un producto cruzado si no especifica ninguna condición de unión:
SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);
Cuando hay cero filas en la tabla temporal, se informará como NULL en el resultado de la consulta anterior.
Sin embargo, si hay varias filas en la tabla temporal, obtendrá el producto cruzado con la primera tabla. No puedo decir de tu pregunta lo que quieres.
editar: La condición de unión expresada en la cláusula ON
o USING
debe ser opcional de acuerdo con el estándar SQL, pero al menos como I pruébelo en MySQL 5.0, es un error de sintaxis omitir esa cláusula. Pero puede usar ON (1 = 1)
.
editar: Respondiendo su pregunta en el comentario:
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 realidad, puede omitir la tabla temporal por completo. Simplemente IZQUIERDA UNIRSE a su tabla principal para reahead_rec
. Ponga esas condiciones en la cláusula ON
de la unión, no en la cláusula WHERE
. Luego use COALESCE ()
en la lista de selección de esa consulta para dar un nombre predeterminado cuando no se encuentre uno en la otra tabla.
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;
Intente seleccionar nvl (NULL, NULL)
para los valores faltantes