Sql 选择不同的
我有这个表Sql 选择不同的,sql,oracle,select,Sql,Oracle,Select,我有这个表列\u选项卡: INDEX_OWNER INDEX_NAME TEXT ------------------------------------------------------------------------ DUMMY PK_FUL_REQUEST CUSTOMERID, ID, INSTITUTIONID NIR PK_FUL_REQUEST CUSTOMERID, ID, IN
列\u选项卡
:
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_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
我不想从同一张表中选择两次就可以实现它。给你:
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;
但必须指出,如果您在性能方面两次避免查询表,那么我的方法不一定会表现得更好。您应该比较两个查询在实际数据上的执行计划。另一个答案:
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;
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
| INDEX_OWNER | INDEX_NAME | TEXT |
|-------------|-----------------|-------------------------------------|
| NIR | IX_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID |
| DUMMY | UQ_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID |
查询1:
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;
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
| INDEX_OWNER | INDEX_NAME | TEXT |
|-------------|-----------------|-------------------------------------|
| NIR | IX_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID |
| DUMMY | UQ_REQUEST_HASH | CUSTOMERID, HASH_KEY, INSTITUTIONID |
那张表上有主键吗?你期望的结果是什么?你想得到所有可能的组合吗,比如1不等于2,1不等于3,2不等于3,等等?或者,您希望只获取按文本排序的结果,然后比较每个邻居索引名称吗?在预期结果示例中,您如何知道选择哪一行?你的标准是什么?我的意思是,每一对中都有两个可能的候选人。我想要他们两个。看看我写的查询。我想要同样的东西,但是只查询一次表(如果可能的话)。