簡體   English   中英

我想通過SQL根據另一個列從兩個表中選擇兩個不同的列

[英]I want to select two different columns from two tables based on another column by SQL

我真的陷入了這個問題:我有一個來自Oracle 10g XE數據庫的兩個表。 我被要求給出比賽中最快的男女運動員的FName和LName。 將給出eventID。 就像有人在詢問事件ID一樣,男性和女性的頭名FName和LName將分別給出。

我應該指出,每位運動員都有獨特的表現記錄。 感謝您的提醒!

這是兩個表。 我整夜都在上面。

運動員

╔═════════════════════════════════════════╦══╦══╗
║ athleteID* FName    LName    Sex   Club ║  ║  ║
╠═════════════════════════════════════════╬══╬══╣
║ 1034       Gabriel  Castillo M     5011 ║  ║  ║
║ 1094       Stewart  Mitchell M     5014 ║  ║  ║
║ 1161       Rickey   McDaniel M     5014 ║  ║  ║
║ 1285       Marilyn  Little   F          ║  ║  ║
║ 1328       Bernard  Lamb     M     5014 ║  ║  ║
║                                         ║  ║  ║
╚═════════════════════════════════════════╩══╩══╝

PARTICIPATION_IND

╔═════════════════════════════════════════════╦══╦══╗
║ athleteID* eventID* Performance_in _Minutes ║  ║  ║
╠═════════════════════════════════════════════╬══╬══╣
║ 1094       13       18                      ║  ║  ║
║ 1523       13       17                      ║  ║  ║
║ 1740       13                               ║  ║  ║
║ 1285       13       21                      ║  ║  ║
║ 1439       13       25                      ║  ║  ║
╚═════════════════════════════════════════════╩══╩══╝
SELECT * FROM (
    SELECT 
        a.FName
        , a.LName 
        FROM ATHLETE a
    JOIN PARTICIPATION_IND p 
    ON a.athleteID = p.athleteID
    WHERE a.Sex = 'M'
    AND p.eventID = 13
    ORDER BY p.Performance_in_Minutes
)
WHERE ROWNUM = 1
UNION
SELECT * FROM
    SELECT (
        a.FName
        , a.LName 
    FROM ATHLETE a
    JOIN PARTICIPATION_IND p 
    ON a.athleteID = p.athleteID
    WHERE a.Sex = 'F'
    AND p.eventID = 13
    ORDER BY p.Performance_in_Minutes
)
WHERE ROWNUM = 1

干得好

Select A.FName, A.LName 
       from Athelete A
Join   Participation_IND P
       on A.AtheleteID= p.AtheleID 
And
P.Performance_in_Minutes >=(Select max (performace_in_minutes) from Participation_IND)

謝謝

這是一種方法:

SELECT a.FName
     , a.LName
     , a.sex
     , p.eventID
     , p.performance_in_minutes
  FROM ( SELECT i.eventID, g.sex, MIN(i.performance_in_minutes) AS fastest_pim
           FROM athlete g
           JOIN participation_ind i
             ON i.athleteID = g.athleteID
          WHERE i.eventID IN (13)            -- supply eventID here
          GROUP BY i.eventID, g.sex
       ) f
  JOIN participation_ind p
    ON p.eventID = f.eventID
   AND p.performance_in_minutes = f.fastest_pim
  JOIN athlete a
    ON a.athleteID = p.athleteID
   AND a.sex = f.sex

別名為f的內聯視圖為每​​個eventID獲得最快的時間,對於運動者表中的每個“性別”最多為一個。

我們使用JOIN操作從具有相同的eventID和performance_in_minutes的participation_ind中提取行,並且使用另一個JOIN操作從運動員中獲取匹配的行。 (請注意,我們需要在“性別”列上包括加入謂詞,因此我們不會無意間拉出具有匹配的“分鍾”值和性別不匹配的行。)

注意:如果有兩個(或更多)相同性別的運動員在特定事件中具有匹配的“最快時間”,則查詢將拉出所有匹配的行; 該查詢不會為每個事件區分一個“最快”,而是僅區分給定事件的“最快”時間的運動員。

SELECT列表中的“額外”列可以省略/刪除。 這些不是必需的。 僅包括它們以幫助調試。

SELECT a.FName, a.LName
FROM ATHLETE a
WHERE
a.athleteID IN (
  SELECT mp.athleteID
  FROM PARTICIPATION_IND mp
  INNER JOIN ATHLETE ma
    ON mp.athleteID = ma.athleteID
  WHERE 
    mp.eventID = 13 AND
    ma.Sex = 'M'
  HAVING MAX(mp.Performance_in_minutes)

  UNION

  SELECT fp.athleteID
  FROM PARTICIPATION_IND fp
  INNER JOIN ATHLETE fa
    ON fp.athleteID = fa.athleteID
  WHERE 
    fp.eventID = 13 AND
    fa.Sex = 'F'
  HAVING MAX(fp.Performance_in_minutes)
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM