1

私が使用している3つのテーブルがあります。

TableA, TableB, TableC

TableA にはクライアントの情報が含まれており、各行には特定の 1 人のすべての情報が含まれています。

TableB には、TableA の人が作成したメッセージの情報が含まれています。

ID  DistID  Subject Message CreatedDate StatusID    SentTotal
57  3   MonList MonList 2012-03-19 16:21:36.117 2   4

TableC には、TableB のメッセージにアクセスできるユーザーのリストが含まれています。

ID     MessageID    DistID  StatusID  Important  OriginalMessagelID
25111   58            516       1          0       NULL
25112   58            519       1          0       NULL
25114   58            374       1          0       NULL
25115   58            5545      1          0       NULL
25116   58            23435     1          0       NULL

TableC MessageID は TableB ID と同じになります。

TableB と TableC の DistID は、TableA の DistID を参照します (テーブル A には、1 行でもコピーするための多くの情報が含まれています。これは 1 対 1 の比率で、1 人の顧客に対して 1 行です)。

これら 3 つのテーブルをリンクするクエリを作成する必要があります。これが私がこれまでに持っているものです:

SELECT *
FROM Distributor d
INNER JOIN Messages ms
    ON ms.DistID = d.DistID
INNER JOIN Message m
    ON m.DistID = d.DistID
WHERE ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))

現在、TableB には同じ顧客が作成した複数のメッセージを含めることができるため、DistID がこのテーブルに複数回存在する可能性があります。

TableC も同様で、DistID はこのテーブルに複数回存在する可能性があります。

機能する個々のクエリの作成を開始しました。

SELECT *
FROM Distributor
WHERE (DCLoginDate <= (GETDATE() - 3) OR DCLoginDate IS NULL)

SELECT *
FROM Message m
INNER JOIN Messages ms
    ON ms.MessageID = m.ID
WHERE ((CONVERT(VARCHAR(8), CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))

上記は正しく機能します。それらを1つのステートメントに結合しようとすると、2つ返すべきだったときに0の結果を返し始めました(上記のデータではなく、ライブデータから)。

これを効率的に機能させる方法を理解している人はいますか?

4

1 に答える 1

2

単体のクエリと個別のクエリで結合条件が違っていた・・・これは?

SELECT *
FROM Distributor d
INNER JOIN Messages ms
   ON ms.DistID = d.DistID
INNER JOIN Message m
   ON m.ID = ms.MessageID
WHERE 
   ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND 
   (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))
于 2012-04-05T20:52:38.013 に答える