SQL表连接选择

时间:2014-06-24 09:06:06

标签: sql

我正在努力使用一个选择查询我试图创建连接两个具有1到多行比率的表。

核心表

   id   |   client_id  |   vehicle_code   |       risk       |   ....
---------------------------------------------------------------------
 20     | 2            | C2E              | There is no risk |

中学表

   id   |   LTEQR_id   |   period   |   milage   |   advanced_payments   |   subsequent_payments   |   total   | ....
---------------------------------------------------------------------------------------------------------------------
 10     | 20           | 1 Year     | 2000       | NULL                  | NULL                    | NULL      |
 11     | 20           | 2 years    | 1000       | NULL                  | 23                      | 16000.00  |

我遇到的问题是根据正在填充的某些列选择行,我有一个查询来选择subsequent_payments为空的所有行

SELECT l.id
      ,l.client_id
      ,l.vehicle_code
      ,l.risk
FROM core_table l
INNER JOIN secondary_table p ON p.LTEQR_id = l.id WHERE p.subsequent_payments IS NULL

哪个适用于subsequent_payments和其他列,但当我尝试执行与IS NOT NULL相反的操作时,它仍会选择该行,因为在辅助表中,id 11的值为{ {1}}但我希望它只选择行,如果辅助表中的所有行都不为空,并且我很难理解逻辑,那么请帮助我这是开放的。任何解决方案是否包括更改表设计,我不介意。

3 个答案:

答案 0 :(得分:1)

您希望从另一个表中存在或不存在记录的表中选择记录。因此,使用EXISTS子句而不是连接表。

编辑:您也可以使用IN子句。

答案 1 :(得分:1)

您可以使用子查询而不是连接

来实现
SELECT * 
  FROM core_table 
 WHERE NOT EXISTS (
    SELECT LTEQR_id 
      FROM secondary_table 
     WHERE LTEQR_id = core_table.id
       AND subsequent_payments IS NULL)

另一种方法是使用GROUP BY并使用CASE:您可以对来自secondary_table的记录进行分组,根据NULL使用大小写返回1或0 subsequent_payments列的状态,然后您可以使用HAVING子句进行过滤。

它比上面的简单解决方案复杂一点,但如果你遇到问题,可能是一个更有效的替代方案。

答案 2 :(得分:0)

如果Secondary表继承了Core表的Unique键,那么

SELECT * FROM Core A
LEFT JOIN Secondary B ON B.LTEQR_id = A.id

它将显示Core表中的每个项目在辅助表基础上具有相等的值 Secondary.LTEQR_id = Core.id