很多时候只是找到正确的文章并在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
答案 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
组合的第一行。