SQL Server查询不会返回所有存储

SQL Server查询不会返回所有存储,sql,sql-server,Sql,Sql Server,在过去的几个小时里,我一直在兜圈子 我在一个表中进行选择,其中有每个商店的所有库存,并按产品id进行筛选。我需要的是:即使我没有该商店的数据,也要有一个所有商店的列表,但选择只返回4个或更少的商店 下面是一个例子: 这就是问题所在: select store_id, product_id, start_date, quantity from stock where product_id = 407214 这就是结果: store_id | product_id

在过去的几个小时里,我一直在兜圈子

我在一个表中进行选择,其中有每个商店的所有库存,并按产品id进行筛选。我需要的是:即使我没有该商店的数据,也要有一个所有商店的列表,但选择只返回4个或更少的商店

下面是一个例子:

这就是问题所在:

select 
    store_id, product_id, start_date, quantity 
from 
    stock 
where 
    product_id = 407214
这就是结果:

store_id | product_id |       start_date      | quantity |
    2    |   407214   |  2015-05-26 08:32:53  |    10    |
    3    |   407214   |  2015-03-16 12:10:00  |    25    |
    4    |   407214   |  2015-01-06 11:45:15  |    16    |
    7    |   407214   |  2015-05-14 00:00:00  |    8     |
这就是我想要的:

store_id | product_id |       start_date      | quantity |
    1    |    NULL    |          NULL         |   NULL   |
    2    |   407214   |  2015-05-26 08:32:53  |    10    |
    3    |   407214   |  2015-03-16 12:10:00  |    25    |
    4    |   407214   |  2015-01-06 11:45:15  |    16    |
    5    |    NULL    |          NULL         |   NULL   |
    6    |    NULL    |          NULL         |   NULL   |
    7    |   407214   |  2015-05-14 00:00:00  |    8     |
我真的需要帮助,这快把我逼疯了

添加到WHERE子句或product\u id为NULL

为NULL将返回没有值的行。where子句中的or表示条件。如果特定行表示这些条件之一

select store_id, product_id, start_date, quantity 
     from stock where 
          product_id = 407214 OR Product_id iS null
或者你的null是一个字符串

 select store_id, product_id, start_date, quantity 
     from stock where 
          product_id = 407214 OR Product_id like null
或者,您可能正在将product_id输入为null,您可以尝试以下操作:

select store_id, product_id, start_date, quantity 
    from stock where 
       product_id = 407214 OR Product_id = null
或者,如果你想要所有东西,删除where子句,但你是按产品订购的。\u id:也许这就是你的意思

select store_id, product_id, start_date, quantity from stock order by product_id

解决方案取决于您的数据库结构

若库存表只包含可用的产品,那个么您需要表stores和stock的左联接

知道如何使用您可以:



将其添加到where:或product_id为NULLNothing,返回相同的结果即使我确实从product_id=407214或product_id为null的库存中选择了*,它也会返回相同的结果如果将product_id为null添加到where子句不会修复它,那么这些值可能不是空的。您是否有一个表,其中包含您想要的所有存储id?只是一个建议,但也许可以解释为什么这样可以解决问题。对于提问者来说,这可能并不明显。没有人会返回相同的结果。实际的NULL表示该列可以为NULL,并且被视为emtpy,或者您是否将“NULL”一词放在该列中?即使我确实从库存中选择了*,其中product_id=407214或product_id为NULL,它也会在更新您的问题时返回相同的结果。此查询将生成原始问题中指定的正确结果。如果您有一个stores表,@ASh solution is bettersbiz,我尝试按照您发布的方式执行,但结果仍然相同。列n显示的值与现在存储的值相同。我修改了代码,使r.n充当store_id。请记住,store_id是生成的,并且可能不存在于您的数据模型中。您应该将product_id比较放在ON子句中,这将允许您删除,或者product_id为null。我尝试像您发布的那样做,但结果仍然是一样的same@AlanCarvalhoChigan萨亚斯,请注意,我删除了where子句,并将按产品\u id的过滤器移动到联接条件中。你们也这么做了吗?你们从哪里得到了一个stores表?@DanField,store_id很可能是一个外键,所以我假设db结构包括表stores@ASh非常感谢兄弟,你救了我的命,哈哈,就是这样,它成功了…我永远不会期望它成功,因为你不应该在键中使用空值。表的设计与可能以这种方式存储的数据背道而驰……我永远不会期望这样做有效,因为您不应该在键中使用空值。表的设计与可能以这种方式存储的数据背道而驰。
select 
  s.id as store_id, 
  st.product_id, 
  st.start_date, 
  st.quantity 
from 
stores s
left join stock st on s.Id = st.store_id and st.product_id = 407214
select store_id, product_id, start_date, quantity from stock where product_id = 407214 or product_id = null
--select 5 as store_id, 407214 as product_id, 3 as start_date, 3 as quantity into stock

DECLARE @maxStoreId int
SELECT 
    @maxStoreId = MAX(store_id) 
FROM 
    stock;

WITH r AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n+1 FROM r WHERE n+1<=@maxStoreId
)
SELECT 
    r.n as store_id, product_id, start_date, quantity  
FROM 
    r left outer join stock on  r.n = stock.store_id
WHERE 
    product_id = 407214 or product_id is null

--drop table stock