1

2つのテーブルに2種類のエンティティがあり、共通の列の1つで結合して並べ替える共通の列がいくつかあります。結果のテーブルでは、各行は1つのテーブルの行または別のテーブルの行のいずれかを表す必要があります。たとえば、次のようなテーブルの場合:

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'

それらに参加するためのクエリの私のアイデアは次のようになります:

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'

このクエリにはいくつか問題があります。

  1. 私がどのようにCROSS JOIN機能するかを理解している場合、クエリは非常に遅くなります。可能な限りすべてのアップルとオレンジの組み合わせを通過するからです。より速い方法はありますか?

  2. 関数はIF(...)見苦しいです。それらは本当に必要ですか?

4

1 に答える 1

1

これがあなたの問題の解決策であるかどうかはわかりません。ただし、ユニオンを使用して同様の出力を作成できます。比較的ユニオンはクロスが参加するよりも速くなります。

于 2012-07-27T11:27:12.443 に答える