Simples evade código SQL mim .. sindicalizar duas mesas incompatíveis
-
19-08-2019 - |
Pergunta
Eu estou selecionando um campo de 1 mesa e armazená-lo em uma tabela temporária.
Às vezes que a tabela acaba com 0 linhas.
Eu quero adicionar esse campo para outra tabela que tem mais de 20 campos
união regular não vai funcionar para mim por causa do campo # incompatibilidade. não vai funcionar exterior para mim, porque não há nada para comparar. NVL não funciona na mesa da primeira temporário.
Alguém sabe como fazê-lo?
ATUALIZADO:
Eu não mencionou .... Quando a tabela que recupera um campo encontra uma correspondência em outros casos, este código que estou usando agora trabalha ....
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;
Solução
O campo seria combinar com? BTW, aqui está como alinhá-los:
SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable
UPDATE:
OK, depois de ler o seu update ... Eu não acho que você quer um UNION em tudo, mas sim, e incrivelmente simples SUBSELECT
SELECT
*,
(SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
MyTable
Outras dicas
Parece que você quer uma associação, não uma união.
Você não precisa comparar nada a ver uma junção. Você acabar com um produto cruzado, se você não especificar condição de junção:
SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);
Quando há zero linhas na tabela temp, que vai ser relatado como NULL no resultado da consulta acima.
No entanto, se houver várias linhas na tabela temp, você vai ter o produto cruzado com a primeira tabela. Eu não posso dizer de sua pergunta que você quer.
Editar: A condição de junção expressa na cláusula ON
ou USING
deve ser de acordo com opcional para o padrão SQL, mas pelo menos como eu testá-lo no MySQL 5.0, é um erro de sintaxe para omitir essa cláusula . Mas você pode usar ON (1=1)
.
Editar: Respondendo a sua pergunta no comentário:
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;
Na verdade, você pode ser capaz de ignorar a tabela temporária completamente. Apenas LEFT JOIN sua mesa principal para reahead_rec
. Coloque essas condições na cláusula ON
da junção, e não na cláusula WHERE
. Em seguida, use COALESCE()
na lista de seleção que consulta para dar um nome padrão quando não é encontrado em outra tabela.
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;
Tente selecionar nvl(NULL,NULL)
para valores perdidos