Sql server Join不区分我的列
我使用以下代码创建两个表的联接:Sql server Join不区分我的列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我使用以下代码创建两个表的联接: SELECT DISTINCT i.id, b.barcode FROM inventory i JOIN barcodes b ON b.id = i.id ORDER BY i.id 问题是,我有许多条形码是用相同的id连接的 这是我的输出 id barcode 1 10001 1 10002 1 1003 2 10009 2 10101
SELECT
DISTINCT
i.id,
b.barcode
FROM
inventory i
JOIN barcodes b ON b.id = i.id
ORDER BY
i.id
问题是,我有许多条形码是用相同的id连接的
这是我的输出
id barcode
1 10001
1 10002
1 1003
2 10009
2 10101
我希望我的结果只有一个id,并为该id提供表的第一个条形码。我希望的结果是:
id barcode
1 10001
2 10009
表中的行没有顺序,因此没有第一条、第二条或最后一条记录。您必须指定所需的记录或条形码。以下是每个ID的最小条形码编号示例:
select id, min(barcode)
from barcodes
group by id;
您也可以使用“外部应用”,您应该尝试找出您真正想要的条形码:
SELECT i.id,
b.barcode
FROM inventory i
OUTER APPLY (SELECT TOP 1 *
FROM barcodes
WHERE id = i.id
ORDER BY barcode) b;
不要使用SELECT DISTINCT-它相当于GROUP BY*,这不是您想要的
相反,你需要减少条形码,使其与库存量成1:1的关系,除非现在是1:m的关系
正如@Lamak在评论中提到的,您没有指定给定库存行应使用哪个条形码。SQL本身不太关心排序,这就是为什么没有第一个或最后一个聚合函数,尽管有最小值和最大值-在SQL数据中没有排序的概念,直到您使用ORDER BY或use OVER与聚合显式指定它
要快速完成某些操作,只需使用最小值或最大值:
给我第一个条形码,我们怎么知道哪一个是第一个?就其中一个。我不在乎哪一个是第一个,因为我的代码中我只使用id。如果你只使用id,为什么不选择不同的id而不是id,条形码?如果你只使用内部连接作为过滤器,输出中不需要包含额外的字段。顺便说一下,过滤条件属于where子句中,不需要使用不同的关键字hereFilter。因此,如果您想将结果限制为库存中存在的id,那么请将where id添加到select id from inventory中。
SELECT i.id,
b.barcode
FROM inventory i
OUTER APPLY (SELECT TOP 1 *
FROM barcodes
WHERE id = i.id
ORDER BY barcode) b;
SELECT
i.id,
MIN( b.barcode ) AS barcode
FROM
inventory i
INNER JOIN barcodes b ON b.id = i.id
GROUP BY
i.id
ORDER BY
i.id