Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >SQL Server查询-奇怪的行为

SQL Server查询-奇怪的行为
EN

Stack Overflow用户
提问于 2016-03-18 02:56:42
回答 6查看 504关注 0票数 8

请考虑下面的SQL。

代码语言:javascript
代码运行次数:0
复制
   SELECT DISTINCT bvc_Order.ID,
            bvc_OrderItem.ProductID,
            bvc_OrderItem_BundleItem.ProductID
FROM dbo.bvc_OrderItem WITH (nolock)
RIGHT OUTER JOIN dbo.bvc_Order WITH (nolock)
LEFT OUTER JOIN dbo.bvc_User WITH (nolock) ON dbo.bvc_Order.UserID = dbo.bvc_User.ID
LEFT OUTER JOIN dbo.Amazon_Merchants WITH (nolock) ON dbo.bvc_Order.CompanyID = dbo.Amazon_Merchants.ID ON dbo.bvc_OrderItem.OrderID = dbo.bvc_Order.ID
LEFT OUTER JOIN dbo.bvc_OrderItem_BundleItem WITH (nolock) ON dbo.bvc_OrderItem.ID = dbo.bvc_OrderItem_BundleItem.OrderItemID
LEFT OUTER JOIN dbo.bvc_Product WITH (nolock) ON dbo.bvc_OrderItem.ProductID = dbo.bvc_Product.ID
WHERE 1=1
AND (bvc_Order.StatusCode <> 1
   AND bvc_Order.StatusCode <> 999)
