SQL困惑的连接方法

时间:2018-06-10 23:44:02

标签: sql relational-database azure-sql-database relational-algebra

我一直在努力处理我构建的更大查询的某个部分。它基本上试图根据雇员中是否有一个,两个或三个银行账户,将员工的银行详细信息放在最多三列中。

My Quandry

我通过VisualStudio使用Azure SQL服务器。

数据库的上下文是一组雇佣参数,银行业务,税务信息,所有这些都需要连接并导出然后推送到API。我从旧的基础服务器中构建了旧的.csv表,因此有时候主键周围有些模糊,但每行都是唯一的,因此选择可以解决。

过去几天我在网上找不到任何东西,希望有人能指出我正确的方向。我不是在这里乞求代码。

有什么建议吗?干杯!

2 个答案:

答案 0 :(得分:0)

您尚未指定哪个数据库,因此我将尝试“大多数”通用解决方案。您需要根据数据库的特定语法调整此SQL。这是一个镜头:

select
    e.empid, e.name,
    a1.accountno as Account1, a1.bsb as BSB1,
    a2.accountno as Account2, a2.bsb as BSB2,
    a3.accountno as Account3, a3.bsb as BSB3
  from employee e
  left join (
    select accountno, bsb from account x1 where x1.empid = e.empid 
      limit 1
    ) a1
  left join (
    select accountno, bsb from account x2 where x2.empid = e.empid
      and x2.accountno not in (x1.accountno) 
      limit 1
    ) a2
  left join (
    select accountno, bsb from account x3 where x3.empid = e.empid 
      and x3.accountno not in (x1.accountno, x2.accountno) 
      limit 1
    ) a3

答案 1 :(得分:0)

诀窍是旋转,所以我将展示如何做到这一点 - 这里有条件聚合:

select t2.empid,
       max(case when seqnum = 1 then accountno end) as accountno_1,
       max(case when seqnum = 1 then bsb end) as bsb_1,
       max(case when seqnum = 2 then accountno end) as accountno_2,
       max(case when seqnum = 2 then bsb end) as bsb_2,
       max(case when seqnum = 3 then accountno end) as accountno_3,
       max(case when seqnum = 3 then bsb end) as bsb_3
from (select t2.*,
             row_number() over (partition by empid order by accountno) as seqnum
      from table2 t2
     ) t2
group by empid;

我会让你弄清楚如何加入其他信息。这真的不是那么难。

另请注意,帐户的原始排序不会保留。 SQL表表示无序集。您没有显示任何捕获原始订单的列,因此按订单号排序。如果您有订购列,请在order by

中使用它