从交叉路口/路口表中选择

Asc*_*ant 3 oracle duplicates junction

很多时候只是找到正确的文章并在StackOverflow上阅读它帮助我完成了很多我不知道该怎么做的东西,但是我第一次认为我需要写一篇.我一直在寻找关于这个问题的正确答案,但我找不到.

所以bugger是我创建了2个表和一个交集表来关联它们.

背后的想法是如此简单(我几乎感到尴尬,我无法解决这个问题).

一篇论坛文章可能有一些附件.这意味着一篇文章可能有附件.一篇文章可以有多个附件.

我一直想做的是

获取包含其附件的所有信息但没有重复行的文章列表.

好的......我试图把DDL拿出来,但是我没有正确地格式化它......

create table article(
id PK
some other stuff...
)

create table attachment(
id PK
physical_file_name 
etc...
)
Run Code Online (Sandbox Code Playgroud)

这是十字路口

create table article_attachment(
id PK(synthetic)
article_id FK
attachment_ID FK
)
Run Code Online (Sandbox Code Playgroud)

我想选择所有文章是否有任何附件,但如果一篇文章有​​多个附件我只需要其中一个附件.(无论哪一个都没关系)

是的,这听起来很愚蠢,但是这里没有DBA或SQL开发人员,所以我必须做所有的事情...相当混乱我正在努力

任何明智的想法?

提前致谢

-ps - 我尝试过像......

with refined_table as(

  select file_id, row_number() over(partition by id order by id desc) as seq
  from consumer_file

)
select * 
from consumer_info ci 
left outer join consumer_file cf on cf.consumer_id = ci.id
left outer join refined_table rt on rt.file_id = cf.file_id
where rt.seq =1
Run Code Online (Sandbox Code Playgroud)

这,但我真的不明白它是如何工作的

UPDATE

这是我最初尝试过的.它一直给我ORA-00979:不是GROUP BY表达我长期寻找解决方案.一些人建议使用聚合功能或"提示"(如果这是它的......)

  with refined_table as(

      select file_id, row_number() over(partition by id order by id desc) as seq
      from consumer_file

    )
Run Code Online (Sandbox Code Playgroud)

我是说这个

嗯任何想法?

非常感谢你们所有人:)

SELECT 
    CI.id as article_id, 
    DF.id as attachment_id,  
    DF.PHYSICAL_NAME as file_name 
FROM 
    CONSUMER_INFO CI
LEFT OUTER JOIN 
    CONSUMER_FILE CF ON CF.CONSUMER_ID = CI.ID
LEFT OUTER JOIN 
    DEFAULT_FILE DF ON CF.FILE_ID = DF.id
GROUP BY 
   CI.ID
Run Code Online (Sandbox Code Playgroud)

Oza*_*ray 5

如果它只与文章 - >附件中的1-> N关系,那么您可以修改附件,如下所示:

create table attachment(
   id PK
   article_id FK 
   physical_file_name 
   etc...
)
Run Code Online (Sandbox Code Playgroud)

只有在文章和附件之间存在N→N关系时,才需要单独的交集表.

更新:但是,如果您仍然需要保持N < - > N关系(如您的评论中所述),那么您可以使用GROUP BY子句通过article_id将GROUP结果用于:例如:

SELECT 
    article.id as article_id, 
    attachment.id as attachment_id,  
    attachment.physical_file_name as file_name 
FROM 
    article 
LEFT OUTER JOIN 
    article_attachment ON article_id = article.id 
LEFT OUTER JOIN 
    attachment ON attachment_id = attachment.id
GROUP BY 
    article_id
Run Code Online (Sandbox Code Playgroud)