0

基本的に、次の4つのテーブルがあります(2つのルックアップテーブルを含む)

私の意図は、基本的には、まずリンク キー (Lookup1 を介した ItemID & TrfCode) を介して ModTab と MedTab の間で一致するレコードを見つけ、次に ModTab にある MedTab の OptCodes とその逆を見つける必要があります。

これ一発でできるかな

キーフィールドは同じ名前のものです。

MedTab と Lookup2 をリンクする場合、StateCode と OptCode の両方を使用する必要があります

ModTab
======
Component
Item ID

MedTab
======
TrfCode
OptCode
StateCode



Lookup1
=======
Item ID
TrfCode

Lookup2
========
Component
StateCode
OptCode

どうすればいいですか

あなたの指導に感謝します

乾杯

シャバー

4

1 に答える 1

0

を使用してこれを達成できると思いますがFULL JOIN、スキーマの正確な仕組みについてはかなり曖昧ですが、この行に沿った何かが機能するはずです:

SELECT  COALESCE(ModTab.ItemID, MedTab.ItemID) AS ItemID,
        COALESCE(ModTab.TrfCode, MedTab.TrfCode) AS TrfCode,
        COALESCE(ModTab.Component, MedTab.Component) AS Component,
        COALESCE(ModTab.StateCode, MedTab.StateCode) AS StateCode,
        COALESCE(ModTab.OptCode, MedTab.OptCode) AS OptCode,
        CASE WHEN ModTab.OptCode IS NULL THEN 'MedTab Only'
            WHEN MedTab.OptCode IS NULL THEN 'ModTab Only'
            ELSE 'Both Tables'
        END AS MatchStatus
FROM    (   SELECT  l1.ItemID,
                    l1.TrfCode,
                    l2.Component,
                    l2.StateCode,
                    l2.OptCode
            FROM    ModTab m
                    INNER JOIN Lookup1 l1
                        ON l1.ItemID = m.ItemID
                    INNER JOIN Lookup2 l2
                        ON l2.Component = m.Component
        ) ModTab
        FULL JOIN
        (   SELECT  l1.ItemID,
                    l1.TrfCode,
                    l2.Component,
                    l2.StateCode,
                    l2.OptCode
            FROM    MedTab m
                    INNER JOIN Lookup1 l1
                        ON l1.TrfCode = m.TrfCode
                    INNER JOIN Lookup2 l2
                        ON l2.StateCode = m.StateCode
                        AND l2.OptCode = m.OptCode
        ) MedTab
            ON ModTab.ItemID = MedTab.ItemID
            AND ModTab.TrfCode = MedTab.TrfCode
            AND ModTab.Component = MedTab.Component
            AND ModTab.StateCode = MedTab.StateCode
            AND ModTab.OptCode = MedTab.OptCode;

いくつかの結合を修正する必要があるかもしれませんが、原則はそこにあります。基本的にデータセットを完全に結合します。これにより、それぞれからすべてのレコードが返されます。一方が null の場合、レコードがそのセットにないことがわかります。 null レコードが両方にあることがわかっています。

編集

MS-Access はサポートしておらずFULL JOIN、複数の結合に対して異なる JOIN 構文を使用しているため、UNION を使用してレコードをマージし、レコード ソースがどこにあるかを確認する必要があります。このような何かがそれを行う必要があります:

SELECT  ItemID, 
        TrfCode, 
        Component, 
        StateCode, 
        OptCode,
        IIF(SUM(MedTab)=0,'ModTab',IIF(SUM(ModTab)=0,'MedTab','Both')) AS TabStatus
FROM    (   SELECT  Lookup1.ItemID, 
                    Lookup1.TrfCode, 
                    Lookup2.Component, 
                    Lookup2.StateCode, 
                    Lookup2.OptCode,
                    1 AS MedTab,
                    0 AS ModTab
            FROM    (   MedTab
                        INNER JOIN Lookup1
                            ON Lookup1.TrfCode = MedTab.TrfCode
                    )
                    INNER JOIN Lookup2
                        ON Lookup2.StateCode = MedTab.StateCode
                        AND Lookup2.OptCode = MedTab.OptCode
            UNION ALL
            SELECT  Lookup1.ItemID, 
                    Lookup1.TrfCode, 
                    Lookup2.Component, 
                    Lookup2.StateCode, 
                    Lookup2.OptCode,
                    0 AS MedTab,
                    1 AS ModTab
            FROM    (   ModTab 
                        INNER JOIN Lookup2 
                            ON ModTab.Component = Lookup2.Component
                    ) 
                    INNER JOIN Lookup1 
                        ON ModTab.ItemID = Lookup1.ItemID
        ) 
GROUP BY ItemID, TrfCode, Component, StateCode, OptCode;

私はこれをテストしていませんが、アクセスでクエリを実行してからしばらく経っているので、指が交差して初めて機能します!

于 2013-02-01T09:04:43.193 に答える