gpt4 book ai didi

sql - 检查父行是否有任何子行的简单 SQL

转载 作者:行者123 更新时间:2023-12-04 22:00:14 25 4
gpt4 key购买 nike

我显示了一个带有父数据的网格,如果存在相关的子行,则需要显示图标。我的数据库在 SQL Server 2008 中。让我简化一下,我有以下两个表 -

Order (PK : ID)

File (PK: FileID, FK: OrderID)



Order可以有零个或多个与之相关的文件。 File表有一列 OrderID其中包含对 Order 的 FK 引用.现在,我正在显示一个网格,其中列出了所有 Orders我想显示一个图标图像,指示是否 Order是否有任何子行(文件)。

这是我尝试过的一种棘手的方法,但不确定它的效率/可扩展性如何-
SELECT DISTINCT o.ID, o.OrderNum, ...
,(CASE f.ID/f.ID WHEN 1 THEN 1 ELSE 0 END) as FilesExist
...
FROM Order AS o LEFT OUTER JOIN dbo.FileHeader as f ON f.OrderID = o.ID
CASE语句似乎按要求完美运行。如果存在一个或多个文件,它将返回 1,否则返回 0。如果存在多个文件行,那么它将尝试重复 Order我添加了 DISTINCT 并且我没有选择 f.ID 的行但是 f.ID/f.ID这将是 1 (它存在)和 0 为空(不存在)。我了解到 JOIN 比内联更好 SELECT COUNT(*)声明。

我已经测试过并且它有效,但我需要专家的意见并且需要确保这是最好的方法。这是一个非常简单的例子,但我的 SELECT语句很复杂,因为有很多查找,而且它的获取成本很高,所以我需要确保它的可扩展性。

谢谢你。

编辑 #1:
总而言之 - 要么是 内部选择 带有 COUNT(*)
SELECT c.ClaimNo,(SELECT COUNT(*) FROM dbo.FileHeader AS f WHERE f.ClaimID = c.ID ) AS FilesHExist
FROM dbo.Claim AS c

Internal Select

左外连接方法 我已经提到过。
SELECT DISTINCT c.ClaimNo, (CASE fh.ID / fh.ID WHEN 1 THEN 1 ELSE 0 END) AS FilesHExist               
FROM dbo.Claim AS c LEFT OUTER JOIN dbo.FileHeader AS fh ON fh.ClaimID = c.ID

My JOIN approach

附上两张查询执行计划的图片。请推荐哪个更好。

最佳答案

用于选择 几行 ,这应该是最快的:

SELECT o.ID
,o.OrderNum
,CASE WHEN EXISTS (SELECT * FROM dbo.FileHeader f WHERE f.OrderID = o.ID)
THEN 1
ELSE 0
END AS FilesHExist
FROM Order o;

对于包含 的 SELECT大份 dbo.FileHeader这应该表现更好:
SELECT o.ID
,o.OrderNum
,CASE WHEN f.OrderID IS NULL THEN 0 ELSE 1 END AS FilesHExist
FROM Order o
LEFT JOIN
(SELECT OrderID FROM dbo.FileHeader GROUP BY OrderID) f ON f.OrderID = o.ID

组团应该更便宜 OrderID先左后加入。最后不需要 DISTINCT。

从不 用:
(CASE f.ID/f.ID WHEN 1 THEN 1 ELSE 0 END)

它使您可以除以零异常。用检查 NULL 替换它如上所示。

关于sql - 检查父行是否有任何子行的简单 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8018757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com