3

很多时候只是找到合适的文章并在 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 开发人员,所以我必须做所有的事情......非常混乱我正在尽我所能

任何明智的想法?

提前致谢

-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

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

更新

这是我一开始尝试的。它一直给我 ORA-00979:not a 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
4

3 回答 3

5

如果它从文章 -> 附件中只有 1->N 关系,那么您可以按如下方式修改附件:

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

仅当文章和附件之间存在 N->N 关系时,您才需要单独的交集表。

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

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
于 2012-05-23T05:32:57.147 回答
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)

分享和享受。

于 2012-05-23T12:09:31.000 回答
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组合的第一行。

于 2012-05-23T12:49:35.470 回答