Oracle / SQL - объединить одну таблицу несколько раз к одной таблице - PullRequest
0 голосов
/ 01 июля 2011

Я пытаюсь обернуть свой мозг вокруг вопроса и надеюсь, что вы поможете.У меня есть две таблицы: customer_table и product_table, которые выглядят так:

name    sku_num1    sku_num2    sku_num3    sku_num4
----------------------------------------------------    
Bob     A           B           C           D
Frank   E           A
Tom     G
Shelly  G           E
Justin  E           G           A

sku_num     widget_name
-------------------
A           widget_a
B           widget_b
C           widget_c
D           widget_d

Итак, я хочу вернуть список всех клиентов, у которых есть хотя бы 1 товар, чей SKU указан в таблице товаров.,Таким образом, с вышеупомянутой информацией я получу обратно записи для

Боба

Фрэнка

Джастина

Есть идеи, как это сделать?

Ответы [ 4 ]

5 голосов
/ 01 июля 2011

Нет необходимости объединять одну таблицу дважды:

SELECT *
FROM customers
WHERE sku_num1 IN (SELECT sku_num
                   FROM product_table)
   OR sku_num2 IN (SELECT sku_num
                   FROM product_table)
   ....

Причина, по которой вам нужно несколько условий для полного сканирования таблицы на product_table, заключается в неправильной базе данных.дизайн.Товары, купленные покупателем, не должны входить в несколько столбцов в таблице покупателя.Вместо этого у вас должна быть третья таблица, представляющая собой отношение N: M между клиентом и продуктами.

3 голосов
/ 01 июля 2011

Не работает ли что-то подобное?

select name 
from customer c, products p
where ( c.sku_num1 = p.sku)
or    ( c.sku_num2 = p.sku)
or    ( c.sku_num3 = p.sku)
or    ( c.sku_num4 = p.sku)
1 голос
/ 01 июля 2011

Кристофер, Означает ли это, что вы просто ищете клиентов, у которых sku_num1 или sku_num2, sku_num3 или sku_num4 не равны нулю?

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

select * from customers 
    where sku_num1 is not null 
    or sku_num2 is not null
    or sku_num3 is not null
    or sku_num4 is not null

Если вы пытаетесь узнать, заказали ли они что-либо из определенного списка продуктов, вы можете изменить это на:

select * from customers
    where sku_num1 in (select sku_num from skus)
    or sku_num2 in (select sku_num from skus)
    or sku_num3 in (select sku_num from skus)
    or sku_num4 in (select sku_num from skus)

Кстати, именно поэтому люди обычно не структурируют таблицы подобным образом. Должна быть еще одна таблица соединений, из-за отсутствия чего-то лучшего, чтобы ее называть, customer_skus, которая бы связывала клиентов и skus и имела бы только customerID и sku_num.

Это упростит написание, чтение и обслуживание запроса. Запрос будет выглядеть примерно так:

select distinct name from customers, customer_skus, skus
    where customers.id = customer_skus.id
    and customer_skus.sku_num = skus.sku_num
0 голосов
/ 01 июля 2011

Вы можете объединить таблицу с самим собой, используя alias:

select * from mytable a, mytable b where condition
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...