2014-10-08 3 views
0

У меня есть два запроса в одной таблице, и мне нужно получить результаты, которые не отображаются в первом наборе результатов.Заменяет ли UNION предыдущие результаты? `

Есть несколько способов, чтобы получить там (я не прошу одного), моя первая попытка была такова:

SELECT * FROM 
(
    SELECT 
     o.custom_order_id AS 'order', 
     'yes'  AS 'test' 
    FROM orders 
    WHERE <first criteria> 

    UNION 

    SELECT 
     o.custom_order_id AS 'order', 
     'no'  AS 'test' 
    FROM orders 
    WHERE <second criteria> 
) x 
WHERE x.test = 'no' 

UNION не добавляет строки, которые уже появились в первом результирующем.

На самом деле я получаю строки как

12345 no 

но 12345 появляется в первом результирующем (запрос перед тем UNION).

Зачем?

Edit:

custom_order_id не имеет индекса и не является первичным ключом (хотя на самом деле является уникальным) - это UNION нужен (уникальный) индекс или рк признать ряд как уже в первой -resultset?

+2

'UNION' вернет уникальные ** строки **. '12345 yes' и' 12345 no' ** две уникальные строки **. В вашем примере, если вы удалите поле 'test', вы получите то, что хотите. –

+1

@AdrianoRepetti Это точно моя ошибка. – DanFromGermany

+0

Может кто-нибудь сказать мне, что случилось с моим ответом? Downvote сбило с ума дерьмо :) – Kleskowy

ответ

1

UNION использует весь набор, чтобы определить, уникальна ли строка. В вашем случае это (заказ, тест).

Поскольку у половины ваших ответов установлен тест «да» и один «нет», вы можете получить несколько заказов с одним и тем же идентификатором (один для «да», один для «нет»).

+0

Я был настолько сосредоточен на идентификаторе заказа, что полностью не смог увидеть свой тестовый флаг lawl :-) Спасибо и Адриано. – DanFromGermany

0

Вы можете получить только строки с «нет», потому что это то, что вы указали в пункте WHERE в конце:

WHERE x.test = 'no' 

Исключите что и UNION возвратит уникальные строки из unioned запросов.

UNION не нужны ключи, хотя оптимизационный запрос почти всегда является хорошей идеей :) Попробуйте запустить EXPLAIN (above query with UNION goes here) и посмотреть, что производится.

+1

Не меня ниспровергаю (я вообще не отвечаю на ответы на свои вопросы), но я думаю, что это потому, что здесь нет проблемы здесь :-) – DanFromGermany

+0

Так что я просто ошибся в вопросе. Спасибо. – Kleskowy

Смежные вопросы