在我标记为重复的问题中,您可以使用排除连接来过滤您的记录集以检索所需的结果。
排除连接通过连接同一个表并仅检索最大的记录来工作Customerid
。此外,它不会出现ONLY_FULL_GROUP_BY
问题,也不需要使用GROUP BY
with ORDER BY
,如果使用不当会产生不良结果。
SELECT c1.*
FROM customers AS c1
LEFT JOIN customers AS c2
ON c2.customername = c1.customername
AND c2.customerid > c1.customerid
WHERE c2.customerid IS NULL;
结果
| Customerid | customername | address | phone |
| ---------- | ------------ | ------- | ----- |
| 2 | Peter | Flat a | 4567 |
| 6 | John | Flat b | 1234 |
模棱两可的排除连接
如果对customername
单个实体不是唯一的(不明确),您可以在排除连接中包含其他条件,以确保检索到正确的实体。
LEFT JOIN customers AS c2
ON c2.customername = c1.customername
AND c2.address = c1.address
AND c2.phone = c1.phone
AND c2.customerid > c1.customerid
WHERE c2.customerid IS NULL;
然后,您可以使用其他连接扩展您的语句,以检索更大的记录customers.Customerid
。
给定下表数据集,并且您要显示customers.Customerid
with2
和6
顾客
| Customerid | customername | address | phone | date |
| ---------- | ------------ | ------- | ----- | ---------- |
| 1 | Peter | Flat a | 4567 | 12-12-2019 |
| 2 | Peter | Flat a | 4567 | 12-12-2019 |
| 5 | John | Flat b | 1234 | 12-12-2019 |
| 6 | John | Flat b | 1234 | 12-12-2019 |
发票
| Invoiceid | Customerid | date |
| --------- | ---------- | ---------- |
| 1 | 1 | 12-12-2019 |
| 2 | 2 | 12-12-2019 |
| 3 | 5 | 12-12-2019 |
| 4 | 5 | 12-12-2019 |
| 5 | 6 | 12-12-2019 |
询问
SELECT c1.*, I.*
FROM customers AS c1
LEFT JOIN customers AS c2
ON c2.customername = c1.customername
AND c2.customerid > c1.customerid
INNER JOIN invoice I
ON c1.customerid = I.Customerid
AND I.date = c1.date
WHERE c1.date = '12-12-2019'
AND c2.customerid IS NULL;
这将“强制查询选择具有更大 customerid 的记录?” 那些也在invoice
表内。
此外,我删除了冗余标准c.date = '12-12-2019' and i.date = '12-12-2019'
以支持I.date = c1.date
在 INNER JOIN 标准中使用。
我不明白 的目的customers.date
,因为发票通常与开票的客户相匹配,并且输入的发票日期是可变的。所以我相信c.date = '12-12-2019'
可以省略有利于使用INNER JOIN invoice I
ON c1.id = I.customerid AND I.date = '12-12-2019'
,以便检索具有所需日期的发票和已开具发票的相关客户。
查询替代
SELECT c1.*, I.*
FROM customers AS c1
LEFT JOIN customers AS c2
ON c2.customername = c1.customername
AND c2.customerid > c1.customerid
INNER JOIN invoice I
ON c1.customerid = I.Customerid
AND I.date = '12-12-2019'
WHERE c2.customerid IS NULL;
结果
| Customerid | customername | address | phone | date | Invoiceid | Customerid | date |
| ---------- | ------------ | ------- | ----- | ---------- | --------- | ---------- | ---------- |
| 2 | Peter | Flat a | 4567 | 12-12-2019 | 2 | 2 | 12-12-2019 |
| 6 | John | Flat b | 1234 | 12-12-2019 | 5 | 6 | 12-12-2019 |
注意事项
请务必注意,您的原始语句join invoice I on c.id = i.customerid WHERE c.date = '12-12-2019' and i.date = '12-12-2019'
仅匹配表中与invoice
表中相同的记录。customerid
date
customers
我提供的查询强制仅检索具有较大customers.Customerid
. 它不会将发票客户与更大的 Customerid 匹配,换句话说,它不会检索customers.Customerid = 2
when invoice.Customerid = 1
。
如果您想显示更大customers.Customerid
的关联发票,请发表评论并更新您的问题以澄清,并提供具有所需最终结果的示例数据集。但是,我相信如果是这种情况,则表明您的数据库结构中存在关系设计缺陷,并且可能会导致长期的数据完整性问题。