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

时间:2012-05-23 05:27:14

标签: oracle duplicates junction

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

因此,我已经创建了2个表和一个交叉表来关联它们。

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

一篇BBS文章可能有一些附件。 这意味着一篇文章可能有附件。 一篇文章可以有多个附件。

我一直想做的是

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

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

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

create table attachment(
id PK
physical_file_name 
etc...
)

这里是交叉点

create table article_attachment(
id PK(synthetic)
article_id FK
attachment_ID FK
)

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

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

任何明智的想法?

提前致谢

-p.s。 - 我尝试过像......

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

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

更新

这是我最初尝试过的。它一直在给我  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

    )

我的意思是

嗯,有什么想法吗?

非常感谢你们所有人:)

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

3 个答案:

答案 0 :(得分:5)

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

create table attachment(
   id PK
   article_id FK 
   physical_file_name 
   etc...
)

只有在文章和附件之间存在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

答案 1 :(得分:0)

我认为你的表定义很好。只选择其中一个附件的要求会使事情变得更复杂,但由于你不关心你得到哪一个,我认为以下内容应该有效:

SELECT *
  FROM ARTICLE a
  LEFT OUTER JOIN (SELECT ARTICLE_ID, MIN(ATTACHMENT_ID) AS ATTACHMENT_ID
                     FROM ARTICLE_ATTACHMENT
                     GROUP BY ARTICLE_ID) aa
    ON (aa.ARTICLE_ID = a.ID)
  LEFT OUTER JOIN ATTACHMENT t
    ON (t.ID = aa.ATTACHMENT_ID)

分享并享受。

答案 2 :(得分:0)

如果您不在乎,您加载了哪个附件,那么您可能正在寻找:

select
  art.article_id, art.article_stuff,
  att.attachment_id, att.attachment_stuff
from
  article art,
  article_attachment aat,
  attachment att
where
  art.article_id = &article_id
  and aat.article_id = art.article_id
  and att.attachment_id = aat.attachment_id
  and rownum < 2;

rownum < 2将确保您只选择所有article-article_attachment-attachment组合的第一行。