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)
如果它只与文章 - >附件中的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)