Sql server 在SQL中联接2个表变量

Sql server 在SQL中联接2个表变量,sql-server,tsql,join,table-variable,Sql Server,Tsql,Join,Table Variable,如何联接不包含外键列的两个表变量 DECLARE @InventoryIDList TABLE(ID INT) DECLARE @ProductSupplierIDList TABLE(ID INT) 例外输出 @InventoryList -------------- 123 456 789 111 @ProductSupplierIDList -------------- 999 888 777 666 @InventoryList ProductSupplierIDList -

如何联接不包含外键列的两个表变量

DECLARE @InventoryIDList TABLE(ID INT)
DECLARE @ProductSupplierIDList TABLE(ID INT)
例外输出

@InventoryList
--------------
123
456
789
111

@ProductSupplierIDList
--------------
999
888
777
666

@InventoryList    ProductSupplierIDList
---------------------------------------
123             |        999
567             |        888
789             |        777
111             |        666
所有这些都是随机数据。我只想将2表变量组合成上面的样子。我尝试了所有类型的连接。但是我需要有上面提到的输出,而不需要
null

我尝试了交叉应用

SELECT *
FROM @InventoryIDList invList CROSS APPLY @ProductSupplierIDList prdList

但是它给了我5^2个元素,作为重复的结果。

考虑到这两个表之间没有关系,我想您需要
行数
完全外部联接

SELECT I.ID,
       P.ID
FROM   (SELECT Rn = Row_number()OVER(ORDER BY ID),*
        FROM   @InventoryList) I
       FULL JOIN (SELECT Rn = Row_number()OVER(ORDER BY ID),*
                  FROM   @ProductSupplierIDList) p
              ON I.RN = P.RN 

假设
JOIN
条件按ID升序为相同的“行号”:

WITH invList AS (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY ID) AS RN
    FROM @InventoryIDList),
prdList AS (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY ID) AS RN
    FROM @ProductSupplierIDList)
SELECT *
FROM invList IL
     JOIN prdList PL ON IL.RN = PL.RN;

由于ID不是按顺序排列的,并且可能是随机的,因此我建议在表变量上使用标识,并连接:

DECLARE @InventoryIDList TABLE(JoiningID INT IDENTITY(1,1), ID INT)
DECLARE @ProductSupplierIDList TABLE(JoiningID INT IDENTITY(1,1), ID INT)

INSERT INTO @InventoryIDList 
VALUES 
(123),
(456),
(789),
(111)

INSERT INTO @productsupplierIDList 
VALUES 
(999),
(888),
(777),
(666)


SELECT i.id, p.id
FROM @inventoryIDList i
INNER JOIN @productsupplierIDList p
    oN i.joiningid = p.JoiningID


您使用INTS定义,但值不是?您的
JOIN
标准是什么?@dfundako这是一个错误。我更新了问题。谢谢你,谢谢你。但是,您能否定义您的
加入
标准?正如你在下面看到的,所有3个答案都采取了相同的路线,然而,在没有实际知道的情况下,这基本上是猜测工作。dfundako确实提出了一个很好的观点,即如果添加更多的值,它可能/将改变
连接
结果。@Larnu感谢您的回答。我只想将这两个表var results追加到一个物理表中,该物理表包含与联接结果相同的2个col。我只想有一个表结构,它匹配第一个变量中的第一个项目和第二个变量中的第一个项目,以便看起来像一行,等等。由于库存ID不是按数字顺序排列的,这能工作吗?@dfundako-它能工作。。另外,如果你检查结果,结果没有特定的顺序。我问的原因是因为OP说数据是随机的。如果在每个表中再添加1个值,例如Inventory的ID为900,Product的ID为100,则结果将更改为lot@dfundako-因为数据根本不相关。。我非常怀疑我们是否应该使用
内部联接
。因此,结果可能需要所有900个库存和100个产品。基本上,我们正在将1个表中的第一条记录与下一个表中的第一条记录进行匹配,依此类推。我对该解决方案的评论与我已经评论过的相同。如果数据都是随机的,那么如果向数据集添加更多随机值,那么按ID排序将如何工作?@dfundako在这里引用了我自己的话,并强调了重要的词语*假设连接条件是相同的“行数”,以ID升序*:)还有,@dfundako,你一直在发表评论,但是OP已经说他们没有任何钥匙。您是否可以发布一个解决方案,即某人在不使用任何DDL更改的情况下将数据添加到表中,而不是将每个人的答案都记录下来?如果没有解决方案,告诉我们某个场景存在问题,也没有多大帮助。尤其是目前为止,所有3个答案都采取了相同的路线没有必要因为有人问你的代码以及它将如何处理不同的场景而生气。@dfundako我没有生气,我真诚地想看看你将如何处理你一直在谈论的场景。值得注意的是,如果你在更持久的表结构中使用此解决方案,与用户对象或临时表一样,如果插入错误并丢失标识值,这可能会导致很多问题。此外,还可以将
JoiningID
设置为主键,这样您的联接将更加高效。另外,它不应该是完全联接吗?@EvaldasBuinauskas它绝对可以,这取决于表中记录的数量是否不均匀。但是OP说结果数据集中不包含空值。是的,我现在看到了你的答案(所以没有加载,抱歉)。添加
标识
时,我关心的是这些值最初是随机分配的。OP(很可能)给人的印象是,数据是按插入顺序存储的,而不是按堆存储的。您可以在添加列后更新这些ID的值,但是,这样您就有了一个问题,即必须基于某些内容执行排序操作。