1

レコードに結合したい2つのテーブル間に1対多の関係がありますFooというテーブルとBarというテーブルがあるとします。Fooにはいくつかのコンテンツが含まれ、Barにはこのコンテンツへのコメントが含まれています。ここで、最初のコメントと一緒にすべてのコンテンツをリストしたいと思います。

これは私がこれまでに試したことです:

SELECT T0.[Content], T1.[Comment]
FROM [Foo] I0 
    INNER JOIN [Bar] T1 ON T1.[ContentCode] = T0.[Code]

それは私に多くのコメントで複数回すべての内容を与えます。言い換えれば、私は「すべてのコメントをそれらを表すコンテンツと組み合わせる」と言っています。私が達成しようとしているのは、「1つのコメントだけをコンテンツと組み合わせる」ということです。だから私はこれを試しました:

SELECT DISTINCT T1.[CommentCode], T0.[Content], T1.[Comment]
FROM [Foo] I0 
    INNER JOIN [Bar] T1 ON T1.[ContentCode] = T0.[Code]

これは正常に機能します。を使用すると、 BarORDER BYで見つかった最初または最後のレコードを使用するようにクエリに指示できます。

しかし、何らかの理由DISTINCTで、私たちが使用を余儀なくされているデータベースアダプタではサポートされていません。

結合された関係の右側の結果を制限する別の可能性に直面していますか?

前もって感謝します!:)

編集:

私はMSSQLServer2008(R2)を使用していますが、SAP Business OneDIAPIを使用してアクセスしています。これにより、T-SQLの使用が制限されます。

4

2 に答える 2

3

かなり移植性の高い方法は、サブクエリで単一のコメントの ID をクエリすることです。

SELECT  T0.Content
,       T1.Comment
FROM    Foo I0 
JOIN    Bar T1 
ON      T1.ID = 
        (
        SELECT  max(ID)
        FROM    Bar T2
        WHERE   T2.ContentCode = T0.Code
        )

SQL Server がすべての行に対してサブクエリを実行する場合は、代わりに次のバージョンを検討してください。

SELECT  T0.Content
,       T1.Comment
FROM    Foo T0
JOIN    (
        SELECT  ContentCode
        ,       max(ID) as MaxID
        FROM    Bar
        GROUP BY
                ContentCode
        ) filter
ON      filter.ContentCode = T0.ContentCode
JOIN    Bar T1
ON      T1.ID = filter.MaxID
于 2013-01-03T10:55:37.837 に答える
0

1 つのコメントだけを気にする場合は、次のようなサブクエリを使用しないでください。

SELECT Foo.Content, (SELECT TOP 1 Comment FROM Bar WHERE Bar.ContentCode=Foo.Code) AS [Comment] FROM Foo
于 2013-01-03T10:58:22.793 に答える