Domanda

Ho due diversi tipi di entità in due tabelle con solo poche colonne comuni che voglio aderire e ordinare per una delle colonne comuni.Nella tabella risultante ogni riga dovrebbe rappresentare una riga da una tabella o una riga da un'altra.Ad esempio, per i tavoli come questo:

CREATE TABLE apple (
    apple_id INT NOT NULL AUTO_INCREMENT,
    acquired DATETIME NOT NULL,
    is_fresh TINYINT,
    PRIMARY KEY (apple_id)
);

'1', '2012-07-27 19:06:58', '1'
'2', '2012-07-28 18:05:43', '0'

CREATE TABLE orange (
    orange_id INT NOT NULL AUTO_INCREMENT,
    acquired DATETIME NOT NULL,
    is_yummy TINYINT,
    PRIMARY KEY (orange_id)
);

'1', '2012-06-12 10:03:31', '0'
'2', '2012-08-30 22:00:02', '1'
.

La mia idea di query per unire loro sarebbe così:

SELECT
    IF(orange_id IS NULL, 'apple', 'orange') AS type,
    IF(orange_id IS NULL, apple.acquired, orange.acquired) AS acquired,
    is_fresh,
    is_yummy
FROM apple CROSS JOIN orange ON apple_id IS NULL OR orange_id IS NULL
ORDER BY acquired ASC

'orange', '2012-06-12 10:03:31', NULL, '0'
'apple', '2012-07-27 19:06:58', '1', NULL
'apple', '2012-07-28 18:05:43', '0', NULL
'orange', '2012-08-30 22:00:02', NULL, '1'
.

Vedo alcuni problemi con questa query:

    .
  1. Se capisco come funziona CROSS JOIN, la query sarà molto lenta, in quanto andrà attraverso ogni possibile combinazione di Apple-Orange, non lo farà?C'è un modo più veloce?

  2. Le funzioni IF(...) sembrano brutte.Sono realmente necessari?

È stato utile?

Soluzione

Non sono sicuro se questa è una soluzione per il tuo problema.Ma puoi fare una produzione simile usando un'unione.Comparativamente unione sarà più veloce che croce si unisce.

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