我已经使用SQL大约6个月了。我非常擅长从表中提取信息并对其进行排序,但是当我想比较或交叉引用多个表时,我会变得更加不稳定。我的意思是它应该是一个简单的答案。我猜测我没有考虑正确的where子句,并且可能需要SELECT DISTINCT
来表示其中一个表。
我将尝试尽可能彻底地解释这个问题而不使用特定的名称。我尝试检查的一般情况是这样的。我有一个工具箱,里面有各种各样的工具。我还有一个我可能需要执行的任务列表,以及我可能正在执行这些任务以及使用这些工具的问题列表。我有一个工具表,其中包含用于描述工具的列,工具的唯一ID以及工具的分类(电动工具,手动工具,建筑材料等)。另一个表用于不同的任务。列是任务描述和唯一ID。首先,我想编写一个查询,可以向我展示任何可能被标记为电动工具的工具,但不能用于任何特定任务。
这是我的代码示例。它有更多的表,因为实际上数据分布在更多的表中,而不仅仅是3,但概念应该保持不变。
SELECT Tools.ToolDescription,
Tools.ToolsID,
Tools.Classification,
Tasks.TaskDescription,
Tasks.TaskID,
Problems.ProblemDescription,
Problems.ProblemID
FROM [Lots of inner joins that aren't relevant without actual tables]
WHERE Tools.Classification = 'Power Tools'
答案 0 :(得分:1)
如果您希望将电动工具分配给任何任务,为什么结果集中有“任务”字段?
SELECT Tools.ToolDescription,
Tools.ToolsID,
Tools.Classification
FROM Tools
WHERE Tools.Classification = 'Power Tools';
这是一个只返回所有电动工具的简单查询。但简单是一个很好的起点。
现在您想要过滤掉分配给任务的所有电动工具。这在SQL中很容易做到。外部联接允许您仅保留那些不匹配的工具。您没有显示相关表格,所以我们只是说任务表包含任务中使用的每个工具的ToolsID字段。
SELECT Tools.ToolDescription,
Tools.ToolsID,
Tools.Classification
FROM Tools
left join Tasks
on Tasks.ToolID = Tools.ToolID
WHERE Tools.Classification = 'Power Tools'
and Tasks.ToolID is null;
答案 1 :(得分:0)
即使从表格如何相互关联的问题中不清楚,但听起来您需要使用NOT EXISTS
构造。例如:
WHERE Tools.Classification = 'Power Tools'
AND NOT EXISTS
(SELECT 1 FROM Tasks t WHERE t.<column_to_join_on> = Tools.ToolsID)