3

多くの場合、適切な記事を見つけて StackOverflow で読むことで、どうすればよいかわからなかった多くのことを解決できましたが、初めて、記事を書く必要があると思いました。この問題について正しい答えを探していましたが、見つけられませんでした。

バグは、2 つのテーブルと 1 つの交差テーブルを作成してそれらを関連付けたことです。

背後にあるアイデアはとてもシンプルです (私はこれを解決できないことを恥ずかしく思います)。

1 つの BBS 記事には、いくつかのファイルが添付されている場合があります。つまり、1 つの記事に添付ファイルがある場合とない場合があります。1 つの記事に複数の添付ファイルを含めることができます。

私がやろうとしてきたことは

添付ファイルに関するすべての情報を含む記事のリストを取得しますが、重複する行はありません。

わかりました... 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
)

添付ファイルの有無にかかわらず、すべての記事を選択したいのですが、1 つの記事に複数の添付ファイルがある場合、必要なのは添付ファイルの 1 つだけです。(どちらでも構いません)

はい、ばかげているように聞こえますが、ここには 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 expression を与え続けます 私は長い間解決策を探していました. 集計関数または「ヒント」を使用することを提案した人が何人かいます (それがそれである場合...)

  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

あなたのテーブル定義は問題ないと思います。添付ファイルの 1 つだけを選択する必要があるため、少し複雑になりますが、どの添付ファイルを取得してもかまわないので、次のようにするとうまくいくと思います。

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 に答える