Соедините две таблицы и затем извлеките отчетливые записи - PullRequest
1 голос
/ 20 июля 2011

Я пишу программу для VS 2010 на C #, и я столкнулся с оператором SELECT на SQL, который заставил меня долго разбираться и мог бы использовать некоторую помощь.

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

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

Я хочу получить уникальный / отличный mailfile_id, отсортированный по самой последней отметке времени, а затем соединить их с таблицей mailfiles, чтобы получить остальную информацию.

У меня было что-то вроде этого,

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 

Что дает мне уникальные / уникальные записи, но у меня нет доступа к столбцам сведений, для которых я хочу отобразить метку времени.

Любая помощь будет высоко ценится.

Спасибо

Ник

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Как насчет:

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

Существует неразрешенная двусмысленность в случае, когда есть две идентичные метки времени, но, похоже, это то, что должно быть решено в любом случае. Для данного идентификатора какая из этих 2 временных меток является самой последней?

0 голосов
/ 20 июля 2011

Боюсь, то, что вы хотите сделать, довольно сложно, поскольку, как вы выяснили, отдельный оператор работает со всеми полями, перечисленными в запросе.Если это работает для вас, вы можете вернуть список идентификаторов, используя ваш первый запрос, а затем использовать эти идентификаторы для получения сведений, которые вам требуются во втором запросе.Я знаю два его запроса, но в любом случае он может оказаться быстрее, чем большой сложный запрос.

0 голосов
/ 20 июля 2011
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 делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...