2013-12-22 6 views
2

У меня есть эта таблица columns_tab:выбрать отчетливый с разницей

INDEX_OWNER  INDEX_NAME   TEXT 
------------------------------------------------------------------------ 
DUMMY   PK_FUL_REQUEST  CUSTOMERID, ID, INSTITUTIONID 
NIR    PK_FUL_REQUEST  CUSTOMERID, ID, INSTITUTIONID 
NIR    IX_REQUEST_HASH  CUSTOMERID, HASH_KEY, INSTITUTIONID 
DUMMY   UQ_REQUEST_HASH  CUSTOMERID, HASH_KEY, INSTITUTIONID 

Я хочу, чтобы получить строку, где текст столбца равно, но index_name не равны.

Я могу сделать это с двумя одинаковыми таблицами, но могу ли я сделать это с одной таблицей?

Ожидаемый результат:

INDEX_OWNER  INDEX_NAME   TEXT 
------------------------------------------------------------------------ 
NIR    IX_REQUEST_HASH  CUSTOMERID, HASH_KEY, INSTITUTIONID 
DUMMY   UQ_REQUEST_HASH  CUSTOMERID, HASH_KEY, INSTITUTIONID 

Запрос на это может быть достигнуто путем

select index_owner, index_name, text 
    from columns_tab a, columns_tab b 
where a.text = b.text 
    and a.index_name != b.index_name 

Я хочу, чтобы достичь его без выбора дважды из одной и той же таблицы.

+0

У вас есть первичный ключ этой таблицы? –

+0

Каков ваш ожидаемый результат? Вы хотите получить все возможные комбинации, например 1 не равно 2,1, не равно 3, 2 не равно 3 и так далее? Или вы хотите просто получить результаты, упорядоченные по тексту, а затем сравнить каждого соседа index_name? – dkellner

+0

нет PK – Nir

ответ

1

Здесь вы идете:

select owner, index_name, text 
    from (select t.*, 
       count(*) over(partition by text, index_name) both_match, 
       count(*) over(partition by text) text_match 
      from COLUMNS_TAB t) 
where text_match > 1 
    and both_match = 1; 

Но надо отметить, что если вы избегаете таблицы запроса дважды с точки зрения производительности, то мой подход будет не обязательно работать лучше. Вы должны сравнить планы выполнения обоих запросов с вашими реальными данными.

0

Альтернативный ответ:

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE columns_tab (INDEX_OWNER,  INDEX_NAME,   TEXT) AS 
      SELECT 'DUMMY', 'PK_FUL_REQUEST', 'CUSTOMERID, ID, INSTITUTIONID' FROM DUAL 
UNION ALL SELECT 'NIR', 'PK_FUL_REQUEST', 'CUSTOMERID, ID, INSTITUTIONID' FROM DUAL 
UNION ALL SELECT 'NIR', 'IX_REQUEST_HASH', 'CUSTOMERID, HASH_KEY, INSTITUTIONID' FROM DUAL 
UNION ALL SELECT 'DUMMY', 'UQ_REQUEST_HASH', 'CUSTOMERID, HASH_KEY, INSTITUTIONID' FROM DUAL; 

Запрос 1:

WITH prev_next AS (
    SELECT t.*, 
     LAG(index_name ) OVER (PARTITION BY text ORDER BY index_name) AS p_name, 
     LEAD(index_name) OVER (PARTITION BY text ORDER BY index_name) AS n_name 
    FROM columns_tab t 
) 
SELECT index_owner, 
     index_name, 
     text 
FROM prev_next 
WHERE index_name <> p_name 
OR  index_name <> n_name 

Results:

| INDEX_OWNER |  INDEX_NAME |        TEXT | 
|-------------|-----------------|-------------------------------------| 
|   NIR | IX_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID | 
|  DUMMY | UQ_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID | 
Смежные вопросы