2017-08-02 1 views
1

次の処理を行うSQLクエリを記述する必要があります。私はテーブルContactとテーブルContactTranslationsを持っています。第一言語の翻訳が(言語ID = 1)がある場合は、タイトルを返すSQL SELECTクエリ - ロジックを使用して他のテーブルのフィールドに結合して返す

  1. :各連絡先の

    :私はテーブルContactからすべての連絡先を選択して、このロジックを持つテーブルContactTranslationsに参加する必要がありますその翻訳から(Title = "PrimaryLanguageTitle")。

  2. 主要言語の翻訳がない場合は、現在の連絡先の最初に翻訳されたタイトル(Title = "FirstTitle")を返します。
  3. 翻訳がない場合は、「翻訳なし」(タイトル=「翻訳なし」)を返します。

私のテーブルには、次のようになります。

 
Table: Contact 
+-----------+--------+ 
| ContactId | Active | 
+-----------+--------+ 
|   1 |  1 | 
|   2 |  1 | 
|   3 |  1 | 
+-----------+--------+ 

Table: ContactTranslation 
+----------------------+-----------+-------------+----------------------+ 
| ContactTranslationId | ContactId | LanguageId |  Title   | 
+----------------------+-----------+-------------+----------------------+ 
|     1 |   1 | 1 (primary) | PrimaryLanguageTitle | 
|     3 |   2 | 2   | FirstTitle   | 
+----------------------+-----------+-------------+----------------------+ 

連絡先1は、第一言語の翻訳を持っており、それはPrimaryLanguageTitle」を返す必要があります。

連絡先2には主要な翻訳はありませんが、他の翻訳が1つありますので、「FirstTitle」を返す必要があります。私はこれを除く任意のSQLコードを持っていない

 
+-----------+----------------------+--------+ 
| ContactId |  Title   | Active | 
+-----------+----------------------+--------+ 
|   1 | PrimaryLanguageTitle |  1 | 
|   2 | FirstTitle   |  1 | 
|   3 | No translation  |  1 | 
+-----------+----------------------+--------+ 

:それは

期待される結果 'いいえ翻訳' を返すべきではありませんので、

接触3には翻訳されていない

SELECT 
    Contact.ContactId AS ContactId, 
    IsNull(ContactTranslation.Title, 'No translation') AS Title, 
    Contact.Active AS Active 
FROM 
    Contact 
LEFT JOIN ContactTranslation 
    ON Contact.ContactId = ContactTranslation.ContactId 

このコードの問題は、1人の連絡先に多数の翻訳がある場合、1人の連絡先のすべての翻訳が返されることです。上記のロジックには従いません。

+0

のために設けられた第一言語を取得しますあなたの問題/質問のように見えるものを、作業SQLコードを持っているように見えますか? –

+0

@FerdinandGaspar私の質問が更新されました。 – Spectarion

答えて

1

これは、各連絡先の翻訳

SELECT c.contactid, 
     ISNULL(title, 'No translation') title, 
     active 
    FROM contact c 
    LEFT OUTER JOIN (SELECT contactid, 
          languageid, 
          title 
        FROM (SELECT contactid, 
            languageid, 
            title, 
            ROW_NUMBER() OVER (PARTITION BY contactid ORDER BY MIN(languageid)) rmin 
          FROM contacttranslation 
          GROUP BY contactid, 
            languageid, 
            title 
         ) t 

        WHERE rmin = 1) t 
    ON c.contactid = t.contactid 
+1

WHERE句を指定すると、最も内側のSELECTの特定のIDに値を制限できます。この直後 ROW_NUMBER()OVER(PARTITION BY contactid ORDER BY MIN(言語ID))rmin FROM contacttranslation –

+0

ありがとうございました。 – Spectarion

0

FULL OUTER JOINを代わりに実行してください。

SELECT 
    Contact.ContactId AS ContactId, 
    IsNull(ContactTranslation.Title, 'No translation') AS Title, 
    Contact.Active AS Active 
FROM 
    Contact 
FULL JOIN ContactTranslation 
    ON Contact.ContactId = ContactTranslation.ContactId 
+0

これはロジックに従いません。一次翻訳がない場合は、最初の翻訳を返します。最初のものがない場合は、「翻訳なし」を返します。 – Spectarion

関連する問題