Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 在具有重复值的两列中完全联接_Sql_Tsql_Join_Where Clause_Outer Join - Fatal编程技术网

Sql 在具有重复值的两列中完全联接

Sql 在具有重复值的两列中完全联接,sql,tsql,join,where-clause,outer-join,Sql,Tsql,Join,Where Clause,Outer Join,我有两张像这样的桌子: sMinMax: PartNo baseID Min Max 11795 1 1 1 11795 5 0 0 11795 6 1 1 01655 65 2 3 vsStock: PartNo baseID Qty 11795 1 1 11795 1 1 11795 55 1 我想将它们连接起来,因此我得到一个表,

我有两张像这样的桌子:

sMinMax:

PartNo  baseID  Min   Max  
11795   1       1     1
11795   5       0     0
11795   6       1     1
01655   65      2     3 
vsStock:

PartNo  baseID  Qty
11795   1       1
11795   1       1
11795   55      1
我想将它们连接起来,因此我得到一个表,其中显示了所有parNo en base的所有列,如下所示:

结果:

PartNo  baseID  Min   Max  Qty
11795   1       1     1     2
11795   5       0     0     null
11795   6       1     1     null
11795   55      null  null  1
01655   65      2     3     null
所以我只需要在两列上进行一个完整的外部连接,但这会得到与我期望的左连接相同的结果。我尝试了1000种方法,但这是我最后一次尝试:

SELECT 
 a.sPart_ID
,a.uRALBase_ID
,a.MinQty
,a.MaxQty
,b.Qty

FROM [RALNHVTST].[dbo].[sMinMax] as a

FULL OUTER JOIN [RALNHVTST].[dbo].[vsStockList] as b

ON a.sPart_ID = b.sPart_ID
AND a.uRALBase_ID = b.uRALBase_ID
WHERE a.sPart_ID IS NOT NULL
AND a.sPart_ID = 1159

ORDER BY a.sPart_ID

但正如我所说,这给了我与左连接相同的结果。有人知道我做错了什么吗?

类似的吗?此查询给我的结果与您预期的相同

SELECT 
 CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END AS PartNo
,CASE WHEN a.baseId IS NOT NULL THEN a.baseId ELSE b.baseId END AS baseId
,a.[Min]
,a.[Max]
,SUM(b.Qty) AS Qty

FROM [dbo].[sMinMax] as a

FULL JOIN [dbo].[vsStock] as b

ON a.partNo = b.partNo
AND a.baseId = b.baseId
GROUP BY 
    CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END, 
    CASE WHEN a.baseId IS NOT NULL THEN a.baseId ELSE b.baseId END, 
    a.[Min],
    a.[Max]
ORDER BY 
CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END

像这样的?此查询给我的结果与您预期的相同

SELECT 
 CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END AS PartNo
,CASE WHEN a.baseId IS NOT NULL THEN a.baseId ELSE b.baseId END AS baseId
,a.[Min]
,a.[Max]
,SUM(b.Qty) AS Qty

FROM [dbo].[sMinMax] as a

FULL JOIN [dbo].[vsStock] as b

ON a.partNo = b.partNo
AND a.baseId = b.baseId
GROUP BY 
    CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END, 
    CASE WHEN a.baseId IS NOT NULL THEN a.baseId ELSE b.baseId END, 
    a.[Min],
    a.[Max]
ORDER BY 
CASE WHEN a.PartNo IS NOT NULL THEN a.PartNo ELSE b.PartNo END

完全联接中过滤是很棘手的。我建议在子查询中进行过滤和聚合:

SELECT COALESCE(sm.sPart_ID, s.sPart_Id) as sPartId,
       COALESCE(sm.uRALBase_ID, sm.uRALBase_ID
       sm.MinQty, sm.MaxQty, s.Qty
FROM (SELECT sm.*
      FROM [RALNHVTST].[dbo].[sMinMax] sm
      WHERE sm.sPart_ID = 1159
     ) sm FULL OUTER JOIN 
     (SELECT s.sPart_ID, s.uRALBase_ID, SUM(qty) as qty
      FROM [RALNHVTST].[dbo].[vsStockList] s
      WHERE s.sPart_ID = 1159
      GROUP BY s.sPart_ID, s.uRALBase_ID
     ) s
     ON sm.sPart_ID = s.sPart_ID AND
        sm.uRALBase_ID = s.uRALBase_ID
ORDER BY sPart_ID

完全联接中过滤是很棘手的。我建议在子查询中进行过滤和聚合:

SELECT COALESCE(sm.sPart_ID, s.sPart_Id) as sPartId,
       COALESCE(sm.uRALBase_ID, sm.uRALBase_ID
       sm.MinQty, sm.MaxQty, s.Qty
FROM (SELECT sm.*
      FROM [RALNHVTST].[dbo].[sMinMax] sm
      WHERE sm.sPart_ID = 1159
     ) sm FULL OUTER JOIN 
     (SELECT s.sPart_ID, s.uRALBase_ID, SUM(qty) as qty
      FROM [RALNHVTST].[dbo].[vsStockList] s
      WHERE s.sPart_ID = 1159
      GROUP BY s.sPart_ID, s.uRALBase_ID
     ) s
     ON sm.sPart_ID = s.sPart_ID AND
        sm.uRALBase_ID = s.uRALBase_ID
ORDER BY sPart_ID

WHERE子句条件使完全外部联接返回左外部联接结果。WHERE子句条件使完全外部联接返回左外部联接结果。下面有一个小问题:如果我想添加一个左联接来添加部件的描述,代码会是什么样子?如下所示:左JOIN[dbo].[sPart]作为a.PartNo=c.IDI上的c在两个比较之间使用OR表达式。类似于将[dbo].[sPart]作为c上的c进行连接。Id=a.PartNo或c.Id=b.PartNo。如果你同意我的回答,请把它作为正确的解决方案。@CathalClavie。这并没有实现你问题中的过滤,所以我不认为它是“完美的”。@GordonLinoff。老实说,我不是从问题中检查查询,我只是查看源数据和预期结果。但在我的解决方案中实现一些WHERE条件并不困难,例如,WHERE CASE当a.baseId不为NULL时,则a.baseId ELSE b.baseId END=1159。@OndřejCrha。过滤
full join
s是一项挑战。下面有一个小问题:如果我想添加一个左连接来添加零件的描述,代码会是什么样子?如下所示:左JOIN[dbo].[sPart]作为a.PartNo=c.IDI上的c在两个比较之间使用OR表达式。类似于将[dbo].[sPart]作为c上的c进行连接。Id=a.PartNo或c.Id=b.PartNo。如果你同意我的回答,请把它作为正确的解决方案。@CathalClavie。这并没有实现你问题中的过滤,所以我不认为它是“完美的”。@GordonLinoff。老实说,我不是从问题中检查查询,我只是查看源数据和预期结果。但在我的解决方案中实现一些WHERE条件并不困难,例如,WHERE CASE当a.baseId不为NULL时,则a.baseId ELSE b.baseId END=1159。@OndřejCrha。筛选
full join
s是一项挑战。