加入3个表,其中2个子句获得null结果

Rav*_*123 3 sql-server join

我有一个问题,从SQL查询获得结果.我需要两个where子句的结果.我使用SQLServer2014

table1:产品

ProductID
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

表2:供应商

SupplierID
1
2
3
Run Code Online (Sandbox Code Playgroud)

table3:Product_Supplier

ProductSupplierID|ProductID|SupplierID|Reference
1                |1        |1         |Ref001
2                |1        |2         |Ref002
3                |2        |1         |Ref003
4                |3        |2         |Ref004
5                |4        |2         |Ref005
Run Code Online (Sandbox Code Playgroud)

我想要的结果是当我设置:

其中(ProductID <4)和(SupplierID = 2)

我必须得到结果:ProductID 4下的所有产品都与SupplierID 2相关,如果Product_Supplier中不存在,我必须得到Reference = Null

ProductID|SupplierID|Reference
1        |2         |Ref002
2        |2         |Null
3        |2         |Ref004
Run Code Online (Sandbox Code Playgroud)

我启动一些sql脚本,但我无法得到正确的结果

select a.ProductID, b.SupplierID, C.Reference from Product as a
  left outer join Product_Supplier as c on c.ProductID= a.ProductID
  left outer join Supplier as B on b.SupplierID = c.SupplierID
where a.ProductID<4 and b.SupplierID=2
Run Code Online (Sandbox Code Playgroud)

来自Felix Pamittan的回答:

SELECT
    t.*,
    ps.Reference
FROM (
    SELECT *
    FROM Product 
    CROSS JOIN Supplier
    WHERE
        ProductID < t.ProductID
        AND SupplierID = t.SupplierID
) t
LEFT JOIN Product_Supplier ps
    ON ps.ProductID = t.ProductID
    AND ps.SupplierID = t.SupplierID
Run Code Online (Sandbox Code Playgroud)

在这个脚本上我不能注入添加运行时的代码.当我可以设置sql末尾的位置时,最终用户可以注入where参数.

SELECT
    t.*,
    ps.Reference
FROM (
    SELECT *
    FROM Product 
    CROSS JOIN Supplier
    --WHERE
    --    ProductID < t.ProductID
    --    AND SupplierID = t.SupplierID
) t
LEFT JOIN Product_Supplier ps
    ON ps.ProductID = t.ProductID
    AND ps.SupplierID = t.SupplierID
where t.ProductID < 4
and t.SupplierID=2
Run Code Online (Sandbox Code Playgroud)

我将在真实数据库上测试这个.

Fel*_*tan 5

你需要先获得Products和Suppliers的所有组合.通过做一个这样做CROSS JOIN.最后,LEFT JOINProduct_Supplier桌子上做一个:

SELECT
    t.*,
    ps.Reference
FROM (
    SELECT *
    FROM #Product 
    CROSS JOIN #Supplier
    WHERE
        ProductID < 4
        AND SupplieIrD = 2
) t
LEFT JOIN #Product_Supplier ps
    ON ps.ProductID = t.ProductID
    AND ps.SupplierID = t.SupplieIrD
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO