交叉引用查询

时间:2015-03-16 20:39:40

标签: sql sql-server sql-server-2008

我已经使用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'

2 个答案:

答案 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)