两个表上的SQL查询-返回一个表中不带';在另一个列表中没有条目
我有两个数据库表,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_类别 我想要的是一个查询,它返回所有不是任何其他类别父级的类别名称: 红色方框两个表上的SQL查询-返回一个表中不带';在另一个列表中没有条目,sql,Sql,我有两个数据库表,Categories和SuperCategories,用于我正在研究的库存控制系统: 类别:ID_类别,CategoryName 超级类别:ID_超级类别、类别ID、超级类别ID 我正在将类别-子类别关系放入超级类别表中。我将所有类别都放入类别表中 以下是一个例子: Categories: ID_Category CategoryName 1 Box 2 Red Box 3 Blue B
蓝色塑料盒
锡罐 这相当于查找在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