0

2 つのクエリをマージしようとしています。目的は、MAX(ID) に基づいて、名前と最新のリストのタイトルと共に一意の顧客の電子メールを含むレコードセットを取得することです。

DISTINCT を使用すると、メールと ID を取得できますが、明らかにタイトルを追加するとこれが壊れます。

これは私がこれまでに持っているものです:

SELECT DISTINCT MAX(EV_ID) As EV_ID, EV_ContactEmail, EV_CusName
FROM tblEvents ev
INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID
WHERE (
    CUS_IsAdmin = 'y'
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM'
    AND EV_ContactEmail <> ''
    )
GROUP BY EV_ContactEmail

ここで、自己結合を行う必要があることを示すいくつかの投稿を見つけましたが、同じ量のレコードを返すことはできませんが、タイトルを使用すると、さらに多くのレコードが返されます。

SELECT DISTINCT MAX(EV_ID) As EV_ID, ev.EV_Title, EV_ContactEmail, EV_CusName
FROM tblEvents ev
INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID
INNER JOIN (
    SELECT EV_Title, MAX(EV_ID) AS MaxID
    FROM tblEvents
    GROUP BY EV_Title
) groupedev ON ev.EV_Title = groupedev.EV_Title AND ev.EV_ID = groupedev.MaxID
WHERE (
    CUS_IsAdmin = 'y' 
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM'
    AND EV_ContactEmail <> ''
)
GROUP BY EV_ContactEmail, ev.EV_Title

誰がそれの何が悪いのかアドバイスできますか?

4

4 に答える 4

2

このようなもの?

SELECT DISTINCT EV_ID, EV_ContactEmail, EV_CusName, EV_Title
FROM tblEvents ev
    INNER JOIN tblCustomers cus 
        ON cus.CUS_ID = ev.EV_CustomerID
    INNER JOIN (SELECT MAX(EV_ID) AS  MaxID
                FROM tblEvents
                GROUP BY EV_ContactEmail) sub
        ON ev.EV_ID = sub.MaxID
WHERE CUS_IsAdmin = 'y'
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM'
    AND EV_ContactEmail <> ''
于 2012-07-06T10:50:50.453 に答える
1
SELECT e.EV_ID, e.EV_ContactEmail, e.EV_CusName
FROM
        events AS e
    INNER JOIN
        ( SELECT MAX(EV_ID) As EV_ID
          FROM tblEvents ev
            INNER JOIN tblCustomers cus 
              ON cus.CUS_ID = ev.EV_CustomerID
          WHERE CUS_IsAdmin = 'y'
            AND CUS_Live = 'y' 
            AND EV_Live = 'y' 
            AND EV_EndDate >= '20120705T00:00:00'   --- notice the unambiguous
            AND EV_ContactEmail <> ''               --- datetime format
          GROUP BY EV_ContactEmail
        ) AS tmp
      ON tmp.EV_ID = e.EV_ID ;
于 2012-07-06T11:19:17.753 に答える
0

「内部結合」を「左外部結合」に変更してください:
SELECT DISTINCT MAX(EV_ID) As EV_ID, EV_ContactEmail, EV_CusName
FROM tblEvents ev
left outer join tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID
WHERE (
CUS_IsAdmin = 'y'
AND CUS_Live = 'y'
AND EV_Live = 'y'
AND EV_EndDate >= '2012/7/5 12:00:00 AM'
AND EV_ContactEmail <> ''
) GROUP BY EV_ContactEmail

于 2012-07-06T11:20:52.530 に答える
0

の代わりにdistinct、最初に並べ替えてEV_ContactEmail, EV_CusName, EV_ID descから、他のすべての列をグループ化できます

SELECT MAX(EV_ID) As EV_ID, EV_ContactEmail, EV_CusName
FROM 
(
   SELECT EV_ID As EV_ID, EV_ContactEmail, EV_CusName 
   FROM tblEvents ev 
   INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID 
   WHERE (     
      CUS_IsAdmin = 'y'     
      AND CUS_Live = 'y'      
      AND EV_Live = 'y'      
      AND EV_EndDate >= '2012/7/5 12:00:00 AM'     
      AND EV_ContactEmail <> ''     
   ) 
   ORDER BY EV_ContactEmail, EV_CusName, EV_ID DESC -- you can add title also here before ev_id
)
GROUP BY EV_ContactEmail, EV_CusName  -- if you need title in query, also add title here
于 2012-07-06T10:54:42.670 に答える