我尝试做的事情是比较两列,但前提是它们都不为空。
更详细地说,我想让product_ids
和product_id,color_id
表格中的所有stock
对price
或null
{{ 1}}在其中任何一个。
我想出了这个似乎做的工作:
color_id
但我想知道是否有更优雅的解决方案。
谢谢。
答案 0 :(得分:0)
我想你可以这样做。
我不知道查询的性能因为我对SQl的性能不熟悉。
但我认为Subquery
对你来说是个不错的选择。
以下是可能对您有所帮助的查询。
SELECT
*
FROM
(
SELECT
DISTINCT
stock.product_id Stock_ProductId,
price.product_id Price_ProductId,
isnull(stock.color_id,0) Stock_color_id,
isnull(price.color_id,0) Price_color_id,
FROM
stock
,price
) AS A
WHERE
Stock_ProductId = Price_ProductId
AND
( Stock_color_id = Price_color_id OR Price_color_id = 0 OR Stock_color_id = 0)
我希望这个答案可以帮到你。
注意:此查询未经过测试
答案 1 :(得分:0)
这是另一种观点。您可能有一种产品有十种颜色,其中七种有货,六种有价格,四种匹配。找到一个匹配就足够了。为什么要匹配所有?然后甚至必须使用DISTINCT来摆脱多个匹配?
以下基本上是您的选择,仅放入EXISTS子句。 dbms可以使用它并使用快速查找循环。我想这取决于表中有多少产品和多少颜色,这是否更快。
select id
from product
where exists
(
select *
from stock s
join price p
on s.product_id = p.product_id
and (s.color_id = p.color_id or p.color_id is null or s.color_id is null)
where s.product_id = product.id
);
答案 2 :(得分:-1)
未经测试,但应该有效:
where ... and coalesce(stock.color_id, price.color_id, 0) = coalesce(price.color_id, stock.color_id, 0)
答案 3 :(得分:-1)
声明没有任何问题,不应修改。
将函数应用于JOIN
或WHERE
子句中的参数可防止查询优化器使用任何基础索引,从而强制执行全表扫描而不是更便宜的索引搜索。
此外,该声明称返回值与颜色匹配,包括那些没有颜色的。在这种情况下,NULL
用作通配符。使用ISNULL
或COALESCE
进行的任何修改也会修改逻辑,以便仅返回匹配或两者都没有颜色的逻辑。这相当于:
stock.color_id = price.color_id OR (price.color_id IS NULL AND stock.color_id IS NULL)
如果Color_Id
包含No Color
的特殊值,例如-1
,则可以简化此声明。在这种情况下,您可以简单地写
stock.color_id = price.color_id
这不会简化原始语句,因为逻辑要求您在两个表中检查No Color
值