Sql 当仅有两行不同时,是否可以将两条select语句转换为一条而不使用UNION ALL/UNION?

Sql 当仅有两行不同时,是否可以将两条select语句转换为一条而不使用UNION ALL/UNION?,sql,Sql,如果有2个选择查询完全相同,但唯一的区别是一个查询有3个内部联接,而另一个查询有2个内部联接,其中一个查询只有1个附加的WHERE条件,当您想要从两个语句中得到结果时,是否可以将它们组合成一个SELECT语句而不使用UNION ALL/UNION 示例查询1: SELECT a.id, a.name, b.type FROM TableA a INNER JOIN TableB b on a.id = b.a_id WHERE a.lang < '2

如果有2个
选择
查询完全相同,但唯一的区别是一个查询有
3个内部联接
,而另一个查询有
2个内部联接
,其中一个查询只有1个附加的
WHERE
条件,当您想要从两个语句中得到结果时,是否可以将它们组合成一个
SELECT
语句而不使用
UNION ALL/UNION

示例查询1:

    SELECT a.id, a.name, b.type
    FROM TableA a
    INNER JOIN TableB b on a.id = b.a_id
    WHERE
    a.lang < '20'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
哪里
a、 郎<'20'
示例查询2a:

    SELECT a.id, a.name, b.type
    FROM TableA a
    INNER JOIN TableB b on a.id = b.a_id
    INNER JOIN TableC c on a.id = c.a_id
    WHERE
    a.id < '20'
    c.lang = 'French'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
a.id=c.a\u id上的内部联接表c
哪里
a、 id<'20'
c、 lang=‘法语’
如果查询有3个不同点呢

示例查询2b:

    SELECT a.id, a.name, b.type
    FROM TableA a
    INNER JOIN TableB b on a.id = b.a_id
    INNER JOIN TableC c on a.id = c.a_id
    WHERE
    a.id < '20'
    a.year = '2020'
    c.lang = 'French'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
a.id=c.a\u id上的内部联接表c
哪里
a、 id<'20'
a、 年份='2020'
c、 lang=‘法语’
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
左连接a.id=c.a_id和c.lang='French'上的表c
哪里
a、 id<'20'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
左连接a.id=c.a_id和c.lang='French'上的表c
哪里
a、 id<'20'

我相信两个查询之间唯一的不同是第一个查询不需要
c.lang='French'
,但是第二个查询需要。。。在这个例子中,第一个查询不是第二个查询的超集吗,只有较少的重复项

如果这只是一个简化的示例,那么下面的查询应该处理这种情况


编辑:我刚刚注意到你文章中的第三个查询示例。。。基本上,将第二个查询限制在第一个查询之外的任何内容都需要添加到
LEFT JOIN
子句中,而不是添加到
WHERE
子句中

SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
LEFT JOIN TableC c on a.id = c.a_id AND c.lang = 'French' AND a.year = '2020'
WHERE a.id < '20'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
在a.id=c.a_id和c.lang='French'和a.year='2020'上左键连接表c
其中a.id<'20'

我相信两个查询之间唯一的不同是第一个查询不需要
c.lang='French'
,但是第二个查询需要。。。在这个例子中,第一个查询不是第二个查询的超集吗,只有较少的重复项

如果这只是一个简化的示例,那么下面的查询应该处理这种情况


编辑:我刚刚注意到你文章中的第三个查询示例。。。基本上,将第二个查询限制在第一个查询之外的任何内容都需要添加到
LEFT JOIN
子句中,而不是添加到
WHERE
子句中

SELECT a.id, a.name, b.type
FROM TableA a
INNER JOIN TableB b on a.id = b.a_id
LEFT JOIN TableC c on a.id = c.a_id AND c.lang = 'French' AND a.year = '2020'
WHERE a.id < '20'
选择a.id、a.name、b.type
从表a
a.id=b.a\u id上的内部联接表b
在a.id=c.a_id和c.lang='French'和a.year='2020'上左键连接表c
其中a.id<'20'

我不确定是否理解您的示例;后者是前者的子集。您希望返回哪一个?我希望结果与我使用关键字UNION组合示例查询1和2a或示例查询1和2B时的结果相同。我不确定我是否理解您的示例;后者是前者的子集。您希望返回哪个?我希望结果与使用关键字UNION组合示例查询1和2a或示例查询1和2B时的结果相同。第一个查询在某种程度上是一个超集。但查询1显示3,伦敦,岛;5号,都柏林岛;和奥斯陆,内陆,而查询2只显示4,巴黎,内陆。我只是好奇是否可以在不使用UNION或UNION all的情况下检索所有四个城市的结果。使用
左连接的查询是否显示所需的结果?不太可能,最终结果中缺少几行。第一个查询有点像超集。但查询1显示3,伦敦,岛;5号,都柏林岛;和奥斯陆,内陆,而查询2只显示4,巴黎,内陆。我只是好奇是否可以在不使用UNION或UNION all的情况下检索结果中的所有四个城市。使用
左连接的查询是否显示所需的结果?不太可能,最终结果中缺少几行