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;
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top