2015-07-25 2 views
0

shipping_customer стол:Избегайте дополнительного подзадача в этом запросе UNION?

+----+---------------+---------------------+ 
| id | business_name | billing_customer_id | 
+----+---------------+---------------------+ 
| 1 | Soylent Corp |     3 | 
| 2 | Initech  |     4 | 
+----+---------------+---------------------+ 

billing_customer стол:

+----+--------------------+ 
| id | business_name | 
+----+--------------------+ 
| 3 | Acme Corporation | 
| 4 | Globex Corporation | 
+----+--------------------+ 

Идентификаторы являются уникальными среди двух таблиц. Wanted выход каждого клиента (если перевозка груза, выберите также платящего клиента) с id IN (1, 4):

+-------------+--------------------+----------+ 
|  id  | business_name | type | 
+-------------+--------------------+----------+ 
|   1 | Soylent Corp  | shipping | 
|   3 | Acme Corporation | billing | <- 1 has billing_customer = 3 
|   4 | Globex Corporation | billing | 
+-------------+--------------------+----------+ 

Есть ли способ, чтобы избежать подзапрос?

SELECT id, business_name, 'shipping' AS type 
FROM shipping_customer 
WHERE id IN (1, 4) 

UNION 

SELECT id, business_name, 'billing' AS type 
FROM billing_customer 
WHERE 
    id IN (1, 4) OR 
    id IN (SELECT billing_customer_id from shipping_customer WHERE id IN (1, 4)) 
+1

Что RDBMS вы используете? –

+0

Sybaseiq и старая версия тоже. – gremo

ответ

0

Вы можете UNION три набора:

  1. Доставка клиента
  2. Billing Клиент
  3. Доставка клиентов Регистрация в платящего клиента

    ВЫБРАТЬ идентификатор, BUSINESS_NAME 'доставка' AS типа ОТ shipping_customer ГДЕ ИД В (1, 4) СОЕДИНЕНИЕ SELECT, идентификатор, BUSINESS_NAME, 'биллинг' АС типа ОТ billing_customer ГДЕ идентификатор (1, 4) UNION ВЫБОР sc.billing_customer_id, bc.business_name, 'выставления счетов с помощью судоходства' как тип ОТ shipping_customer подкожного INNER РЕГИСТРИРУЙТЕСЬ billing_customer бв на sc.billing_customer_id = bc.id WHERE sc.billing_customer_id IN (1, 4)

Запрос в вопросе хороший явный способ сделать это, единственное, что я бы заменить IN с сущностями:

SELECT id, business_name, 'shipping' AS type 
FROM shipping_customer 
WHERE id IN (1, 4) 
UNION 
SELECT id, business_name, 'billing' AS type 
FROM billing_customer bc 
WHERE 
    id IN (1, 4) OR 
    EXISTS (SELECT 1 FROM shipping_customer 
      WHERE bc.id = billing_customer_id AND id IN (1, 4)) 
1

Он запросил без подзапрос.

Код:

SELECT id, business_name, 'shipping' AS type 
FROM shipping_customer 
WHERE id IN (1, 4) 

UNION ALL 

SELECT b.id AS [id], 
     b.business_name AS [business_name], 
     'billing' AS [type] 
FROM shipping_customer s 
     JOIN billing_customer b 
       ON s.billing_customer_id = b.id 
WHERE s.id IN (1, 4) 
OR  b.id IN (1, 4) 

Вы можете увидеть, если это правильно? Я не понимал, что вы подразумеваете под «Требуется выход - это каждый клиент». Это также может быть не самый оптимизированный способ сделать это.

+0

Это может возвращать дубликаты для типа 'billing'. –

0

Если вы используете SQL Server 2012+, то вы можете попробовать следующий запрос:

SELECT IIF(customerType = 'sName', scId, bcId) AS id, 
     customer, 
     IIF (customerType = 'sName', 'shipping', 'billing') AS type 
FROM (
    SELECT sc.id AS scId, bc.id AS bcId, 
      sc.business_name AS sName, bc.business_name AS bName 
    FROM shipping_customer AS sc 
    INNER JOIN billing_customer AS bc ON sc.billing_customer_id = bc.id 
) src 
UNPIVOT (
    customer FOR customerType IN (sName, bName) 
) unpvt  
WHERE (customerType = 'sName' AND (scId IN (1,4))) 
     OR ((customerType = 'bName') AND ((scId IN (1,4)) OR (bcId IN (1,4)))) 

Demo here