【问题标题】:Mysql -- Use a secondary subquery if and only if the first subquery returned emptyMysql——当且仅当第一个子查询返回空时才使用辅助子查询
【发布时间】:2011-05-10 03:06:36
【问题描述】:

给定两个子查询表 t1 和 t2,当且仅当 t1 返回空行时,我如何才能返回 t2?

编辑:添加示例

T1

SELECT * 
  FROM common_table 
 WHERE language_id = 1

T2

SELECT * 
  FROM common_table 
 WHERE language_id = 2

基本上我所做的是,如果 T1 返回空行,我希望它执行 T2 并返回这些行。现在,我完全知道我可以在 PHP 中执行此操作,但查询是子查询,我宁愿让 SQL(不是 PHP)代码处理它。

【问题讨论】:

  • SQL 不是编程语言。
  • 您可以发布您要修改的实际 SQL 语句吗?

标签: mysql sql


【解决方案1】:
Select ...
From common_table
Where language_id = 1
    Or  (
        language_id = 2
        And Not Exists  (
                        Select 1
                        From common_table
                        Where language_id = 1
                        )
        )

【讨论】:

    【解决方案2】:

    在 MSSQL 中我可以做类似的事情

    If EXISTS (SELECT * FROM common_table WHERE language_id = 1)
    BEGIN
        SELECT * FROM common_table WHERE language_id = 1
    END ELSE BEGIN
        SELECT * FROM common_table WHERE language_id = 2
    END
    

    在 mySQL 中应该相同或类似

    【讨论】:

    • 它不是 sql,它是 t-sql。
    • 该问题具体说明了mysql,但这在mysql中不起作用。很有趣,但不确定为什么它是公认的答案。
    【解决方案3】:

    我的 MySql 知识有点生疏,我认为这应该可行。

    SELECT * FROM common_table 
             WHERE language_id = 2 and 
                   0 = ( SELECT count(*) FROM common_table 
                                         WHERE language_id = 1
                       ) ;
    

    【讨论】:

    • +1 我认为改进可能是... WHERE (language_id = 1) OR (language_id = 2 AND NOT EXISTS (SELECT NULL FROM common_table WHERE language_id = 1))。在我的测试中,如果有的话,所有lang_id 1 记录,否则所有lang_id 2,并且 EXISTS 可能比 COUNT 更有效。
    【解决方案4】:
    SELECT * 
      FROM common_table 
     WHERE language_id = 1
    UNION
    SELECT * 
      FROM common_table 
     WHERE language_id = 2
           AND NOT EXISTS (
                           SELECT * 
                             FROM common_table AS T2 
                            WHERE T2.language_id = 1
                          );
    

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多