0

fk でリンクされた 2 つのテーブルからレコードを取得したいと考えています。この fk は null にすることができ、子テーブルにはフィルターが必要です。簡単な例で説明します。

Table Poet
IdPoet Number(5) 
NameVarchar2(250)

Table Poem 
IdPoem Number(5) 
IdPoet Number(5) FK 
Language Number(1) 
Text Varchar2(2000)

FK は関係 Poet と Poem
Poet-1--------------N0---Poemです

Poem.IdPoet は null にすることができます。

詩を持たない Poet と、言語 = 1 または言語 = 2 の詩を持つ詩人からすべてのレコードを取得する必要があります。言語 1 は 2 よりも制限的です。これは、詩が 2 つある場合 (1 つは言語 1 で、もう 1 つは言語 2 で書かれている)、言語 1 のレコードのみを表示する必要があることを意味します。

    SELECT *
    FROM POET, POEM
    WHERE POET.IDPOET = POEM.IDPOET(+)
    AND
    (
    (POEM.LANGUAGE IS NOT NULL AND POE.LANGUAGE = 1) OR
    (POEM.LANGUAGE IS NOT NULL AND POE.LANGUAGE = 2) OR
    (POEM.LANGUAGE IS = 1) OR
    (POEM.LANGUAGE IS = 2)
    )

この選択では、詩を持たない詩人、言語 1 で 1 つの詩を持つ詩人、または言語 2 で 1 つの詩を持つ詩人が表示されます。 、そして言語 1 の詩を含むレコードのみを表示したいのは、言語 2 よりも制限が厳しいためです。

4

3 に答える 3

0

各詩人の言語値が最も低いすべての詩に関する情報を、詩を持たない詩人と一緒に選択する場合は、次のクエリを実行する必要があります。

SELECT * FROM Poet P
LEFT JOIN Poem ON Poem.IdPoet = P.IdPoet
where Poem.Language IS NULL
OR Poem.Language =
    (SELECT MIN(Language) As L1
     FROM Poem
     WHERE Poem.IdPoet = P.IdPoet
     GROUP BY Poem.IdPoet)

ここでは、languageis の最小値が 1 であると想定されており、クエリは 2 より大きい language 値が使用されても機能します。

于 2013-01-27T12:23:31.777 に答える
0

これが機能するかどうかはわかりませんが、アイデアはすべての詩人のリストを作成し、彼らが何かを書いている場合はすべての詩を作成することです.

詩人テーブルは、すべての詩人を含むように詩と結合されたままになっています

select distinct poets.Name,
       coalesce (l1.Text, l2.Text,'NONE') as Poem
  from Poets 
       left join (
         Poems l1
         full join Poems l2 
           on l1.IdPoet = l2.IdPoet
         )
         on Poets.IdPoet = l1.IdPoet

where 1l.Language = 1 and l2.Language=2

(未テスト)

ただし、詩人が 1 つの言語で複数の詩を書いている場合は、両方が表示されます。これがあなたの望むものかどうかはわかりません。

于 2013-01-27T10:12:13.667 に答える