2016-10-28 9 views
0

Я пробовал это часами и разными форумами, но наклоняю голову, чтобы понять это. Я пробовал присоединиться и все виды, но я постоянно получал неправильные результаты.SQL одинаковые значения, но разные вторичные значения

Моего образец таблица выглядит ниже

Item Branch Type 
A Main Box 
A London Single 
A Paris Single 
A Tokyo Box 
B Main Single 
B London Single 
B Paris Single 
C Main Single 
C London Box 
C Paris Single 
C Tokyo Single 
D Main Box 
D London Single 
D Paris Box 
D Tokyo Box 
D Sydney Single 

, что я хочу, чтобы получить как мой набор результатов всех товары, отличающийся «Type» в его «филиал» Главной

Например если Main Type is Box, отображать главную ветку и другие ветви, которые имеют разные типы.

Таблица результатов должна выглядеть следующим образом.

Item Branch Type 
**A Main Box** 
A London Single 
A Paris Single 
**C Main Single** 
C London Box 
**D Main Box** 
D London Single 
D Sydney Single 

любая помощь очень ценится.

благодаря

+1

* «Я пробовал присоединяться и все виды ...» * Есть много полезных людей, которые не будут отвечать, если вы не покажете *, что вы пробовали. Вероятно, вы также получите больше ответов, если включить в свой вопрос инструкции CREATE TABLE и INSERT. –

+1

Я не уверен, что понимаю. Почему в результаты не включены записи из пункта B? –

+0

@ данные назначения Hi Любые записи из B не находятся в результатах, потому что «B» имеют тот же тип, что и его основная ветвь во всех других ветвях , тогда как другие элементы представлены другим типом в других ветвях. надеюсь, это объясняет это – Sinnerv

ответ

1

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

select * 
from t t1 
where (branch='Main' or (branch <> 'Main' 
         and exists (select 1 from t 
            where item=t1.item and branch = 'Main' 
            and type <> t1.type) 
         ) 
     ) 
and item in (select item from t group by item having count(distinct type) > 1) 

Если запрос выше кажется запутанным, вы можете использовать CTE, чтобы получить все не - главные ветви, тип которых отличается от основной ветви для элемента. Затем используйте union all, чтобы получить основные строки ветвей для этих предметов.

with y as (
select * from t t1 
where branch <> 'Main' and exists (select 1 from t 
            where item=t1.item and branch = 'Main' 
            and type <> t1.type) 
    ) 
select * from t where branch='Main' and item in (select item from y) 
union all 
select * from y 
+0

Спасибо, столько за это. он работает отлично !! Я попробовал, вложенный запрос select бит в качестве отдельного запроса и попытался присоединиться к нему с большой таблицей, но я запутался, пытаясь сопоставить столбцы и как их называть. Также я обнаружил функцию Count из других подобных сообщений, но никогда не мог Приготовь мне голову, чтобы собрать все это вместе. – Sinnerv

0
select A.item, A.branch, A.type 
from ibt A, ibt B 
on A.item = B.item and B.branch = "Main" and A.type != B.type; 

результаты являются ударом:

A|London|Single 
A|Paris|Single 
C|London|Box 
D|London|Single 
D|Sydney|Single 
+2

В этом [вопрос] большое обсуждение. (http://stackoverflow.com/questions/128965/is-there-something-wrong-with-joins-that-dont-use-the-join-keyword -in-sql-or-my) в более старом стиле соединения, которое вы использовали в своем примере. Tl; dr Избегайте их. Вместо этого используйте соединения ANSI. –

+0

хороший совет, спасибо ~ – SmartXiaoMing

0

Я не уверен, понял ли я, что вам нужно. Однако, это возможное частичное решение. Вы можете улучшить это просто с вашего требования.

Образец в postgre.

CREATE TEMPORARY TABLE items (
    item varchar(10), 
    branch varchar(10), 
    type varchar(10) 
); 


INSERT INTO items VALUES ('A', 'Main', 'Box'); 
INSERT INTO items VALUES ('A', 'London', 'Single'); 
INSERT INTO items VALUES ('A', 'Paris', 'Single'); 
INSERT INTO items VALUES ('A', 'Tokyo', 'Box'); 
INSERT INTO items VALUES ('B', 'Main', 'Single'); 
INSERT INTO items VALUES ('B', 'London', 'Single'); 
INSERT INTO items VALUES ('B', 'Paris', 'Single'); 
INSERT INTO items VALUES ('C', 'Main', 'Single'); 
INSERT INTO items VALUES ('C', 'London', 'Box'); 
INSERT INTO items VALUES ('C', 'Paris', 'Single'); 
INSERT INTO items VALUES ('C', 'Tokyo', 'Single'); 
INSERT INTO items VALUES ('D', 'Main', 'Box'); 
INSERT INTO items VALUES ('D', 'London', 'Single'); 
INSERT INTO items VALUES ('D', 'Paris', 'Box'); 
INSERT INTO items VALUES ('D', 'Tokyo', 'Box'); 
INSERT INTO items VALUES ('D', 'Sydney', 'Single'); 

SELECT 
CASE WHEN T.branch = 'Main' THEN rpad(T.item, length(T.item) + T.children::INT, '*') ELSE T.item END item, 
T.branch, 
T.type 
FROM (
SELECT 
    I.item, 
    I.branch, 
    I.type, 
    MAIN_ITEMS.item        mitem, 
    MAIN_ITEMS.branch       mbranch, 
    MAIN_ITEMS.type        mtype, 
    (SELECT count(j.item) 
    FROM items j 
    WHERE I.ITEM = j.item AND I.type <> j.type) children FROM items I 
    JOIN (
     SELECT 
      item, 
      branch, 
      type 
     FROM items 
     WHERE branch = 'Main' 

     ) MAIN_ITEMS 
    ON ((I.ITEM = MAIN_ITEMS.item AND I.type <> MAIN_ITEMS.type) OR (
    I.ITEM = MAIN_ITEMS.item AND I.branch = MAIN_ITEMS.branch AND I.type = MAIN_ITEMS.type 
) 
    ) 
) T 
where T.children > 0; 

Выход:

A** Main Box 
A London Single 
A Paris Single 
C* Main Single 
C London Box 
D** Main Box 
D London Single 
D Sydney Single 

Я надеюсь, что этот пример поможет вам.

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