TSQL 选择一行或多行进行连接

2024-04-13

这是类似于以下的问题:TSQL 按 2 个条件之一选择行 https://stackoverflow.com/questions/10208849/tsql-select-rows-by-one-from-2-conditions,但结果与我想要的不同

我有一个像这样的表:

ORDER_ID   CODE1   CODE2   CODE3   STATUS    TYPE        SUM      GROUP
1          '001'   'BIGP'  NULL    4         'company'   120      48
2          '002'   'BIGP'  NULL    1         'priv'      100      20
3          '001'    NULL   NULL    6         'priv'      50       49
4          '002'    NULL   'L'     1         'company'   1253     22

第二个表如下:

ADDRESS_ID   ORDER_ID   ZIP       TYPE   ADD_DATE       CATEGORY     VERIFIED
1            1          '15-125'    'K1'   '2010-01-01'   'CLIENT'     1
2            1          '22-022'    'D1'   '2010-01-02'   'SYSTEM'     1
3            2          '16-159'    'D2'   '2010-01-02'   'SYSTEM'     1
4            2          '15-125'    'D2'   '2010-02-01'   'CLIENT'     0

第三和第四个表包含邮政编码和城市名称,如下所示:

ZIP       CITY
'15-125'    'Warszawa'
'22-022'    'Koszalin'
'16-159'    'Krakow'
'15-125'    'Lublin'

对于每一个有

  • 状态不在 (4,6) 中
  • ‘002’和‘005’之间的代码 1
  • (code2=null 且 code3=null) 或 (('BIGA', 'BIGP') 中的 code2 且 code3=null) 或 (code2=NULL 且 code3 = 'L')

如果 code1 ='002' AND group IN (48,59,60,87) 我必须选择一个地址
(非常感谢尼古拉·马尔科维诺维奇):

SELECT TOP 1000 o.order_Id
              , a.Address_Id
              , a.Zip
            --, *
FROM orders o
CROSS APPLY
(
 select TOP 1
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
  ORDER BY case a.Type 
                when 'D2' then 1 
                when 'K1' then 2 
                else 3 
            end,
        a.ADD_DATE
) a
WHERE
 o.Status NOT IN (4, 6)
 AND code1='002'
 AND group IN (48,59,60,87)
 AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L'))

对于满足最高标准并获得 code1 ='002' AND group NOT IN (48,59,60,87) 的所有其他订单,我必须为已验证 =1 的订单选择所有地址

收集这些地址后,我将能够检查特定的邮政公司是否可以将我的邮件递送到这些地址(我将检查另一个包含邮政编码的表)

我正在考虑进行全部联合,采用第一个选择并与第二个进行联合,这将返回 code1 ='002' 和组 NOT IN (48,59,60,87) 的所有地址。

但也许无需联合所有就可以做到这一点?

这是我想要得到的最终结果:

CODE1        TYPE        COUNT_OF_ORDERS        COUNT_OF_ADDRESSES     COMPANY1  OTHER
'001'        'NORMAL'    125                    150                    110       40
'002'        'NORMAL'    100                    122                    100       22
'003'        'NORMAL'    150                    110                    100       10
'004'        'NORMAL'    200                    220                    220       0
'005'        'NORMAL'    220                    240                    210       30
'005'        'PRIORITY'  100                    110                    110       0
'SX1'        'PRIORITY'  100                    100                    20        80

因此,如果我的类型是“正常”,我必须检查订单地址是否存在于具有正常邮政编码的表中,如果它的类型是“优先”,我必须检查带有优先级代码的表。

如果特定表中存在代码,我将 +1 添加到 COMPANY1 列,如果没有添加到 OTHER,则这些列的总和必须是我的地址的总和。


这是我设法完成的查询(在@Nikola Markovinović 的帮助下)

SELECT TOP 1000 o.order_Id
              , a.Address_Id
              , a.Zip
            --, *
FROM orders o
CROSS APPLY
(
 select TOP 1
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
    AND code1='002'
    AND o.[group] IN (48,59,60,87)
  ORDER BY case a.Type 
                when 'D2' then 1 
                when 'K1' then 2 
                else 3 
            end,
        a.ADD_DATE
  UNION ALL
 select 
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
    AND ((code1='002' AND o.[group] NOT IN (48,59,60,87)) OR code1 IN ('001', '003', '004', '005'))
    --I'm not shure of that top line, it work's but mayby it con de written better
    AND Verified = 1
) a
WHERE
 o.Status NOT IN (4, 6)
 AND ((code2 IS NULL AND code3 IS NULL) 
    OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) 
    OR (code2 IS NULL AND code3 = 'L'))

