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

时间:2016-10-11 14:33:03

标签: sql-server join

我有一个问题是从SQL查询中获取结果。我需要两个where子句的结果。我使用SQLServer2014

table1:产品

ProductID
1
2
3
4
5

表2:供应商

SupplierID
1
2
3

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

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

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

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

ProductID|SupplierID|Reference
1        |2         |Ref002
2        |2         |Null
3        |2         |Ref004

我启动了一些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

来自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

在这个脚本上,我无法在其中注入添加运行时代码。当我可以设置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

我将在真实数据库中对此进行测试。

3 个答案:

答案 0 :(得分:5)

您需要首先获得ProductSupplier的所有组合。通过CROSS JOIN执行此操作。最后,在LEFT JOIN表上执行Product_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

ONLINE DEMO

答案 1 :(得分:0)

试试这个:

SELECT ps.ProductSupplierID, s.SupplierID, ps.Reference
FROM Product_Supplier ps
   LEFT JOIN Product p ON ps.ProductID = p.ProductID
   LEFT JOIN Supplier s ON ps.SupplierID = s.SupplierID
WHERE p.ProductID < 4
   AND s.SupplierID = 2

您可以使用INNER JOINs代替LEFT JOINS,但首先尝试使用LEFT JOINS,如果可行,请尝试INNER JOINs进行试用。由于我相信Null,您无法获得JOINs值。

修改 上面的查询应该可以为您提供正确的结果。您需要检查并确保您确实拥有属于您认为自己所属类别的记录。首先逐行删除一些WHERE子句。当您删除该子句的一行并显示该记录时,您知道您已找到该错误。

答案 2 :(得分:0)

标准中的问题是JSONObject obj; try (InputStream input = new FileInputStream(pathname)) { obj = new JSONObject(new JSONTokener(input)); } 。因为b(Suplier)引用c(链接表),如果c中不存在记录,它会否定b中的左连接。

您可以将标准移动到连接:

b.SupplierID = 2

由于不需要select a.ProductID, b.SupplierID, C.Reference from Product as a join Supplier as B on b.SupplierID = 2 -- moved criterium left join Product_Supplier as c on c.ProductID= a.ProductID and c.SupplierID=b.SupplierID where a.ProductID<4 的明确数据,您也可以完全省略该加入并硬编码&#39; 2&#39;取而代之的是选择部分(同时将其作为连接中的额外标准)

supplier