Domanda

Sto selezionando 1 campo da 1 tabella e lo sto memorizzando in una tabella temporanea.

A volte quella tabella finisce con 0 righe.

Voglio aggiungere quel campo su un'altra tabella che ha più di 20 campi

L'unione regolare non funzionerà per me a causa della mancata corrispondenza del campo #. L'esterno non funzionerà per me perché non c'è nulla da confrontare. NVL non funziona sulla prima tabella temporanea.

Qualcuno sa come farlo?

AGGIORNAMENTO:

Non ho menzionato .... Quando la tabella che recupera 1 campo trova una corrispondenza in altri casi, questo codice che sto usando ora funziona ....

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;
È stato utile?

Soluzione

Con quale campo corrisponderebbe? A proposito, ecco come allinearli:

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

UPDATE:

OK, dopo aver letto il tuo aggiornamento ... Non penso che tu voglia un UNION, ma piuttosto e incredibilmente semplice SUBSELECT

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

Altri suggerimenti

Sembra che tu voglia unirsi, non un sindacato.

Non è necessario confrontare nulla per unirsi. Si finisce con un prodotto incrociato se non si specifica alcuna condizione di join:

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

Quando ci sono zero righe nella tabella temporanea, verrà riportato come NULL nel risultato della query precedente.

Tuttavia, se ci sono più righe nella tabella temporanea, otterrai il prodotto incrociato con la prima tabella. Non posso dire dalla tua domanda cosa vuoi.

modifica: La condizione di join espressa nella clausola ON o USING dovrebbe essere facoltativa secondo lo standard SQL, ma almeno come I testalo in MySQL 5.0, è un errore di sintassi omettere quella clausola. Ma puoi usare ON (1 = 1) .

modifica: Rispondi alla tua domanda nel commento:

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;

In realtà, potresti essere in grado di saltare del tutto la tabella temporanea. Basta SINISTRA UNISCITI alla tabella principale per reahead_rec . Inserisci tali condizioni nella clausola ON del join, non nella clausola WHERE . Quindi utilizzare COALESCE () nell'elenco di selezione di quella query per dare un nome predefinito quando uno non viene trovato nell'altra tabella.

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;

Prova a selezionare nvl (NULL, NULL) per i valori mancanti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top