【问题标题】:SQL - Select only when the condition matches [closed]SQL - 仅在条件匹配时选择 [关闭]
【发布时间】:2013-04-08 16:29:53
【问题描述】:

我有一张如下表。

ID   NAME
1    JOHN
2    JANE
3    JACK

在简单的 select 语句中,如何从表中查询 JOHN 和 JANE?

条件是:

我。结果必须返回 JOHN 和 JANE。

二。如果从表中删除了 JOHN 或 JANE,它将只返回空结果。

【问题讨论】:

  • 这看起来有点像家庭作业
  • -1 没有证据表明您已经尝试过什么,遇到了什么问题等。提出家庭作业问题没问题,但至少在要求您的员工做之前自己尝试一下给你。
  • 请表现出一些努力...你尝试了什么?
  • 你为什么用OraclePostgresqlMySQL标记。你用的是哪一个?
  • 还有什么是明显任意禁止 GROUP BY 或自我加入的原因,因为这些几乎是实现您想要的最简单的方法。请提供现实世界的理由,否则这只是“代码高尔夫”,因此是题外话。

标签: mysql sql oracle postgresql select


【解决方案1】:

您可以使用GROUP BY/HAVING 来确保有 2 个匹配项:

SELECT  Name
FROM    T
WHERE   Name IN ('JOHN', 'JANE')
AND     EXISTS
        (   SELECT  1
            FROM    T
            WHERE   Name IN ('JOHN', 'JANE')
            HAVING  COUNT(DISTINCT Name) = 2
        );

或者您可以使用自联接:

SELECT  a.Name
FROM    T a
        INNER JOIN T b
            ON a.Name != b.Name
WHERE   a.Name IN ('JOHN', 'JANE')
AND     b.Name IN ('JOHN', 'JANE');

Examples on SQL Fiddle (MySQL)

Examples on SQL Fiddle (Oracle)

Examples on SQL Fiddle (Postgresql)

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT 
      GROUP_CONCAT( `NAME` ) as names
    FROM `TABLE`
    WHERE 1
       AND NAME IN ('JOHN','JANE')
    HAVING names= 'JOHN,JANE'
    

    【讨论】:

      【解决方案3】:
      1. 创建函数JohnAndJaneBothExist()

      2.

      SELECT * FROM TABLENAME 
      WHERE
        JohnAndJaneBothExist and
        Name In ('John', 'Jane')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        • 2016-10-23
        • 1970-01-01
        • 2021-03-04
        相关资源
        最近更新 更多