Как выполнить поиск по отношению «1 ко многим», когда критерии могут быть в любой таблице? - PullRequest
0 голосов
/ 12 ноября 2010

Я использую т-sql.У меня есть то, что я думал, будет легкий поиск.Между SalesPerson и TradeShow существует отношение 1-ко-многим.1 продавец мог бы побывать на многих выставках.Мне нужно иметь возможность искать на SalePerson.Я также должен иметь возможность искать на последней выставке, которую они посетили.Я думал, что смогу сделать простое объединение и группировку на их последней выставке, но я не могу отобразить город или штат.

SELECT     SalePersonID, FirstName, LastName, TradeShow.DateLastWent
FROM         SalesPerson INNER JOIN
(SELECT     SalePersonID, MAX(DateLastWent) AS DateLastWent
     FROM TradeShow 
 GROUP BY SalesPersonID) AS TradeShow ON SalesPerson.SalePersonID= TradeShow.SalePersonID

Это workds, но на выставке также есть город и штат.Мне нужно иметь возможность искать и отображать город и штат.Но если я включу их в подзапрос, я должен включить thm в статистическую функцию, и если я это сделаю, я получу неправильный город и штат.

Таблицы простые

SALEPERSONsalespersonID PK имя фамилия

TRADESHOW tradeshowID PK datelastwent город Штат salespersonID FK

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Перефразируйте это: вам нужен продавец, плюс информация с последнего шоу, на котором они были.

Select
  SalePersonID, 
  FirstName, 
  LastName, 
  TradeShow.DateLastWent,
  TradeShow.City,
  TradeShow.State
From
  SalesPerson
  Inner Join TradeShow 
    On SalesPerson.SalePersonID = TradeShow.SalePersonID
Where
  TradeShow.TradeShowID =
    (Select Top 1 Latest.TradeShowID
     From TradeShow As Latest
     Where SalesPerson.SalePersonID = Latest.SalePersonID
     Order By Latest.DateLastWent Desc)
0 голосов
/ 12 ноября 2010

Вы можете присоединиться к TradeShow дважды:

SELECT     SalePersonID, FirstName, LastName, TS1.DateLastWent,
  TS2.City, TS2.State 
FROM         SalesPerson INNER JOIN
 (SELECT     SalePersonID, MAX(DateLastWent) AS DateLastWent
 FROM TradeShow 
 GROUP BY SalesPersonID
 ) AS TS1 ON (SalesPerson.SalePersonID= TradeShow.SalePersonID)
INNER JOIN TradeShow TS2 ON 
 (TS2.SalePersonID = TS1.SalePersonID AND TS2.DateLastWent = TS1.DateLastWent)
WHERE TS2.City = 'CityName'
0 голосов
/ 12 ноября 2010

Вероятно, есть более элегантный способ решить эту проблему, но моя первая мысль - просто взять новейшую запись TradeShow, чтобы присоединиться к

SELECT SalePersonID, FirstName, LastName, TradeShow.DateLastWent 
  FROM SalesPerson 
       INNER JOIN (
                   SELECT *
                     FROM (
                           SELECT TradeShowId, DateLastWent, City, State, SalesPersonId
                             FROM TradeShow  
                         ORDER BY datelastwent DESC
                          )
                    WHERE ROWNUM <= 1
                  ) ON SalesPerson.SalesPersonId = TradeShow.SalesPersonId 

Редактировать

Упс ... слишком много играл с Oracle

ROW_NUMBER() OVER(order by date) or SELECT TOP X

было бы способом SQL Server для этого ... не запускать экземпляр SQL-Server, но вполне уверен, что синтаксис в конечном итоге будет выглядеть как

SELECT SalePersonID, FirstName, LastName, TradeShow.DateLastWent  
  FROM SalesPerson  
       INNER JOIN ( 
                   SELECT TradeShowId, DateLastWent, City, State, SalesPersonId, ROW_NUMBER() OVER(PARTITION BY TradeShow.SalesPersonId ORDER BY DateLastWent DESC) RowNumber
                     FROM TradeShow   
                  ) ON SalesPerson.SalesPersonId = TradeShow.SalesPersonId AN TradeShow.RowNumber = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...