指示存在对应行的SQL查询

指示存在对应行的SQL查询,sql,Sql,假设表A和B,我如何编写一个查询,返回A的所有列和一个指示B中存在对应子行的标志 例如: col1_a | col2_a |……| hasrowinb假设b是子行,如果b.a_id=a.id,则这将起作用 调整联接以符合您对子对象的定义 SELECT a.*, CASE WHEN b.id IS NULL THEN 0 ELSE 1 END AS hasrowinb FROM a LEFT JOIN b ON a.id = b.a_id 假设b是一个子行,如果b.a_id=a.id,那么这将起

假设表A和B,我如何编写一个查询,返回A的所有列和一个指示B中存在对应子行的标志

例如:


col1_a | col2_a |……| hasrowinb

假设b是子行,如果b.a_id=a.id,则这将起作用

调整联接以符合您对子对象的定义

SELECT a.*, CASE WHEN b.id IS NULL THEN 0 ELSE 1 END AS hasrowinb
FROM a
LEFT JOIN b ON a.id = b.a_id

假设b是一个子行,如果b.a_id=a.id,那么这将起作用

调整联接以符合您对子对象的定义

SELECT a.*, CASE WHEN b.id IS NULL THEN 0 ELSE 1 END AS hasrowinb
FROM a
LEFT JOIN b ON a.id = b.a_id

这将确保不会为表A为表B的每个匹配记录创建重复项

SELECT a.*, b.HasRowInB
FROM TableA a 
LEFT OUTER JOIN (
    SELECT a.id, CASE COUNT(b.id) WHEN 0 THEN 0 ELSE 1 END as HasRowInB
    FROM TableA a
    LEFT JOIN TableB b on a.id = b.a_id
    GROUP BY a.id
) b on a.id = b.id

这将确保不会为表A为表B的每个匹配记录创建重复项

SELECT a.*, b.HasRowInB
FROM TableA a 
LEFT OUTER JOIN (
    SELECT a.id, CASE COUNT(b.id) WHEN 0 THEN 0 ELSE 1 END as HasRowInB
    FROM TableA a
    LEFT JOIN TableB b on a.id = b.a_id
    GROUP BY a.id
) b on a.id = b.id

也许以下是执行查询的“最简单”方法,同时确保没有重复项:

select a.*,
       (case when 0 = (select count(*) from b where b.aid = a.aid)
             then 'N'
             else 'Y'
        end) as hasRowInB
from a

也许以下是执行查询的“最简单”方法,同时确保没有重复项:

select a.*,
       (case when 0 = (select count(*) from b where b.aid = a.aid)
             then 'N'
             else 'Y'
        end) as hasRowInB
from a


你能详细说明一下“对应的子行”吗?它是一个具有相同主键、具有所有相同元素、具有特定的相同元素集的行,还是什么?在什么条件下,
hasrowinb
为真?@ewok-表B将fk转换为a,仅此而已。谢谢大家!还有一个问题,关于什么性能更好,子查询还是联接,大家是否有共识?这在很大程度上取决于您使用的数据库引擎。最新版本的SQL Server至少有一个相当好的查询分析器,它通常可以选择任何一种方式的最佳查询计划,但我不知道其他引擎。您能详细介绍一下“对应的子行”吗?它是一个具有相同主键、具有所有相同元素、具有特定的相同元素集的行,还是什么?在什么条件下,
hasrowinb
为真?@ewok-表B将fk转换为a,仅此而已。谢谢大家!还有一个问题,关于什么性能更好,子查询还是联接,大家是否有共识?这在很大程度上取决于您使用的数据库引擎。最新版本的SQL Server至少有一个相当好的查询分析器,通常可以选择任何一种方式的最佳查询计划,但我不知道其他引擎的情况。您必须坐下来想一想哪一个更快。可能更多地取决于数据集看起来像什么。根据我的经验,确定更快的唯一方法是基准测试。硬件配置等会产生巨大的影响。你必须坐下来想一想哪一个更快。可能更多地取决于数据集看起来像什么。根据我的经验,确定更快的唯一方法是基准测试。硬件配置等会产生巨大的影响。与连接相比,这不是性能差吗。(每行的子查询。)我想一些引擎会对其进行优化?@Hogan-我正在使用Postgres,当我尝试解释分析时,我发现总时间在本页的所有解决方案上似乎波动很大。我不知道该如何评估成本(戈登的方法范围相当广,而你的方法范围相当小!)@rebnoob——这正是我的观点,在戈登的方法中,a中的每一行都会从b中选择一个,所以你选择O(ab)。在我的例子中,它有两个选择,所以你得到O(a+b)。我的缺点是,如果关系不是1对1,那么一个表可以有多行。正如JTC所指出的,这可以用一种不同的方法来解决。谢谢你对霍根的解释。尽管我很喜欢Gordon的方法(它很容易阅读,而且我有十几个类似的标志,使复制和粘贴变得很容易!)我想,我还是选择你/Curtis的解决方案。我还不能完全理解JTC的解决方案!再次感谢大家。顺便说一句,更改“已接受的答案”是否为时已晚?与加入相比,这不会有较差的性能。(每行的子查询。)我想一些引擎会对其进行优化?@Hogan-我正在使用Postgres,当我尝试解释分析时,我发现总时间在本页的所有解决方案上似乎波动很大。我不知道该如何评估成本(戈登的方法范围相当广,而你的方法范围相当小!)@rebnoob——这正是我的观点,在戈登的方法中,a中的每一行都会从b中选择一个,所以你选择O(ab)。在我的例子中,它有两个选择,所以你得到O(a+b)。我的缺点是,如果关系不是1对1,那么一个表可以有多行。正如JTC所指出的,这可以用一种不同的方法来解决。谢谢你对霍根的解释。尽管我很喜欢Gordon的方法(它很容易阅读,而且我有十几个类似的标志,使复制和粘贴变得很容易!)我想,我还是选择你/Curtis的解决方案。我还不能完全理解JTC的解决方案!再次感谢大家。顺便说一句,改变“被接受的答案”是否为时已晚?