Как объединить таблицы, чтобы получить результат - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть данные, как показано ниже

Данные таблицы 1:

Attr1    Attr2
36 L
37 L
38 L
39 L
40 L
41 L
42 L
43 L
44 L
46 L
48 L
50 L
52 L
54 L
56 L
58 L
60 L
62 L
36 P
37 P
38 P
39 P
40 P
41 P
42 P
43 P
44 P
46 P
48 P
50 P
52 P
54 P
56 P
58 P
60 P
62 P
36 PL
37 PL
38 PL
39 PL
40 PL
41 PL
42 PL
43 PL
44 PL
46 PL
48 PL
50 PL
52 PL
54 PL
56 PL
58 PL
60 PL
62 PL
36 PS
37 PS
38 PS
39 PS
40 PS
41 PS
42 PS
43 PS
44 PS
46 PS
48 PS
50 PS
52 PS
54 PS
56 PS
58 PS
60 PS
62 PS
36 R
37 R
38 R
39 R
40 R
41 R
42 R
43 R
44 R
46 R
48 R
50 R
52 R
54 R
56 R
58 R
60 R
62 R
36 S
37 S
38 S
39 S
40 S
41 S
42 S
43 S
44 S
46 S
48 S
50 S
52 S
54 S
56 S
58 S
60 S
62 S
36 XL
37 XL
38 XL
39 XL
40 XL
41 XL
42 XL
43 XL
44 XL
46 XL
48 XL
50 XL
52 XL
54 XL
56 XL
58 XL
60 XL
62 XL

И table2, как показано ниже:

ItemCode          Attr1     Attr2
ITEM-000001 43 S
ITEM-000001 52 L
ITEM-000006 42 R
ITEM-000006 44 R
ITEM-000009 56 R

будет больше элементов в таблице 2.

Как я могу получить выходные данные, в которых я получу все строки таблицы table1, которые имеют одинаковый Attr2 скажем, например, «ITEM-000001» с двумя значениями Attr2 - «S» и «L», поэтому будет отображаться, как показано ниже:

Attr1    Attr2       ItemCode
    36 L           ITEM-000001
    37 L           ITEM-000001
    38 L           ITEM-000001
    39 L           ITEM-000001
    40 L           ITEM-000001
    41 L           ITEM-000001
    42 L           ITEM-000001
    43 L           ITEM-000001
    44 L
    46 L
    48 L
    50 L
    52 L
    54 L
    56 L
    58 L
    60 L
    62 L           ITEM-000001
    36 S           ITEM-000001
    37 S
    38 S
    39 S
    40 S
    41 S
    42 S
    43 S
    44 S
    46 S
    48 S
    50 S
    52 S
    54 S           ITEM-000001
    56 S           ITEM-000001
    58 S           ITEM-000001
    60 S           ITEM-000001
    62 S           ITEM-000001

Ответы [ 4 ]

6 голосов
/ 10 февраля 2010

EDIT

Читая ваш запрос, думаю, я наконец-то знаю, что вы хотите:

Получите все DISTINCT ItemCode и Attr2 от Table2 и присоедините все DISTINCT Attr1 от Table1. Я до сих пор не вижу, что из предоставленных вами образцов ...

Вы можете уменьшить свой запрос до:

SELECT DISTINCT T2.ItemCode, T1.Attr1, T2.Attr2
FROM
  Table1 T1
  CROSS JOIN Table2 T2
ORDER BY 1, 2, 3

Я полагаю, что производительность можно улучшить:

SELECT T2.ItemCode, T1.Attr1, T2.Attr2
FROM
  ( SELECT DISTINCT Attr1
    FROM Table1
  ) T1
  CROSS JOIN
  ( SELECT DISTINCT ItemCode, Attr2
    FROM Table2
  ) T2
ORDER BY 1, 2, 3

Оригинальный пост:

Вы можете сделать это, используя LEFT JOIN. Это вернет все строки Table1 и объединит строки Table2 там, где условие соответствует. Столбцы Table2 равны NULL, если ни одна строка не соответствует.

SELECT t1.Attr1, t1.Attr2, t2.ItemCode
FROM Table1 t1
LEFT JOIN Table2 t2 ON ( t2.Attr1 = t1.Attr1 AND t2.Attr2 = t1.Attr2 )
WHERE t1.Attr2 IN ( 'S', 'L' )
2 голосов
/ 10 февраля 2010

Я думаю, наконец, я понимаю ваш вопрос. Сначала позвольте мне описать то, что вы хотите, своими словами, чтобы понять, правильно ли я понимаю ваши требования.

Вы хотите сделать запрос для конкретного кода товара. В таблице 1 показаны все возможные комбинации (Attr1, Attr2), а в таблице 2 показаны доступные для конкретного кода элемента. Вы хотите вернуть строки для тех Attr2, которые доступны для вашего кода товара, и для каждой пары (Attr1, Attr2) показать, доступен ли код товара для этой пары.

Я думаю, что этот запрос делает то, что вы хотите:

SELECT T1.Attr1, T1.Attr2, T2_2.ItemCode
FROM Table1 T1
JOIN Table2 T2_1
ON T1.Attr2 = T2_1.Attr2
LEFT JOIN Table2 T2_2
ON T1.Attr1 = T2_2.Attr1 AND T1.Attr2 = T2_2.Attr2
WHERE T2_1.ItemCode = 'ITEM-000001'

Для ваших (неполных) данных теста результат:

36, 'L', ''
37, 'L', ''
38, 'L', ''
39, 'L', ''
40, 'L', ''
41, 'L', ''
42, 'L', ''
43, 'L', ''
44, 'L', ''
46, 'L', ''
48, 'L', ''
50, 'L', ''
52, 'L', 'ITEM-000001'
54, 'L', ''
56, 'L', ''
58, 'L', ''
60, 'L', ''
62, 'L', ''
36, 'S', ''
37, 'S', ''
38, 'S', ''
39, 'S', ''
40, 'S', ''
41, 'S', ''
42, 'S', ''
43, 'S', 'ITEM-000001'
44, 'S', ''
46, 'S', ''
48, 'S', ''
50, 'S', ''
52, 'S', ''
54, 'S', ''
56, 'S', ''
58, 'S', ''
60, 'S', ''
62, 'S', ''

Я что-то не так понял, пожалуйста, дайте мне знать.

0 голосов
/ 11 февраля 2010

Привет Всем спасибо за все ваши усилия и время на мой вопрос, вот запрос, который даст мне ожидаемый результат. Большое спасибо всем.

SELECT DISTINCT T2.ItemCode, T1.Attr1, T2.Attr2
FROM  
    (
       SELECT Attr1
       FROM Table1
    ) AS T1

    CROSS JOIN

    ( 
       SELECT ItemCode, Attr2
       FROM Table2
    ) AS T2
ORDER BY 1, 2, 3
0 голосов
/ 10 февраля 2010

Я думаю, что вы ищете, чтобы получить все записи из таблицы 1, которые имеют ItemCode определенного значения, например, «Item-000001». Если это так, то приведенный ниже код должен делать то, что вы хотите, просто замените «Item-000001» на любое значение, которое вы ищете. Кроме того, если вы ищете только записи с Attr2 'S' или 'L', тогда вам понадобится вторая часть предложения where.

SELECT T1.Attr1, T1.Attr2, T2.ItemCode
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.Attr1 = T2.Attr1 AND T1.Attr2 = T2.Attr2
WHERE T2.ItemCode = 'Item-000001' AND T2.Attr2 IN ('S', 'L')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...