SQL Server查询不会返回所有存储
在过去的几个小时里,我一直在兜圈子 我在一个表中进行选择,其中有每个商店的所有库存,并按产品id进行筛选。我需要的是:即使我没有该商店的数据,也要有一个所有商店的列表,但选择只返回4个或更少的商店 下面是一个例子: 这就是问题所在: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
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