2013-11-30 3 views
0

SQL> Объединение двух операторов выбора

SELECT v.NAME, 
    CASE 
    WHEN va.state_territory_province = 'Illinois' 
     THEN 'Illinois' 
    END Vendors 
FROM grocery.vendor v 
INNER JOIN grocery.vendor_address va ON va.vendor_id = v.vendor_id 
WHERE va.state_territory_province = 'Illinois'; 

SELECT vendor_id, 
    CASE 
    WHEN count(DISTINCT product_id) > 2 
     THEN 'High' 
    END 
FROM grocery.can_supply 
HAVING count(DISTINCT product_id) > 2 
GROUP BY vendor_id 
ORDER BY vendor_id; 

вопрос я должен попытаться и ответ: Каковы полные имена всех поставщиков, которые могут поставлять более одного предмета или базироваться в штате Иллинойс?

Я знаю, как писать их отдельно, но мне нужно написать их вместе, и это меня озадачивает.

EDITED

Я пытался UNION, и он дал мне эту ошибку:

* ERROR at line 1: ORA-00923: FROM keyword not found where expected

SQL> SELECT vc.contact_name, 
     CASE 
     WHEN va.state_territory_province = 'Illinois' 
      THEN 'Availible' 
     END CheckAvail 
    FROM grocery.vendor_address va 
    INNER JOIN grocery.vendor_contact vc ON vc.vendor_id = va.vendor_id 
    WHERE va.state_territory_province = 'Illinois' union select vc.contact_name 
     CASE 
      WHEN count(distinct cs.product_id) > 1 
       THEN 'Avail' 
     END CheckAvail from grocery.vendor cs; 

ответ

0

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

select c1, c2 from ... where ... 
union 
select c1, c2 from ... where ... 
0

я бы, вероятно, использовать sub-select как этот

SELECT v.NAME, 
CASE 
WHEN va.state_territory_province = 'Illinois' 
    THEN 'Illinois' 
END Vendors 
FROM grocery.vendor v 
INNER JOIN grocery.vendor_address va ON va.vendor_id = v.vendor_id 
WHERE va.state_territory_province = 'Illinois' AND v.vendor_id IN (
    SELECT vendor_id FROM grocery.can_supply 
    HAVING count(DISTINCT product_id) > 2 
    GROUP BY vendor_id 
    ORDER BY vendor_id); 
0

Там есть несколько вариантов здесь. Вы можете делать левые соединения (см. Ниже) существующие утверждения, союзы. Предварительно выбирается стиль CTP.

SELECT v.NAME 
     , ISNULL(va.state_territory_province, '') Vendors 
     , ISNULL(inv.Desc, '') AS Desc 
FROM grocery.vendor v 
LEFT JOIN grocery.vendor_address va ON va.vendor_id = v.vendor_id AND va.state_territory_province = 'Illinois' 
LEFT JOIN (SELECT vendor_id, 
      CASE WHEN count(DISTINCT product_id) > 2 THEN 'High' END AS desc 
      FROM grocery.can_supply 
      HAVING count(DISTINCT product_id) > 2 
      GROUP BY vendor_id) inv ON inv.Vendor_Id = v.Vendor_Id 
WHERE 1=1 
    AND (va.Vendor_Id NOT IS NULL OR inv.Vendor_ID NOT IS NULL) 
Смежные вопросы