Sql 从提供表E的表B中选择-从B中拉取E中存在和不存在的记录

Sql 从提供表E的表B中选择-从B中拉取E中存在和不存在的记录,sql,sql-server,Sql,Sql Server,我有两个表-E和B,它们通过列Breaktime链接。表B包含所有可用时间,并将其输入表E。如果表E未使用某个时间,则该时间的记录不再显示在表E中。我需要从E中选择*以获得已使用的时间,但也需要未使用的时间,这些时间不在E中,但在B中,并将其标记为“未使用”。查询有很多参数,下面是简短的版本: SELECT e.BreakDate, b.Breaktime, (CASE WHEN...) to separate the times into categories FRO

我有两个表-E和B,它们通过列Breaktime链接。表B包含所有可用时间,并将其输入表E。如果表E未使用某个时间,则该时间的记录不再显示在表E中。我需要从E中选择*以获得已使用的时间,但也需要未使用的时间,这些时间不在E中,但在B中,并将其标记为“未使用”。查询有很多参数,下面是简短的版本:

SELECT 
    e.BreakDate, b.Breaktime,
        (CASE WHEN...) to separate the times into categories
FROM
    event e, break b, *several more tables*
WHERE
    e.breakdate = b.breakdate
and e.breaktime = b.breaktime
and *linking additional tables*
我试过使用

WHERE NOT EXISTS (SELECT e.breaktime FROM E,B WHERE e.breaktime = b.breaktime) 
IF EXISTS (
    SELECT e.breaktime
    FROM E,B
    WHERE e.breaktime = b.breaktime
) THEN (
    SELECT b.breaktime
    FROM E,B
    where NOT EXISTS (
        SELECT *
        FROM E,B
        WHERE e.breaktime = b.breaktime
    )
我试着用

WHERE NOT EXISTS (SELECT e.breaktime FROM E,B WHERE e.breaktime = b.breaktime) 
IF EXISTS (
    SELECT e.breaktime
    FROM E,B
    WHERE e.breaktime = b.breaktime
) THEN (
    SELECT b.breaktime
    FROM E,B
    where NOT EXISTS (
        SELECT *
        FROM E,B
        WHERE e.breaktime = b.breaktime
    )

提前感谢。

请考虑从
B
中进行如下选择:

SELECT ...
FROM B
    LEFT JOIN E ...
B.Field1          B.Field2          E.Field1
============================================
1                 A                 NULL
2                 B                 Value 1
2                 B                 Value 2
SELECT ...
FROM E
WHERE E.field IN (
    SELECT e.field
    FROM B
        LEFT JOIN E ...
    GROUP BY ....
)
通过执行
左连接
,您将从
B
获得所有行,并从
E
获得匹配行。请记住,您将获得多行
B
值,因为它们将存在于
E
中的每个匹配行中。数据可能如下所示:

SELECT ...
FROM B
    LEFT JOIN E ...
B.Field1          B.Field2          E.Field1
============================================
1                 A                 NULL
2                 B                 Value 1
2                 B                 Value 2
SELECT ...
FROM E
WHERE E.field IN (
    SELECT e.field
    FROM B
        LEFT JOIN E ...
    GROUP BY ....
)
E.Field1
NULL
的行表示
E
中没有与该
B
匹配的行。相比之下,请注意
B
字段似乎是重复的。在某种程度上,他们是。但这是因为对于
B
,有多个匹配
E

现在,您可以很容易地将其抽象出来,即使只是在思想上,也可以对子查询进行一些分组和不同的操作,以确保您只从
E
中得到您想要的。也许您可以进行如下的内部查询:

SELECT ...
FROM B
    LEFT JOIN E ...
B.Field1          B.Field2          E.Field1
============================================
1                 A                 NULL
2                 B                 Value 1
2                 B                 Value 2
SELECT ...
FROM E
WHERE E.field IN (
    SELECT e.field
    FROM B
        LEFT JOIN E ...
    GROUP BY ....
)

这只是一个例子。

非常感谢您的帮助。稍微调整了一下,但奏效了@米歇尔·莱尔斯顿,我很高兴能帮上忙!