0

我有一个这样的查询,

     Select * from customers c join invoice I on
     c.id = i.customerid where c.date = '12-12-2019' and i.date = '12-12-2019'

结果如下

+------------+--------------+---------+-------+
| Customerid | customername | address | phone |
+------------+--------------+---------+-------+
| 1          | Peter        | Flat a  | 4567  |
+------------+--------------+---------+-------+
| 2          | Peter        | Flat a  | 4567  |
+------------+--------------+---------+-------+ 
| 5          | John         | Flat b  | 1234  |
+------------+--------------+---------+-------+
| 6          | John         | Flat b  | 1234  |
+------------+--------------+---------+-------+

查询将获取小客户ID的记录。如何强制查询选择具有更大客户 ID 的记录?

4

2 回答 2

0

试试下面的,这里是演示。您可以在主查询顶部写下查询。

select
    max(customerId) as customerId,
    customerName,
    address,
    phone
from customers
group by
    customerName,
    address,
    phone
order by 
    customerId

输出:

| customerId | customerName | address | phone |
| ---------- | ------------ | ------- | ----- |
| 2          | Peter        | Flat a  | 4567  |
| 6          | John         | Flat b  | 1234  |
于 2020-05-16T07:01:04.007 回答
0

在我标记为重复的问题中,您可以使用排除连接来过滤您的记录集以检索所需的结果。

排除连接通过连接同一个表并仅检索最大的记录来工作Customerid。此外,它不会出现ONLY_FULL_GROUP_BY问题,也不需要使用GROUP BYwith ORDER BY,如果使用不当会产生不良结果。

排除加入db-fiddle

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.Customeridwith26

顾客

| 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表中相同的记录。customeriddatecustomers

我提供的查询强制仅检索具有较大customers.Customerid. 它不会将发票客户与更大的 Customerid 匹配,换句话说,它不会检索customers.Customerid = 2when invoice.Customerid = 1

如果您想显示更大customers.Customerid的关联发票,请发表评论并更新您的问题以澄清,并提供具有所需最终结果的示例数据集。但是,我相信如果是这种情况,则表明您的数据库结构中存在关系设计缺陷,并且可能会导致长期的数据完整性问题。

于 2020-05-16T19:59:32.423 回答