【问题标题】:SQL Query Not Working Properly With Multiple Join ClausesSQL 查询无法与多个连接子句一起正常工作
【发布时间】:2015-02-13 00:37:45
【问题描述】:

我研究这个查询已经有一段时间了。我刚刚获得了部分解决方案,现在尝试将该查询添加到我的大查询中,但查询的输出出现了一些问题。

SELECT T1.[miles], 
       T2.[name], 
       T2.[code], 
       T2.[routesid], 
       T2.[id], 
       T2.[company], 
       T2.[contract], 
       T2.[supplier], 
       T3.[tons], 
       CASE 
         WHEN T4.miles IS NULL THEN T5.miles 
         ELSE T4.miles 
       END MILES2, 
       CASE 
         WHEN T4.miles = T1.miles 
              AND T4.miles != 9999 THEN T4.flatrate 
         ELSE T5.rate 
       END AS RATE, 
       T3.[change] 
FROM   ((table1 AS T1 
         JOIN table2 AS T2 
           ON T1.[company] = T2.[company] 
              AND T1.[id] = T2.[routesid]) 
        JOIN table3 AS T3 
          ON T1.[company] = T3.[code]) 
       LEFT JOIN table4 AS T4 
              ON T1.[company] = T4.[code] 
                 AND ( T1.[miles] = T4.[miles] ) 
       INNER JOIN (SELECT TOP 1 code, 
                                miles, 
                                rate, 
                                flatrate 
                   FROM   table4 
                   WHERE  miles = 9999 
                          AND active = 1) AS T5 
               ON T1.[company] = T5.[code] 
WHERE  T2.[active] = 1 
       AND T2.[expiration] < '02/10/2015' 
       AND T1.[miles] > 0 
       AND T1.[company] = 'COMPANY' 
       AND T3.[active] = 1; 

我知道这是一个很大的问题。我试图弄清楚为什么它忽略了与表 4 上与 9999 配对的里程配对的数字。打印这些数字没有问题。

MILES NAME CODE ROUTESID ID   COMPANY CONTACT SUPPLIER TONS MILES2 CHANGE
140   N/A  N/A  3425     185  ILLINI  TARIFF 1 N/A      24  140    Weekly
144   N/A  N/A  4532     198  ILLINI  TARIFF 3 N/A      24  144    Weekly
9999  N/A  N/A  2134     150  ILLINI  TARIFF 2 N/A      24  9999   Weekly

如果它与下面的这种情况相匹配,它现在不会打印出来。我从之前的堆栈溢出中得到了 SQL 语句,如果 Miles 和 Miles2 不匹配,我得到了要打印的 SQL 语句,但是由于我将 SQL 加在一起,它就停止了工作。

MILES NAME CODE ROUTESID ID   COMPANY CONTACT SUPPLIER TONS MILES2 CHANGE
140   N/A  N/A  3420     170  ILLINI  TARIFF 4 N/A      24  9999   Weekly

Previous Stack Overflow

Here is a demo of the issue 如您所见,未显示 TABLE1 中的 250、300、350、400、450 和 500。

Here is the resolution

【问题讨论】:

  • 您有实际问题吗?
  • 1) 将代码格式化为人类可读的格式将大大有助于人类阅读和理解它。 2) 您能否更具体地说明您面临的问题?
  • 你在开玩笑吗?这甚至不可读。
  • 嗯,你的问题很可能是你加入了来自 table4 的TOP 1(而不是ORDER BY),这意味着你总是加入一个特定的行
  • 这真的不是一个大问题。但是,仅通过查询就很难弄清楚您在做什么。

标签: sql sql-server


【解决方案1】:

Giorgos 在您之前的 Stack Overflow 线程中给出的答案部分有效,因为您的示例中只有一家公司。看到这部分查询了吗?:

INNER JOIN (SELECT TOP 1 code, 
                            miles, 
                            rate, 
                            flatrate 
               FROM   table4 
               WHERE  miles = 9999 
                      AND active = 1) AS T5 
ON T1.[company] = T5.[code] 

这实际上只取表中的第一行(其中英里 = 9999 和活动 = 1),然后尝试将其连接到 T1 表。不是每家公司的顶行,只是顶行。因此,当您将 T5 表连接到公司字段上的 T1 表时,无论哪家公司恰好位于第一行,都是唯一可用的。你可以通过使用 distinct 而不是 top 1 来解决这个问题,如果表中没有英里 = 9999 和活动 = 1 的单个代码的多行(我猜你不应该这样做,因为这意味着相同的代码和里程有多种费率):

INNER JOIN (SELECT distinct code, miles, rate, flatrate 
            FROM   table4 
            WHERE  miles = 9999 AND active = 1
            GROUP BY code) AS T5 ON T1.[company] = T5.[code] 

但正如其他人所指出的那样,很难理解您要完成的工作,部分原因是您的查询格式很奇怪。重新解释表格的性质和您正在寻求的解决方案以及更好地定义问题可能会有所帮助。

【讨论】:

  • 也许我的 Demo 更擅长描述它。
  • 好的,我认为问题在于您将 AND T4.[active] = 1 放在查询的 where 子句中。这将删除 t4.active 值不为 1 的所有行。由于您在 t4 上进行了左外连接,因此您的许多行的该字段都有一个空值。您可以改为将 AND T4.[active] = 1 添加到 t4 表的连接条件中。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2019-09-25
  • 2014-02-01
相关资源
最近更新 更多