AND ( bvc_OrderItem.ProductID IN ('28046_00')
   OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00'))
AND bvc_Order.OrderSource = 56;

当我对数据库执行查询时,它返回85行。那是不对的。如果只删除“和bvc_Order.OrderSource = 56”这个部分,它会返回5行,这是非常正确的。奇怪.另一件事,如果我移除这个部分

代码语言:javascript
代码运行次数:0
复制
OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00')

它还将像预期的那样返回5行,即使使用bvc_Order.OrderSource过滤器。我不知道它为什么要添加更多的行,而我试图通过使用过滤器来减少行。

表bvc_OrderItem_BundleItem不包含结果顺序ids或OrderItemID的任何行

编辑

谢谢各位,我尝试删除左/右连接混合,但是查询管理器不允许只允许左连接,它至少添加了一个右连接。我更新了SQL以删除额外的表,现在只有三个表。但结果是一样的

代码语言:javascript
代码运行次数:0
复制
SELECT DISTINCT dbo.bvc_Order.ID, dbo.bvc_OrderItem.ProductID, dbo.bvc_OrderItem_BundleItem.ProductID AS Expr1
FROM         dbo.bvc_OrderItem 
LEFT OUTER JOIN dbo.bvc_OrderItem_BundleItem ON dbo.bvc_OrderItem.ID = dbo.bvc_OrderItem_BundleItem.OrderItemId 
RIGHT OUTER JOIN dbo.bvc_Order ON dbo.bvc_OrderItem.OrderID = dbo.bvc_Order.ID

WHERE 1=1
AND (bvc_Order.StatusCode <> 1 AND bvc_Order.StatusCode <> 999)
AND ( 
    bvc_OrderItem.ProductID IN ('28046_00')
   OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00')
  )
AND bvc_Order.OrderSource = 56;

editSo远没有解决这个问题的办法。我以前在我的注释中粘贴了一个链接,并为带有查询的有效/无效结果提供了示例数据。又来了。http://sameers.me/SQLIssue.xlsx

这里要记住的一件事是,所有剩下的联接都是不可能的。让我进一步解释一下,bvc_Order包含主订单记录,bvc_ORderItem包含订单项/产品,bvc_ORderItem_BundleItem包含产品的子产品,这些产品在bvC_OrderItem表中可用。

现在并不是每个产品都有子产品,所以bvc_OrderItem_BundleItem可能没有任何记录(在当前的场景中,bvC_OrderItem_BundleItem中的订单实际上没有有效的行)。简而言之,在当前场景中,bvc_OrderItem_BundleItem表中没有可用的匹配行。如果我现在删除那个联接,这一切都没问题,但是在现实世界中,我当然不能删除那个BundleItem表联接。

谢谢

EN

回答 6

Stack Overflow用户

发布于 2016-03-22 02:11:12

当你说

代码语言:javascript
代码运行次数:0
复制
WHERE bvc_Order.OrderSource = 56

bvc_Order.OrderSourceNULL时,计算结果为false。如果LEFT/RIGHT连接失败,那么它将是NULL。这有效地将LEFT/RIGHT连接转换为内部连接。

您可能应该将谓词写入ON子句。另一种可能产生不同结果的办法是:

代码语言:javascript
代码运行次数:0
复制
WHERE (bvc_Order.OrderSource IS NULL OR bvc_Order.OrderSource = 56)

其他谓词也有相同的问题:

另外,如果我移除部件OR bvc_OrderItem_BundleItem.ProductID IN ('28046_00'),它也将按预期返回5行

当连接失败时,bvc_OrderItem_BundleItem.ProductIDNULL

我还建议手动编写查询。如果我理解正确的话,这个查询来自一个设计人员。它的结构很混乱。我要提一个最重要的评论:

在查询中混合左和右外部联接只是令人困惑。首先,应该重写from子句,使其只使用一种类型(我强烈建议左外部联接)。-戈登·林诺夫

票数 10
EN

Stack Overflow用户

发布于 2016-03-28 20:41:17

当你消除了不可能的东西,剩下的,无论多么不可能,都是真理吗?S.H.

附加于WHERE子句的附加条件不可能导致额外的行。这将意味着数据库引擎的缺陷,我希望我可以假设这是“不可能的”。(如果不是,那么我想它又回到了原点)。

这一事实使人们更容易集中精力于可能的原因:

  1. 当你评论掉 bvc_Order.OrderSource = 56; 然后,您还可以注释掉分号终止符。是否有可能在此查询之后有文本影响到它?试着在前面一行的末尾加上一个分号,以确保。
  2. 取决于用于运行查询的工具,有时当查询无法执行时,该工具会错误地显示旧的结果集。通过向SELECT语句中添加一个虚拟列,确保查询正确执行,以绝对证明您看到的是实时结果。你用的是哪种工具?
票数 2
EN

Stack Overflow用户

发布于 2016-03-22 03:31:19

当您使用左外部联接时,当您的和或条件满足时,它将给出左表(dbo.bvc_OrderItem)中的所有行,右侧外部联接也会发生相同的情况,

这些条件(左联接、右联接)可能不限制行,因为一个表中的行可以全部,另一个表只有一些行。

检查您的加入条件

然后检查你的情况:

(bvc_Order.StatusCode <> 1和bvc_Order.StatusCode <> 999)如果任何符合这个条件的行下一次检查另一个条件bvc_OrderItem.ProductID IN ('28046_00')或bvc_OrderItem_BundleItem.ProductID IN ('28046_00')

那么bvc_Order.OrderSource = 56

比较三个查询的结果,并根据条件检查数据,然后编写完整的查询,这样您就可以了解您所犯的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36082594

复制
相关文章
Excel每个单元格都统一加上(或减去)一个数
文章背景:处理Excel单元格数据时,有时需要在单元格区域内同时增加或减少某一数值,这里介绍两种操作方法。
Exploring
2022/08/10
1.8K0
[MySQL]更新时间(加上或者减去一段时间)
定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔。 DATE_SUB() 函数向日期减少指定的时间间隔。 语法 DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type)
用户2353021
2020/05/11
3.9K0
[MySQL]更新时间(加上或者减去一段时间)
DataGridView列自适应宽度
来源:http://www.cnblogs.com/wolf-sun/p/3480104.html
跟着阿笨一起玩NET
2018/09/20
1.8K0
DataGridView列自适应宽度
Windows2003下列引导或系统启动驱动程序无法加载:packet
优化了下系统,重启出现了一个错误。 弹出应用程序: 服务控制管理器 : 在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志。 仔细查看了一下windows日志记录错误原因是windows启动的时候提示一项服务或者驱动出错,在windows的安全日志中找到了如下的描述:
zhaoJian.Net
2023/02/24
8000
数组或对象中的内容间隔显示
总结:间隔显示,不要使用for 循环,原因是for循环是同步,setTimeout是异步,同步执行完再执行异步。
tianyawhl
2019/11/07
4.3K0
根据数据源字段动态设置报表中的列数量以及列宽度
在报表系统中,我们通常会有这样的需求,就是由用户来决定报表中需要显示的数据,比如数据源中共有八列数据,用户可以自己选择在报表中显示哪些列,并且能够自动调整列的宽度,已铺满整个页面。本文就讲解一下Act
葡萄城控件
2018/01/10
4.9K0
根据数据源字段动态设置报表中的列数量以及列宽度
Ordering列以或更好性能
为减少数据库的存储空间,需要确保对列进行排序,通常最好先放置固定大小的列,然后再添加可变长度的列。
yzsDBA
2021/04/26
3180
OC中获取一串字符串的高度(宽度确定)或宽度(高度确定)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52937475
用户1451823
2018/09/13
2.6K0
Element Vue 框架的 Table 列宽度自适应解决方案
# 原理 请求获取数据后,遍历数据,动态渲染一个节点,获取节点的宽度,最后改变表格列宽度 # 核心代码 /** * 计算字符串宽度 * @param str * @returns {number} */ function getStrWidth (str) { if (!document.getElementById('str-width')) { document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeend', '<s
cnguu
2020/10/23
2.9K0
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
前几天在Python星耀交流群有个叫【在下不才】的粉丝问了一个Pandas的问题,按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值,这里拿出来给大家分享下,一起学习。
前端皮皮
2022/08/17
3K0
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
给图片或文字加上鼠标悬浮时旋转动画
一个很简单的css即可实现图片或文字鼠标悬浮时旋转动画。这里就简单的说一下2d旋转。 首先用到 transform 属性,具体代码如下: transform:rotate(360deg); -ms-transform:rotate(360deg); /* IE 9 */ -moz-transform:rotate(360deg); /* Firefox */ -webkit-transform:rotate(360deg); /* Safari 和 Chrome */ -o-transform:
雨尘
2018/07/17
2.3K0
win10 uwp 如何修改 Flyout 的宽度或高度
在堆栈有小伙伴问如何修改 Flyout 的宽度,他看到宽度会使用第一个元素的大小而不是最大的
林德熙
2020/03/25
1.5K0
win10 uwp 如何修改 Flyout 的宽度或高度
最大宽度最小宽度
    css3又加入了min-width,min-height,max-with,max-height等属性
