Как я могу найти в SQL все X из одной таблицы, которые имеют одинаковый набор значений Y из другой таблицы - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть таблица X, и каждая запись в X имеет много записей в Y.
Я хочу простой SQL, который возвращает только записи из X, которые имеют одинаковый набор записей из Y.
Каждая группазаписи из XI хотят, чтобы он отличался от другой группы (которая имеет другой набор записей из Y) с некоторым значением.

Пример:

1 - 5
  - 6
2 - 3
3 - 5
  - 6
4 - 3
5 - 7

Я хочу вернуть его как*

1 - a
3 - a
2 - b
4 - b
5 - c

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Может быть, мне не хватает проблемы, но разве оператор INTERSECT не сделает эту работу за вас?

select a, b from table_x
INTERSECT
select a, b from table_y

вернет все строки, которые существуют в обеих таблицах. (Это также можно сделать с помощью простого JOIN, но в этом случае INTERSECT красивее)

0 голосов
/ 17 февраля 2012

Это похоже на работу для wm_concat или stragg, которая даст вам ваши уникальные значения без необходимости транслитерировать их во что-то.

select x.id, stragg(x.value)
  from table_x x
 group by x.id

И сваш комментарий вы можете гарантировать порядок в подзапросе:

select id, substr(stragg(value),1,10)
  from ( select id, value
           from table_x
          order by id, value )
 group by id

Единственная проблема заключается в том, что ваши значения не будут "красивыми", они будут объединением всех возможных значений, которые вы имеете в table_x

SQL> create table table_x ( id number, value number);

Table created.

SQL> insert into table_x values (1,5);

1 row created.

SQL> insert into table_x values (1,6);

1 row created.

SQL> insert into table_x values (2,3);

1 row created.

SQL> insert into table_x values (3,6);

1 row created.

SQL> insert into table_x values (3,5);

1 row created.

SQL> insert into table_x values (4,3);

1 row created.

SQL> insert into table_x values (5,7);

1 row created.

SQL> commit;

Commit complete.

SQL>
SQL> select id, substr(stragg(value),1,10)
  2    from ( select id, value
  3             from table_x
  4            order by id, value )
  5   group by id
  6         ;

        ID STRAGG(VALUE)
---------- ----------
         1 5;6
         2 3
         3 5;6
         4 3
         5 7

SQL>
...