【问题标题】:Querying from 1 table on multiple conditions without generating multiple lines在多个条件下从 1 个表中查询而不生成多行
【发布时间】:2012-07-27 11:29:35
【问题描述】:

我正在使用的数据库(我无法更新或修改其中的任何内容,我只能查询它以获取我正在创建的报告)以一种相当奇怪的方式设置。有时信息需要一百万个中间表才能获取,而其他时候所有内容都在同一个表中。

要获得我需要的唯一地址,我必须加入 3 个表(包含发票信息的表到包含为每个组织分配数字的键的表到包含数据库中所有组织的表)。三张表中的最后一张包含每家公司,但公司可以具有相同的不同角色(例如,一家公司可以是供应商,一个可以是客户,一个可以是合作伙伴等),因此该表有“类型”列表示角色,其中 1=供应商、2=客户等。

示例代码和数据如下(抱歉,我似乎无法在此处正确格式化表格):

select * from a
join b on a.id=b.id
join c on b.orgid=c.orgid

数据:

a.OrderID    b.Organization    c.Role
-----------------------------------------    
   123       Acme Inc.            1
   123       Roadrunner Inc.      2
   123       Venture Co.          2

我进行的查询需要提取订单 ID、供应商、客户和合作伙伴,但无论我如何加入它或如何尝试使用 WITH 语句,它都会生成 3 行,每行,三个角色之一被命名,其余为 NULL。

有人可以帮忙吗?

非常感谢您花时间阅读这个冗长的问题。

【问题讨论】:

  • 听起来您在角色数据库中有重复的记录,而公司的角色为 NULL。要么,要么您的查询实际上是在使用左/右外连接。你能检查这些东西吗?
  • 如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ({ }) 以很好地格式化和语法突出显示它
  • +1 对表结构和示例代码的请求。另外,我想指出您面临的问题很常见,而不是“奇怪”。拥有三个表仅仅意味着数据库旨在处理多对多关系(尽管我觉得奇怪的是订单可以属于多个客户)。如果您使用(几乎)任何数据库,您会经常发现通过关系映射表连接两个信息表。
  • 需要更多关于如何连接表的信息。你能给我们相关的表模式吗?

标签: sql sql-server-2008 tsql join conditional-statements


【解决方案1】:

这会让你更接近你想要的结果吗

;with cteOrgRoles as
(
select b.id, b.orgid, organization, role
from b 
    inner join c on b.orgid = c.orgid
)
    select 
        a.*,
        r1.organization as role1,
        r2.organization as role2
    from a
        left join cteOrgRoles r1 on a.id = r1.id and r1.role=1
        left join cteOrgRoles r2 on a.id = r2.id and r2.role=2

如果您在其他角色中有多个条目,您将在各个角色列中获得重复项

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2016-08-16
    • 2010-09-09
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多