您可以轻松过滤地址([group] IN (48,59,60,87) OR Verified = 1),但是调整 TOP 1 会让事情变得荒谬(TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end)。所以我建议你这样做union all但仅适用于地址:

SELECT TOP 1000 o.order_Id
              , a.Address_Id
              , a.Zip
            --, *
FROM orders o
CROSS APPLY
(
 select TOP 1
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
    AND o.[group] IN (48,59,60,87)
  ORDER BY case a.Type 
                when 'D2' then 1 
                when 'K1' then 2 
                else 3 
            end,
        a.ADD_DATE
  UNION ALL
 select 
        a.Address_Id,
        a.Zip
   from address a
  WHERE a.order_Id = o.order_Id
    AND o.[group] NOT IN (48,59,60,87)
    AND Verified = 1
) a
WHERE
 o.Status NOT IN (4, 6)
 AND code1='002'
 AND ((code2 IS NULL AND code3 IS NULL) 
    OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) 
    OR (code2 IS NULL AND code3 = 'L'))

附:如果订单可能没有地址,请将 CROSS APPLY 替换为 OUTER APPLY。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TSQL 选择一行或多行进行连接 的相关文章

  • 使用 SQL 计算每小时平均值

    我有一个包含 2 个字段的 SQL 表 时间戳和值 以下是部分数据的摘录 2005 02 17 13 31 00 2 2005 02 17 13 46 00 3 2005 02 17 14 01 00 1 7 2005 02 17 14 1
  • ASP .Net 报表查看器控件中的本地报表与服务器报表

    在我们当前工作的 ASP Net 站点之一中 我们有大量 SSRS 报告 我们对该站点进行了表单身份验证 并且已在报表服务器中创建并部署了报表 当我们设置报表查看器控件来访问服务器报表时 我们遇到了很多身份验证问题 我只是想知道使用本地报告
  • 将每月数据分解为每日数据

    我有一家公司的预算数据 采用以下每月格式 SqlFiddle 链接在这里 http sqlfiddle com 3 09263 1 Dept YearMonth Budget 001 201301 100 001 201302 110 00
  • 循环遍历服务器上的数据库,并更新数据

    我有一台带有多个数据库的服务器 我需要循环访问这些数据库并更改每个数据库中的一个记录 一个表中的值 如何才能做到这一点 EXEC sp MSForEachDB Use UPDATE dbo MyTable SET MyValue 999
  • 如何返回以列名作为第一行的 T-SQL 查询

    我正在编写一个 SSIS 包来将数据从 SQL Server 2012 数据库输出到 CSV为客户归档 要求是第一行是列名称 下面是我为数据流任务中的源编写的查询 问题是 它总是将列名返回为最后一行 而不是第一行 为什么 我该如何实现这一目
  • 如何在 SQL Server Management Studio 中查看 SSIS 包?

    啊 我通过导入向导创建了 SSIS 包 但使用 Management Studio 在服务器上找不到 SSIS 包 当我进入作业调度程序时 执行 SSIS 包也没有显示为选项 当您启动 SSMS 时 它允许您选择服务器类型和服务器名称 在服
  • 选择表中的人员并排除妻子,但合并他们的名字

    我有一张桌子Person PersonID FirstName LastName 1 John Doe 2 Jane Doe 3 NoSpouse Morales 4 Jonathan Brand 5 Shiela Wife And a R
  • Sql Server 字符串到日期的转换

    我想像这样转换一个字符串 10 15 2008 10 06 32 PM 转换为 Sql Server 中的等效 DATETIME 值 在 Oracle 中 我会这样说 TO DATE 10 15 2008 10 06 32 PM MM DD
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • 如何将特定行保留为查询(T-SQL)的第一个结果?

    我正在编写一个 SQL 查询来获取 Report Builder 3 0 中报表的参数列表 我需要在结果中添加一个带有值 All 的额外行 如下所示 SELECT All UNION SELECT DISTINCT Manager FROM
  • 有没有类似 ActiveRecord::Migration for .NET 的东西?

    我玩过 ruby on Rails ActiveRecord Migration类 我喜欢保持数据库模式版本化是多么容易 我想在我的 ASP NET 项目中做类似的事情 我想知道是否有人听说过一个可以执行以下操作的工具ActiveRecor
  • T-SQL 按最旧日期和唯一类别选择行

    我正在使用 Microsoft SQL 我有一个表 其中包含按两个不同类别存储的信息和一个日期 例如 ID Cat1 Cat2 Date Time Data 1 1 A 11 00 456 2 1 B 11 01 789 3 1 A 11
  • 仅当所有记录都匹配时 SQL 连接

    我有3张桌子 CP carthead idOrder CP cartrows idOrder idCartRow CP shipping idCartRow idShipping dateShipped 每个 idOrder 可以有多个 i
  • 将 SQL Server 日期时间转换为较短的日期格式

    我有一个datetimeSQL Server 中的列为我提供了这样的数据10 27 2010 12 57 49 pm我想查询此列 但只需让 SQL Server 返回年月日 例如 2010 10 27或类似的东西 我应该研究哪些功能 我应该
  • 如何在事务中使用链接服务器插入远程表?

    我的链接服务器设置正确 我能够执行以下查询 插入 远程服务器 表 SELECT FROM 本地服务器 表 然而当我做同样的事情时交易内 开始传输 插入 远程服务器 表 SELECT FROM 本地服务器 表 提交交易 我收到类似的错误 用于
  • 对于返回超过1个值的SQL select,当Id为GUID时它们如何排序?

    我想知道 SQL Server 如何对查询返回的数据进行排序 并且各个表的 Id 列都是 uniqueidentifier 类型 我在创建所有 GUID 时使用 NHibernate GuidComb 并执行以下操作 Sheet sheet
  • 将 Indentity(自动增量)添加到现有表的主键[重复]

    这个问题在这里已经有答案了 可能的重复 向现有列添加标识 https stackoverflow com questions 1049210 adding an identity to an existing column 如何设置建表后自
  • 错误:不支持的 PIVOT 列类型:文本

    我正在尝试执行 PIVOT 但出现错误 我正在尝试查看哪些患者接受了多次间隔治疗 该列是文本类型 我尝试在查询中将列类型转换为 VARCHAR MAX 但仍然收到错误 这是我的代码 SELECT patientname IntervalNa
  • SQL 查询将文本数据存储在 Varbinary(max) 中

    有没有办法让 varbinary 在 SQL Server 中接受文本数据 这是我的情况 我有相当大量的 XML 我计划以 压缩 格式存储它们 这意味着 Varbinary 但是 当我进行调试时 我希望能够翻转配置开关并以纯文本形式存储 以
  • T-SQL 是否可以通过单个快速操作进行更新/插入

    假设我有一个表 我想插入一行 新行的键可能已经与表中现有行的键匹配 在这种情况下我想更新现有行 或者 它可能不存在于表中 在这种情况下应插入新行 执行此类操作最有效的方法是什么 我想先做一个SELECT 也许与EXISTS 查看是否存在特定

