2016-05-12 70 views
0

我有一个很长的复杂(至少对我来说)查询,它返回我需要的确切数据。唯一的问题是一些ID由于在一个多对一关系的查询中的一个连接而被重复。我想要做的只是从查询中获取输出,并为每个唯一ID选择一行。从重复ID中选择这一行的方式并不重要,我只是需要以最简单的方式将它缩减为每个ID一行。Oracle SQL - 从杂乱的查询中删除重复项

换句话说,我还有很长的凌乱查询给我我需要整齐地命名的列等,但重复的ID的数据:

ID column1 column2 column2... column50 
111 data data data ... data 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 
113 data data data ... data 
113 data data data ... data 

,我想借此从查询此输出并降低

ID column1 column2 column2... column50 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 

我遇到的挑战是,我不知道如何把整个输出从查询和做的东西与它(如删除重复项),而不首先将其写入到一个表,我不能写入表格。

+0

您必须指定如何选择每个id的行。 (rowno也许?) – jarlh

+2

此外,编辑您的问题以提供一个(简短的!)您的查询的例子,以符合您的示例数据将有所帮助。另外,如果您可以提供一些可以小规模复制您的问题的示例数据,例如“重复”行,它们是否具有每列相同的数据,这将有所帮助?或者数据可能不同,例如。 (id = 111,col1 ='a',col2 = 10)id = 111,col1 ='a',col2 = 20)?如果后者,你想要挑选哪一行? – Boneist

回答

2

如果数据是相同的,那么最简单的方法就是将您凌乱的查询包裹在另一个查询中,您只需使用SELECT DISTINCT。像这样:

SELECT DISTINCT * 
FROM (
    your_messy_query 
) 

如果不相同,那么你可以使用:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY something) AS rn 
    FROM (
    your_messy_query 
) t 
) 
WHERE rn = 1; 

ORDER BY something可能是:

  • 一组特定的列,如果你如何检索最适当的数据;
  • 或者你可以使用ORDER BY ROWNUM如果你只是想拿走每一组的第一行;
  • ORDER BY NULL如果您想要一个非确定性顺序 - 但是,这通常似乎与ORDER BY ROWNUM具有相同的效果。
+0

谢谢,我在看第二个案例(它不完全相同),但我得到了“ORA-00923:FROM关键字找不到预期的地方”。我改变了我凌乱的查询刚需“SELECT * FROM客户”,以保持它的简单,我不断收到同样的错误 - 这里是完整的查询 ... SELECT * FROM ( SELECT T * ROW_NUMBER。 ()OVER(PARTITION BY CUSTOMER_ID ORDER BY ROWNUM)AS RN FROM( SELECT * FROM CUSTOMER )吨 ) 其中RN = 1; –

+0

没关系,我在“SELECT t。*” –

+0

NP之后找到了缺失的逗号,非常感谢您的帮助,很高兴我可以用一些至少大声笑 –