我有2张桌子 - 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
)
提前致谢。
答案 0 :(得分:0)
考虑从B
中选择:
SELECT ...
FROM B
LEFT JOIN E ...
通过执行LEFT JOIN
,您将从B
获得所有行,并从E
获得匹配行。请记住,您将获得多个行B
值,因为它们将存在于E
中的每个匹配行。数据可能如下所示:
B.Field1 B.Field2 E.Field1
============================================
1 A NULL
2 B Value 1
2 B Value 2
E.Field1
为NULL
的行表示E
中B
的无匹配行。相比之下,请注意B
字段似乎重复。在某种程度上他们是。但那是因为E
有多个匹配B
。
您现在可以轻松地将这一点抽象出来,即使只是在精神上,您可以对可以对子查询进行分组和不同操作的地方进行抽象,以确保您只从E
得到您想要的内容。也许你做这样的内部查询:
SELECT ...
FROM E
WHERE E.field IN (
SELECT e.field
FROM B
LEFT JOIN E ...
GROUP BY ....
)
这只是一个例子。