【问题标题】:How do I do SELECT on multiple colums(ex. 2)?如何在多个列上执行 SELECT(例如 2)?
【发布时间】:2015-06-07 08:55:53
【问题描述】:
SELECT DName
FROM drugs
WHERE DID IN 
(
    SELECT DID,SID
    FROM transactions
    GROUP BY TotalCost
    HAVING SID = 1 AND TotalCost > 100
)

在括号内进行这样的查询会给我一个包含 2 列的结果,我需要从其中一个列中选择结果。为了在 HAVING 子句中使用 SID,我需要将它包含在括号内的 SELECT 运算符中,这就是为什么我得到 2 列的原因。

【问题讨论】:

  • 你能用简单的英语解释一下你的查询需要做什么,如果可能的话还包括架构信息吗?

标签: mysql sql database select having


【解决方案1】:

一个 IN 语句中不能有 2 列。 您可以从选择中删除 SID 并仅在 HAVING 中使用它。您实际上不需要检索数据,您的 IN 子句将起作用。

【讨论】:

  • 两者都是错误的。我已经尝试过了,给出的结果是:错误 1054:“有子句”中的未知列“SID”
【解决方案2】:

您可以通过以下方式使用EXISTS

SELECT DName
FROM drugs
WHERE EXISTS
(
    SELECT *
    FROM transactions
    WHERE SID = 1 
    AND TotalCost > 100
    AND ( 
       drugs.DID = transactions.SID
       OR drugs.DID = transactions.DID
    )
)

【讨论】:

    【解决方案3】:

    如果我理解正确,那么你想要这样的东西:

    SELECT DName
    FROM drugs
    WHERE (DID, SID) IN 
    (
        //Subquery
    )
    

    【讨论】:

    • 你试过了吗?它会因多种原因而失败:1.你不能那样使用。 2. 内部查询是错误的,因为它在 select 子句中的列没有出现在 group by 子句或聚合函数中。
    • @ZoharPeled 1. 我们可以这样使用。 2. 刚刚从 question 中复制了内部查询。会修改它。谢谢
    • 哇,我不知道!我自己是一个 sql server 人,它会在 sql server 上失败。不知道您可以将 IN 用于 MySql 中的多个列。我的立场是正确的。
    • @ZoharPeled 如果非聚合选择列不包含在 group by 中,Mysql 不会抛出任何错误。
    • 我再次尝试过,但正如 Zohar 所说,无法在多个列上执行 IN,抱歉。
    【解决方案4】:

    答案已更新。对不起,我已经删除了我之前的答案。感谢 ZoharPeled 提醒我之前的回答是错误的。

    如果我理解你的问题,这应该对你有用:

    SELECT DName
    FROM drugs
    WHERE DID IN (
        SELECT DID FROM(
            SELECT DID,SID,TotalCost
            FROM transactions
            GROUP BY TotalCost
            HAVING SID = 1 AND TotalCost > 100
        ) AS T
    )
    

    【讨论】:

    • 内部查询是错误的,因为它在 select 子句中的列没有出现在 group by 子句或聚合函数中。
    • @ZoharPeled 啊,是的,我没注意到。刚刚从操作问题复制。谢谢提醒。
    【解决方案5】:

    你有几个答案 - 但我会提出一个替代选择:

    select DName
      from drugs d
     inner join (
                    SELECT DID
                      FROM transactions
                     WHERE SID = 1 
                       AND TotalCost > 100
                 ) tx on d.Did =tx.Did
    

    我认为(我愿意在这里更正)如果你使用类似...

      select *
        from table
       where EXISTS in ( // some subquery )
    

    ...EXISTS 子句中的子查询必须针对table 中的每一 行运行。使用内连接方法,RDBMS 将为内联表执行一次 sql,然后将结果保存在内存中以连接回另一个表。对于小型表,这很好 - 但对于较大的表,可能会严重影响性能。

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 2011-01-22
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多