1

我有一张这样的桌子:

NAME, SURNAME, TIME_SESSION

John, White, Morning
John, White, Evening
Alexander, Black, Morning
Carl, Yellow, Morning
Carl, Yellow, Afternoon
James, Red, Morning
James, Red, Evening

我必须从该表中提取 time_session = 'Morning' 的所有元素,但不提取也具有 time_session='Evening' 或 time_session = 'Afternoon' 的记录。结果必须在此示例中:

Alexander, Black, Morning.

欢迎任何建议。

4

3 回答 3

3

对同一个表进行左连接,并检查这些是否匹配:

select NAME, SURNAME, TIME_SESSION
from TheTable t1
left join TheTable t2 on t2.NAME = t1.NAME and t2.TIME_SESSION = 'Evening'
left join TheTable t3 on t3.NAME = t1.NAME and t3.TIME_SESSION = 'Afternoon'
where t1.TIME_SESSION = 'Morning' and t2.NAME is null and t3.NAME is null
于 2012-04-23T09:26:48.593 回答
3

或者(与 Guffa 的回复不同的方法),您可以使用单个查询IF EXISTS()

SELECT Name, Surname, Time_Session
FROM dbo.YourTable t1
WHERE t1.Time_Session = 'Morning'
AND NOT EXISTS (SELECT * FROM dbo.YourTable t2 
                WHERE t1.NAME = t2.Name AND t1.Surname = t2.Surname 
                  AND t2.Time_Session IN ('Afternoon', 'Evening'))
于 2012-04-23T09:30:17.077 回答
1

如果您正在寻找拥有一个而不是一个或多个其他人的人..

SELECT * 
FROM myTable AS t
WHERE 
    TIME_SESSION = 'Morning'
    AND NOT EXISTS (
        SELECT * FROM myTable AS s
        WHERE 
            s.NAME = t.NAME
            AND s.SURNAME = t.SURNAME
            AND s.TIME_SESSION IN ('Afternoon')
        )

或者,如果您正在寻找只有一个条目的人

SELECT
    NAME, SURNAME
FROM 
    myTable 
GROUP BY 
    NAME, SURNAME
HAVING COUNT(*) = 1

然后您可以加入:

SELECT 
    t.*
FROM
    myTable AS t
    INNER JOIN (
            SELECT
                NAME, SURNAME
            FROM 
                myTable 
            GROUP BY 
                NAME, SURNAME
            HAVING COUNT(*) = 1
    ) AS l ON l.NAME = t.NAME AND l.SURNAME=t.SURNAME
于 2012-04-23T09:39:30.807 回答