随机推荐

  • 单元测试验证是否调用了伴生对象方法(模拟伴生对象)

    当切换到 Kotlin 时 静态方法被移至伴生对象中 但是 没有明显的方法来对调用这些 静态方法 的其他方法进行单元测试 在Java中 我们可以使用PowerMockito的MockStatic SomeClass class 来验证被测方
  • 如何确定应用程序是作为移动应用程序还是桌面应用程序运行?

    我怎样才能知道当前的应用程序类型是什么 即它是在移动设备上运行还是作为桌面 Air 应用程序运行 我试过这个 if FlexGlobals topLevelApplicatoin as WindowedApplication desktop
  • 如何在 mac osx 上的子进程中打开文件

    我想打开一个文件并等待下一条指令的执行 直到文件未关闭 我点击了链接如何在 mac OSX 10 8 2 上用 python 打开文件 https stackoverflow com questions 19273210 how to op
  • Internet Explorer 嵌套表单发布

    我正在使用 ASP NET MVC 创建一个发布到 Paypal 沙箱的页面 我发布到 Paypal 网站的表单嵌套在父表单内 我使用的是 Internet Explorer 7 由于某种原因 嵌套表单发布到我的本地计算机而不是 paypa
  • 从 jQuery 设置 $scope 变量的值

    我想从 jQuery 函数为 scope 中的变量设置一个值 如下代码所示 一切都很好 但新的价值体现在用户界面上 app controller myCtrl function scope scope carname Volvo sampl
  • 提取 R 中 lme4 模型随机效应的后验估计和可信区间

    我需要提取后验估计和间隔随机效应从我的模型 出于说明目的 与我正在使用的数据集类似的数据集是ChickWeight基础 R 中的数据集 我提取后验估计和区间的方式固定效应就像这样 load package library lme4 mode
  • Java - 将字符串(4 个字符)转换为 int 并返回的乐趣

    请不要问为什么 但我必须将字符串 最多 4 个字符 存储在整数值 因此 4 个字节 中 首先我写了这个并且它有效 String value AAA int sum IntStream range 0 value length limit 4
  • 与 UltraHD 兼容的 CHtmlView

    CHtmlView与 UltraHD 分辨率不兼容 实现 UltraHD 感知并不仅仅在于使用正确的 HTML CSS 打印预览机制失败并裁剪页面 许多个月前 微软承认这是一个问题 但没有解决它 我的应用程序大量使用CHtmlView用于显
  • 具有参数化脚本块的 PowerShell 函数

    我想创建一个枚举一些数据的 PowerShell 函数 并在所有出现的情况下触发脚本块 现在我已经 这不是实际的代码 但它说明了我的问题 function Invoke TenTimes CmdletBinding param Parame
  • discord.py send_message 用法

    我已经开始致力于一个项目来加速我对 python 的学习 我正在尝试重新创建一个我经常使用的不和谐机器人 因为我已经习惯了它的功能 下面是我当前的代码 import discord from discord import User from
  • 使用 Visual Studio 在线构建定义构建 SSIS 解决方案....dtproj 不受 MSBuild 支持,无法构建

    我通过 Visual Studio Online 创建了一个构建定义 用于构建 SSIS 项目 dtproj 构建似乎成功 但出现一条警告 指出 MSBuild 不支持 dtproj 无法构建 SSDT已安装在构建服务器上 有谁知道为什么会
  • Flask-后退按钮即使在注销后也会返回到会话

    我正在使用 Flask 创建一个需要登录和注销的网站 我正在使用 Flask Security 来帮助解决这个问题 我的问题是 注销后 如果点击后退按钮 我将返回到用户页面 有没有办法防止在退出后按 Flask 中的后退按钮返回会话 您可以
  • 通过Java运行cmd命令

    我发现了几个通过 Java 类运行 cmd 命令的代码片段 但我无法理解它 这是打开cmd的代码 public void excCommand String new dir Runtime rt Runtime getRuntime try
  • 当飞行模式打开时 CLLocationManager 如何获取位置

    我的应用程序使用 CLLocationManager 从设备获取位置更新 我曾假设当设备处于飞行模式时 我不会获得位置更新 但是我愿意 我之所以这么认为 是因为 Apple 表示飞行模式会关闭 Wifi 蜂窝网络 蓝牙和 GPS 看 htt
  • response.authResponse 为 null

    我编写了以下代码来检查 facebook 的登录状态 FB getLoginStatus function response if response status connected var user id response authRes
  • 为什么 XmlNodeList 是一次性的?

    我找不到这个问题的答案 只是出于好奇 为什么XmlNodeList 类 http msdn microsoft com en us library system xml xmlnodelist 28v vs 110 29 aspx在 NET
  • 如何使用 MsDeploy 设置 iisApp Provider 的部署路径?

    我正在为我的 Web 应用程序创建 Web 部署包 zip 文件 我发现我可以通过在打包站点期间包含 pubxml 并在构建期间使用 PublishProfile 属性来指定该配置文件来指定应用程序的站点名称 pubxml 有
  • 在 Vala 中使用 Glib.Settings 时如何处理错误?

    我在 Vala 应用程序中使用 Glib Settings 我想确保即使架构或密钥不可用 我的程序也能正常工作 所以我添加了一个 try catch 块 但是如果我使用不存在的密钥 程序就会出现段错误 据我了解 它甚至没有到达 catch
  • 层次结构中具有可选元素的 XPath

    正如在这个堆栈溢出答案 https stackoverflow com questions 4608097 xpath to select a table row that has a cell containing specified t
  • TSQL 选择一行或多行进行连接

    这是类似于以下的问题 TSQL 按 2 个条件之一选择行 https stackoverflow com questions 10208849 tsql select rows by one from 2 conditions 但结果与我想