【问题标题】:Flag based on combination of variables基于变量组合的标志
【发布时间】:2018-05-23 13:01:46
【问题描述】:

我有一个如下所示的表 A-

Column1 Column2
0001M   80050
0001M   80053
0001M   80076
0001T   0002T
0001T   34800
0001T   34802
0001T   34804
0001T   36000
0001U   80500
0001U   80502
0001U   81105
0001U   81106

CREATE TABLE mytable(
   Column1 VARCHAR(5) NOT NULL PRIMARY KEY
  ,Column2 VARCHAR(5) NOT NULL
);
INSERT INTO mytable(Column1,Column2) VALUES ('0001M','80050');
INSERT INTO mytable(Column1,Column2) VALUES ('0001M','80053');
INSERT INTO mytable(Column1,Column2) VALUES ('0001M','80076');
INSERT INTO mytable(Column1,Column2) VALUES ('0001T','0002T');
INSERT INTO mytable(Column1,Column2) VALUES ('0001T','34800');
INSERT INTO mytable(Column1,Column2) VALUES ('0001T','34802');
INSERT INTO mytable(Column1,Column2) VALUES ('0001T','34804');
INSERT INTO mytable(Column1,Column2) VALUES ('0001T','36000');
INSERT INTO mytable(Column1,Column2) VALUES ('0001U','80500');
INSERT INTO mytable(Column1,Column2) VALUES ('0001U','80502');
INSERT INTO mytable(Column1,Column2) VALUES ('0001U','81105');
INSERT INTO mytable(Column1,Column2) VALUES ('0001U','81106');

我有另一个表 B,其中包含以下列 -

ID  SubID
1   0001M
1   80050
1   80053
1   12500
2   0001T
2   0002T
2   34800
2   36000
2   12506
3   80500
3   80502
3   81106

CREATE TABLE mytable(
   ID    INTEGER  NOT NULL PRIMARY KEY 
  ,SubID VARCHAR(5) NOT NULL
);
INSERT INTO mytable(ID,SubID) VALUES (1,'0001M');
INSERT INTO mytable(ID,SubID) VALUES (1,'80050');
INSERT INTO mytable(ID,SubID) VALUES (1,'80053');
INSERT INTO mytable(ID,SubID) VALUES (1,'12500');
INSERT INTO mytable(ID,SubID) VALUES (2,'0001T');
INSERT INTO mytable(ID,SubID) VALUES (2,'0002T');
INSERT INTO mytable(ID,SubID) VALUES (2,'34800');
INSERT INTO mytable(ID,SubID) VALUES (2,'36000');
INSERT INTO mytable(ID,SubID) VALUES (2,'12506');
INSERT INTO mytable(ID,SubID) VALUES (3,'80500');
INSERT INTO mytable(ID,SubID) VALUES (3,'80502');
INSERT INTO mytable(ID,SubID) VALUES (3,'81106');

tableA 的 column1 和 column2 的值不应同时出现在 tableB 的每个不同 ID 列的 SubID 列中。如果发生,我需要标记为1。否则为0。例如,(0001M,80050)和(0001M,80053)不允许同时出现。由于这两种组合存在于表 B 的 ID=1 中,因此应标记为 1。

输出应该是这样的 -

ID  Flag
1   1
2   1
3   0

Reason Flag = 0 for ID=3 --> 由于 (80500, 80502) 和 (80502, 81106) 仅来自第 2 列(不能同时来自第 1 列和第 2 列),因此它们是允许的一起发生,它被标记为 0。我使用的是 SQL Server 2016 版本。

【问题讨论】:

  • 小心,如果表B中有很多相同ID的行,查询会很慢
  • 在什么基础上主键列允许表中的重复值?
  • 您的 Primary Key 设置不正确,每个表中相同的 Column1 / Id 的值重复
  • 你昨天也问过这个问题吗?我很肯定有人这样做了,但问题似乎已被删除。

标签: sql sql-server


【解决方案1】:
select
    b1.ID, 
    max(case 
            when exists (select 1 from tableA a where a.Column1=b1.SubId and a.Column2=b2.SubId)
    then 1 else 0 end) as flag
from
    tableB b1
    inner join table B b2 on b1.ID=b2.ID 
group by b1.ID

【讨论】:

    【解决方案2】:

    您也可以使用 JOINS 来完成此操作,如下所示。 逻辑是,如果我们从 tableB 中为每一列获取 tableA 中的 id 并且它们相同,那么 flag 应该是 1

    see live demo

    select
    distinct B.id, flag =case when b1.id = b2.id  then 1 else NULL end
    from 
    mytableA A 
    left join mytableB b1 on b1.subid=a.column1
    left join mytableB b2 on b2.subid=a.column2
    right join
    mytableB B 
    on B.id= case when b1.id = b2.id  then b1.id else NULL end
    

    【讨论】:

      【解决方案3】:

      嗯。 . .这很棘手。我认为这可以满足您的需求。

      select b.id,
             (case when count(*) > 0 then 1 else 0 end) as flag
      from (select distinct b.id from b) b cross join
           a join
           b b1
           on b1.subid = a.column1 and b1.id = b.id join
           b b2
           on b2.subid = a2.column2 and b2.id = b.id
      group by b.id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        相关资源
        最近更新 更多