Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Join不区分我的列_Sql Server_Sql Server 2008 - Fatal编程技术网

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