【问题标题】:SQL - Return no row if JOIN worksSQL - 如果 JOIN 有效,则不返回任何行
【发布时间】:2017-11-24 02:50:58
【问题描述】:

我有一个带有 INNER JOIN 的典型 SQL 语句

SELECT * from t1
INNER JOIN t2 ON t2.a = t1.a

我的要求是,如果连接返回至少 1 行,则结果集应该为空。如果连接返回 0 行,那么我想看看结果。

首先,我想到了使用NOT EXISTS(或LEFT JOIN + IS NULL),但这在我的情况下不起作用,因为如果在另一个表中找不到任何内容,我会返回结果我需要的。如果另一个表中有匹配项,我什么都不想要返回,如果另一个表中没有匹配项,我想返回一些东西。

【问题讨论】:

  • 如果连接返回 0 行,那么您要显示哪些结果?不是我的反对意见,但你的问题没有多大意义。
  • 你的意思是left outer join
  • 您的问题有点矛盾,但我假设您只想在结果返回 0 行时做某事? 1. 声明一个变量(例如 joinRowCount) 2. 将 select 的计数放在变量中 3. 如果你的变量 = 0 --> do stuff Else --> don't do stuff 这是你想要的吗?

标签: sql tsql join not-exists


【解决方案1】:

你需要这样做:

SELECT * from t1 LEFT JOIN t2 ON t2.a = t1.a where t2.a is null

希望对你有帮助

【讨论】:

  • select 1 as a,2 as b into #temp1 insert into #temp1 select 2 as a,3 as b select 3 as a,2 as b into #temp2 insert into #temp2 select 4 as a ,3 as b select * from #temp1 t1, #temp2 t2 where 0 = (SELECT count(*) from #temp1 t1 INNER JOIN #temp2 t2 ON t2.a = t1.a )
【解决方案2】:

据我所知(如果我错了,请纠正),当 join 不返回任何行时,您需要表 t1 的所有“a”列,而当 join 返回至少 1 行时,您需要 null。

oracle 中的以下查询将导致:

1) 如果连接至少返回一行,则返回 null

2) 如果连接不返回任何行,则表 t1 的列“a”的连接值 注意:根据版本,可以使用 listagg 代替 wm_concat。

选择 (案子 当 join_count > 0 时为空

else (select to_char(wm_concat(a)) from t1)

结束) “结果”

来自 (select count(col1) as 'join_count' from (select t1.a as 'col1' from t1 join t2 on t1.a=t2.a));

【讨论】:

    【解决方案3】:

    您可以只使用 CASE 和 EXISTS 语句:

    SELECT CASE WHEN EXISTS (SELECT * FROM t1 INNER JOIN t2 ON t2.a = t1.a)
           THEN 0
           ELSE 1 
           END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多