2013-12-22 46 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是不相等的。

我可以用2张相同的表格做,但我可以用一张桌子做吗?

预期的结果是:

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等等?或者你想只是按文本排序的结果,然后比较每个邻居的索引名? – 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 |