2011-07-19 6 views
1

私はVS 2010プログラムをC#で作成していますが、SQLでSELECTステートメントを実行しました。2つのテーブルを結合してDistinctレコードを取得します

Table 1 - mailfiles 
id,fname,lname,etc... 

Table 2 - details, 
id,timestamp,page_id,mailfile_id(FK),campaign_id 

私は、最新のタイムスタンプでソートされたユニーク/明確なmailfile_idを引き、その後、私の情報の残りの部分を取得するにはメールファイルのテーブルにそれらを結合します。

私はこのような何かを持っていた、私に明確な/ユニークなレコードを取得しますが、私は、私は、タイムスタンプを表示したい詳細列へのアクセスを持っていない

SELECT mailfiles.id,mailfiles.fname,mailfiles.lname,mailfiles.company2,mailfiles.city,etc... 
FROM mailfiles 
JOIN 
(SELECT DISTINCT(details.mailfile_id) 
FROM details 
GROUP BY details.mailfile_id) as TMP 
ON mailfiles.id = TMP.mailfile_id 
ORDER BY TMP.mailfile_id DESC 

ご協力いただければ幸いです。

おかげ

ニック

+0

なぜ、 '、MAX(timestamp)AS timestamp'をサブクエリに追加しないのですか? –

+0

メールファイルの場合、同じIDを持つ複数のファイルが存在する可能性があり、最新のタイムスタンプでファイルを取り出したいのですか?私はあなたが必要とするものを介して論理をしようとしており、あなたの要求には論理的な矛盾があるようです... –

+0

メールファイルは一意のレコードしか持っていません。人がウェブページにどこに何回着地したかを追跡する。それは理にかなっていますか? – Nick

答えて

0
SELECT MAX (timestamp), fname, lname, ... 
FROM mailfiles m, details d 
WHERE m.id. = d.mailfiles_id 
GROUP BY m.id, fname, lname, ... 

フム - はい、私はこの問題は、立ち上がり参照 - あなたは詳細からタイムスタンプよりも必要なのですか?それから、もっと難しくなります。

SELECT m.*, d.* 
FROM mailfiles m, details d 
WHERE m.id = d.mailfiles_id 
    AND (d.mailfiles_id, d.timestamp) IN (
    SELECT mailfiles_id, MAX (timestamp) 
    FROM details 
    GROUP BY mailfiles_id); 

両方のテーブルの詳細が必要な場合。

データベースが... and (a, b) in (SELECT c, d FROM ...をサポートしているかどうかわかりません。 postgresqlはそうです。

+0

あなたは正しいですが、私は簡単なグループ分けを追加しましたが、詳細から多くの情報が必要な場合はもっと複雑です。 –

+1

-1は、暗黙的な結合構文を示唆しています。この構文は、ほぼ20年間は古くなっており、新しいコードでは使用できません。 – HLGEM

+0

はい、私は他のフィールドをつかみたいです – Nick

1

はいかが:

SELECT * 
FROM 
(SELECT mailfile_id, Max(timestamp) m_timestamp FROM details GROUP BY mailfile_id) AS latest 
INNER JOIN details on latest.mailfile_id = details.mailfile_id AND latest.m_timestamp = details.timestamp 
INNER JOIN mailfiles ON mailfiles.id = details.mailfile_id 
ORDER BY details.timestamp 

二つの同一のタイムスタンプがあること場合、未解決の曖昧さはありますが、それはどのような場合には解決しなければならない何かだと思われます。与えられたidに対して、これらの2つのタイムスタンプのどれが実際に最新のものか?

+0

私は今このクエリを実行していますが、これはそうかもしれないと思います!ありがとうルーセント! – Nick

+0

うん、うまくいった!再度ありがとう – Nick

+0

それは素晴らしいです!来る次の人の答えとしてマークしてください。 –

0

あなたがしたいことは、クエリーにリストするすべてのフィールドで別個の演算子が動作することが分かっているので、非常に難しいです。それがうまくいく場合は、最初のクエリを使用してIDのリストを返し、次にこれらのIDを使用して、2番目のクエリで必要な詳細を取得できます。私はその2つのクエリを知っていますが、とにかく複雑なクエリよりも高速になることがあります。