Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个表上的SQL查询-返回一个表中不带';在另一个列表中没有条目_Sql - Fatal编程技术网

两个表上的SQL查询-返回一个表中不带';在另一个列表中没有条目

两个表上的SQL查询-返回一个表中不带';在另一个列表中没有条目,sql,Sql,我有两个数据库表,Categories和SuperCategories,用于我正在研究的库存控制系统: 类别:ID_类别,CategoryName 超级类别:ID_超级类别、类别ID、超级类别ID 我正在将类别-子类别关系放入超级类别表中。我将所有类别都放入类别表中 以下是一个例子: Categories: ID_Category CategoryName 1 Box 2 Red Box 3 Blue B

我有两个数据库表,Categories和SuperCategories,用于我正在研究的库存控制系统:

类别:ID_类别,CategoryName

超级类别:ID_超级类别、类别ID、超级类别ID

我正在将类别-子类别关系放入超级类别表中。我将所有类别都放入类别表中

以下是一个例子:

Categories: ID_Category CategoryName 1 Box 2 Red Box 3 Blue Box 4 Blue Plastic Box 5 Can 6 Tin Can 类别: ID\u类别类别名称 1盒 2红色盒子 3蓝色盒子 4蓝色塑料盒 5罐 6罐 超级类别: ID\u超级类别ID超级类别ID 1 2 1 2 3 1 3 4 3 4 6 5 CategoryID和SuperCategoryID重新关联到Categories表中的主键ID_类别

我想要的是一个查询,它返回所有不是任何其他类别父级的类别名称:

红色方框
蓝色塑料盒
锡罐

这相当于查找在SuperCategoryID列(2、4和6)中未显示的ID_Category的所有值,但我在编写SQL时遇到了问题

我正在使用VB6查询Access 2000数据库

感谢您的帮助。谢谢


编辑:我对每个人的答案投了赞成票,这些答案给了我一些有用的东西。我接受了我认为最有启发性的答案。再次感谢你的帮助

不确定语法是否适用于Access,但类似这样的方法可以:

select CategoryName from Categories
where ID_Category not in (
    select SuperCategoryID 
    from SuperCategories 
)

仅包括那些不是超级目录的类别。简单的外部连接

select CategoryName from Categories LEFT OUTER JOIN
SuperCategories ON Categories.ID_Category =SuperCategories.SuperCategoryID
WHERE SuperCategories.SuperCategoryID is  null


我还建议您的命名标准可能需要一些改进。它们似乎到处都是,很难使用。

Mike Pone的回答很有效,因为他将“Categories”表与“SuperCategories”表连接为“左外连接”-这将获取“Categories”中的所有条目,并将“SuperCategories”中的列添加到链接存在的位置-链接不存在的位置(例如,在“超级类别”中没有条目的情况下),超级类别列将为空-这正是Mike的查询随后检查的内容

如果您将这样编写查询:

SELECT c.CategoryName, s.ID_Super 
FROM Categories c 
LEFT OUTER JOIN SuperCategories s ON c.ID_Category = s.SuperCategoryID
你会得到这样的结果:

CategoryName    ID_Super
Box               1
Box               2
Red Box           NULL
Blue Box          3
Blue Plastic Box  NULL
Can               4
Tin Can           NULL
因此,这基本上为您提供了答案-左侧外部联接上的ID_Super为NULL的所有行都是那些超级类别表中没有任何条目的行。全部清除?:-)


Marc

我总是像Marc_建议的那样采用外部连接方法。使用外部联接时会有很大的功率。通常情况下,我必须执行一个完整的外部联接来检查查询两侧的数据

您还应该看看ISNULL函数,如果您正在执行一个查询,其中数据可以位于表a或表B中,那么我将使用ISNULL函数从任一列返回一个值

这里有一个例子


 SELECT 
       isNull(a.[date_time],b.[date_time]) as [Time Stamp]
      ,isnull(a.[ip],b[ip]) as [Device Address]
      ,isnull(a.[total_messages],0) as [Local Messages]
      ,isnull(b.[total_messages],0) as [Remote Messages]
  FROM [Local_FW_Logs] a
FULL OUTER JOIN [Remote_FW_Logs] b 
on b.ip = a.ip

我有两个表
interface\u category
interface\u subcategory

接口\u子类别
包含
子类别ID、类别ID、名称(子类别名称)

Interface\u category
包含
CategoryID、名称(CategoryName)

现在我需要输出
CategoryID
和名称(子类别名称)

下面是我写的查询及其对我的作用

select ic.CategoryID, ic.Name CategoryName, ISC.SubCategoryID, ISC.Name SubCategoryName from Interface_Category IC
inner join Interface_SubCategory ISC
on ISC.CategoryID = ic.CategoryID
order by ic.CategoryID, isc.SubCategoryID

效率太低,无法使用子查询。直接使用外部联接以提高效率没有理由在子查询中应用“distinct”。对于类似于类别列表的东西,最多大约有100个条目(我假设),所需的两次表扫描将占用99.99%的执行成本,而且这更容易阅读,虽然比尔,我同意distinct。。将删除。谢谢!这是我第一次尝试SQL,所以我有很多东西要学。我指的是主键的ID_uu,BlahBlahID表示它是另一个表中的键。始终对建议开放…外部联接将获取联接左侧的所有内容(即来自类别的所有内容),并且仅获取与超级类别表匹配的记录。
CategoryName    ID_Super
Box               1
Box               2
Red Box           NULL
Blue Box          3
Blue Plastic Box  NULL
Can               4
Tin Can           NULL

 SELECT 
       isNull(a.[date_time],b.[date_time]) as [Time Stamp]
      ,isnull(a.[ip],b[ip]) as [Device Address]
      ,isnull(a.[total_messages],0) as [Local Messages]
      ,isnull(b.[total_messages],0) as [Remote Messages]
  FROM [Local_FW_Logs] a
FULL OUTER JOIN [Remote_FW_Logs] b 
on b.ip = a.ip
select ic.CategoryID, ic.Name CategoryName, ISC.SubCategoryID, ISC.Name SubCategoryName from Interface_Category IC
inner join Interface_SubCategory ISC
on ISC.CategoryID = ic.CategoryID
order by ic.CategoryID, isc.SubCategoryID