【问题标题】:SQL Server JOIN StatementsSQL Server JOIN 语句
【发布时间】:2013-03-08 16:43:43
【问题描述】:

我正在尝试从 SQL Server 数据库(使用 SQL Server Management Studio)中提取一些信息,如下所示:

SELECT DISTINCT( t1.accountid ), 
               t1.accountname, 
               t1.reseller, 
               (SELECT t1.reseller 
                FROM   dbname t1 
                       INNER JOIN dbname t2 
                               ON t1.reseller = t2.reseller 
                WHERE  t1.reseller IN ( 1 )) AS Reseller 
FROM   dbname t1, 
       dbname t2 

运行它会给我一个错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

经过大量研究,我仍然感到困惑。帮助将不胜感激。谢谢。

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - ANSI-92 SQL 标准 ( 20 年前!)
  • 如果经销商在两个表中都匹配,那么输出两次有什么意义?另外,您为什么要在子查询中显式加入,然后在外部查询中再次隐式this is bad!)?
  • 另外,自加入的意义何在?你能展示几行样本数据和想要的结果吗?我开始制定答案,但您最初的尝试有很多错误,以至于无法确定该查询实际上应该做什么。

标签: sql sql-server inner-join


【解决方案1】:
  1. 您不能将DISTINCT 应用于单个列,我不确定这里是否需要它,除非您的表允许所有这些列中的重复值。
  2. 我不知道您为什么要加入这些表两次,或者根本不使用子查询。
  3. 我不知道你为什么要输出t1.reseller两次...即使你使用t1中的一个和t2中的一个,因为它们在连接上匹配,所以它们总是相同的每一行!
  4. 你有一个隐式连接并且你缺少一个 where 子句 - 它导致一个笛卡尔积并且是 exactly why I always recommend against this syntax。也许这就是触发DISTINCT使用的原因?
  5. 您似乎根本没有使用 t2 中的任何列。 (双)自连接有什么意义?

看来你只需要:

SELECT accountid, accountname, reseller
  FROM dbo.dbname
  WHERE reseller = 1;

否则,请准确描述您的查询应该做什么(通过显示示例数据和所需结果)。

【讨论】:

    【解决方案2】:

    在子查询中添加 TOP 1 子句

    如下

           (SELECT TOP 1 t1.reseller 
            FROM   dbname t1 
                   INNER JOIN dbname t2 
                           ON t1.reseller = t2.reseller 
            WHERE  t1.reseller IN ( 1 )) AS Reseller) 
    

    【讨论】:

      【解决方案3】:

      你得到的错误是因为这个查询:

                 (SELECT t1.reseller 
                  FROM   dbname t1 
                         INNER JOIN dbname t2 
                                 ON t1.reseller = t2.reseller 
                  WHERE  t1.reseller IN ( 1 )) AS Reseller)
      

      返回多个值。

      【讨论】:

      • 一个答案通常不会提出如何解决它吗?除了代码块之外,这对我来说就像是一条评论。
      猜你喜欢
      • 2014-12-18
      • 2011-07-09
      • 1970-01-01
      • 2016-04-02
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2011-04-18
      相关资源
      最近更新 更多