十月梦想
2018/08/29
3.1K0
7-标识列或自增长列
# 标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1. 标识列必须和键搭配(主键,唯一,外键等) 2. 一个表中只能有一个标识列 3. 标识列的类型只能是数值型(整型+浮点型) */ # 创建表时,设置某列为标识列 DROP TABLE IF EXISTS tab_identify; CREATE TABLE tab_identify( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); TRUN
Ywrby
2022/10/27
5390
java/poi 调整Excel 列宽支持自适应中文字符宽度
apache/poi是apache旗下用于读写Microsoft Office 二进制文件和OOXML 格式文件的开源库。用它来进行excel文件的导出是很趁手的。 一般来说可以直接使用 Sheet.autoSizeColumn方法自动调整每列的宽度。但是遇到包含中文的列,autoSizeColumn方法计算的列宽是不正确的,算出的宽度不能完整显示中文内容。最近项目中就遇到了这个问题,于是参考网上的各类文章,自己实现了自动适应中文字符宽度的方法
10km
2022/09/16
3.1K1
pandas 导出 Excel 文件的时候自动列宽,自动加上边框
尝试过 xlrd、xlwt、openpyxl、xlwings、pandas 来处理 Excel,如果说除了读写 Excel,还要做数据分析,还是 pandas 最好用,大多数情况下,你根本不需要把数据插入数据库,再用 SQL 去做数据分析。
somenzz
2022/10/25
2.3K0
vue+element实现表格跨行或跨列合并
vue+element用于pc后台管理系统比较多,所以后台管理系统一般以处理数据为主,数据结构的复杂程度变高,相对应的前端展示成本也提高, 有些产品经理或许会要求表格跨行或跨列合并,如果你正在想怎么实现,那就接着往下看 最新封装了一个表格合并和编辑插件:vue-split-table,戳一戳 效果图
火狼1
2019/04/17
7.9K0
vue+element实现表格跨行或跨列合并
点击加载更多

相似问题

在VSCode中打开木星: TypeError:无法读取未定义的属性(读取'makeSettings')

14

文件移动/复制操作后无法读取的木星笔记本

116

无法发射木星笔记本

29

无法设置木星笔记本

12

我无法在我的木星笔记本上读取数据。

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文