2011-12-10 11 views
10

ho migrato il database aziendale Oracle a MySQL (yeah non chiedetemi perché) e poche query (per la segnalazione) sono enormi e lavora a mysqlOracle a MySQL sinistra si unisce

uno di loro è 4021 linee con 89 INNER JOIN

questo genera un rapporto di dettaglio completo per il cliente dell'azienda per finanziario per l'ultimo anno.

ho bisogno di quel rapporto (dato che arriveremo presto alla fine dell'anno) lavorando per il 2011 e ho visto su molti siti Web che il massimo left join per mysql è di 60 qualcosa rimasto.

sono fregato con questo rapporto? o c'è un modo per eseguirlo?

+0

Se sono necessari nuovi join perché il report copre un nuovo anno, il modello dati è probabilmente errato. –

+1

Perché nessuna maiuscola? –

risposta

0

Si dovrà saltare (o verso il basso, a seconda del vostro vista) per un linguaggio di programmazione per aggirare questo (Ruby, PHP, Python, ecc) sarebbero tutti fare la manipolazione che molti unisce più facile da solo utilizzando oggetti nativi invece di affidarsi esclusivamente a un enorme join.

E lei ha ragione, il numero massimo di join in MySQL è 61 (http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html)

+1

Il collegamento specificato indica che il numero massimo di tabelle a cui è possibile fare riferimento in qualsiasi istruzione 'JOIN' è 61, non che il numero massimo di' JOIN's in una query è 61. –

0

Se questo è il caso, si potrebbe desiderare di cercare di rompere la query un po 'e un po' di "sinistra join" contenuto pre-interrogato insieme ad altri elementi dove pratico. Ad esempio, puoi pre-interrogare cose come (e solo indovinare)

Elementi di inventario con categorie con codice conto Co.Ge. (colonne id), ecc. Come una pre-query.

Unisciti a tutti i dettagli dell'ordine per ordinare il riepilogo dell'intestazione per ottenere l'ID cliente e unirsi ai clienti come un'altra pre-query. Garantire qualsiasi elemento chiave per aderire al requisito generale del report.

Continuare verso il basso nell'elenco dove possibile e probabilmente si può uccidere un gruppo in quanto sarebbero risultati di sottotitoli in cui nessun livello avrebbe 61 join in corso.

0

tipo di uso enumerazioni, che vi salverà dalla dolorosa sinistra si unisce

se si dispone di pochi tavoli è possibile rimuovere da solo utilizzando enum che è un grande miglioramento.

specialmente con il tipo di dati che si hanno

5

Credo che la query rapporto sarà comunque tradurrà in using temporary a spiegare. È possibile suddividere la singola query in più in una transazione e rendere esplicitamente le tabelle temporanee.

Questo può essere ancora più utile se la query Oracle contiene qualcosa come sottoquery denominate (intendo sottoquery WITH da T-SQL, non so se esistono in Oracle, ma sicuramente non esistono in MySQL).

+0

+1 per le tabelle temporanee. Ci sono stato, fatto. – Mchl

+0

Le CTE esistono nei normali database ma mysql :))). Lo spazio allocato per le tabelle temporanee ha anche un numero finito anche in mysql dovresti pensarci anche tu :)) –

Problemi correlati