我正在努力使用一个选择查询我试图创建连接两个具有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}}但我希望它只选择行,如果辅助表中的所有行都不为空,并且我很难理解逻辑,那么请帮助我这是开放的。任何解决方案是否包括更改表设计,我不介意。
答案 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