1

データを結合する必要があるクエリで苦労しています。あらゆる種類のステータスメッセージを含むテーブルがあります。これらには、たとえば「a1_1」のようなfailureBitNrがあります。次に、「a1_1」を人間が読めるテキスト(lng_English)に変換する2番目のテーブルがあります。デフォルトでは、2番目のテーブルには「a1_1」の変換があります。ただし、これは、たとえばfailureBitNrが標準以外のステータスに使用されている場合など、別の特定の変換によって上書きされることもあります。

したがって、failureBitNrでステータステーブルを変換テーブルと結合する必要があります。それはそれほど難しいことではありません。

しかし、基本的な翻訳を上書きする翻訳に参加するにはどうすればよいですか?

表2は次のようになります。

id   fileProjectNr MachineNr failureBitNr  lng_English
905  2203456       2         a6_1          This message overwrites the standard
205  NULL          NULL      a6_1          Standard message for a6_1
204  NULL          NULL      a1_1          Standard message for A1_1
203  NULL          NULL      a1_2          Standard message for A1_2

既存のメッセージを上書きするメッセージには、NULLではないfileProjectNrが含まれていることに注意してください。すべての標準メッセージにはfileProjectNrNULLがあります

したがって、FailureBitNrでのみ結合すると、両方の行(905と205)が返されます。しかし、failureBitNrに参加して、fileProjectNrのNULLにならないようにする必要があります。

だから私はこれをしました:

DECLARE @ProjectNr int = 123456

SELECT
    t1.*,
t2.*
FROM
    Table1 AS t1
LEFT JOIN
    Table2 AS t2
ON
(t1.failureBitNr = t2.failureBitNr)
AND
    (t2.fileProjectNr LIKE
    CASE WHEN t2.fileProjectNr = @ProjectNr THEN
        @ProjectNr
    ELSE
        NULL
    END
)
WHERE
    {where statement}

これによりID905が返されますが、failureBitNr a1_1とa1_2にも結合がある場合、これらはすべて「ax_xの標準メッセージ」ではなく「NULL」として返されます。

これを修正する方法のアイデアはありますか?

4

2 に答える 2

2

私の最初のアイデア:

SELECT     t1.*, t2.* FROM     Table1 AS t1 
    LEFT JOIN  Table2 AS t2 (t1.failureBitNr = t2.failureBitNr)
    where t2.fileProjectNr is not NULL
union all               
    SELECT     t1.*, t2.* FROM     Table1 AS t1 
    LEFT JOIN  Table2 AS t2 (t1.failureBitNr = t2.failureBitNr) and 
    where t1.failureBitNr not in (select failureBitNr from Table2 where fileProjectNr is not NULL)
于 2012-09-10T11:52:52.273 に答える
1

参加する代わりに、を使用UNION ALLし、次に、GROUP BYによってfailureBitNr、またはSELECT lng_EnglishによってMAX(fileProjectNr)MAXfileProjectNr

于 2012-09-10T11:49:06.857 に答える