【问题标题】:should I use self join [closed]我应该使用自我加入吗[关闭]
【发布时间】:2020-04-29 21:32:09
【问题描述】:

我在 mysql 中有一个表 (test_data)。 具有列名的示例数据如下

date    Company_name    company_id  Company_name    company_id  code    
01-04-2020  XYZ Ltd     001          ABC Ltd            002     80002   
01-04-2020  ABC Ltd     002          XYZ Ltd            001     80002   
01-04-2020  ABC Ltd     002          DEF Ltd            003     80002   
01-04-2020  DEF Ltd     003          ABC Ltd            002     80002   
01-04-2020  PQ Ltd      004          ABC Ltd            002     80002   

只需要过滤在特定日期他们之间有双向握手的人。例如在 01-04-2020 结果应该是

date    Company_name    company_id  Company_name    company_id  
01-04-2020  XYZ Ltd     001         ABC Ltd        002  
01-04-2020  ABC Ltd     002         XYZ Ltd        001  
01-04-2020  ABC Ltd     002         DEF Ltd        003     
01-04-2020  DEF Ltd     003         ABC Ltd        002

已使用自联接,但结果提供的行数超过所需的行数

【问题讨论】:

  • 请不要让我们做您的(家庭)工作。请参阅 How to Ask、其他 help center 链接、点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。

标签: python mysql sql join select


【解决方案1】:

存在:

select t.* from tablename t
where exists (
  select 1 from tablename
  where date = t.date and company_id1 = t.company_id2 and company_id2 = t.company_id1
)

我假设列名类似于:company_id1 和 company_id2,因为一个表中不能有 2 个同名的列。

【讨论】:

    【解决方案2】:

    使用这个。使用 self join 是个好主意。

    但我不得不重命名列名,因为相同不起作用

    架构 (MySQL v5.7)

    CREATE TABLE table1 (
      `date` VARCHAR(10),
      `Company_name1` VARCHAR(19),
      `company_id1` VARCHAR(20),
      `Company_name` VARCHAR(20),
      `company_id` VARCHAR(10),
      `code` INTEGER
    );
    
    INSERT INTO table1
      (`date`, `Company_name1`, `company_id1`, `Company_name`, `company_id`, `code`)
    VALUES
      ('01-04-2020', 'XYZ Ltd', 'AAAPL1234T', 'ABC Ltd', 'BBBLY1234K', '80002'),
      ('01-04-2020', 'ABC Ltd', 'BBBLY1234K', 'XYZ Ltd', 'AAAPL1234T', '80002'),
      ('01-04-2020', 'ABC Ltd', 'BBBLY1234K',  'DEF Ltd', 'EFGHI1234Y', '80002'),
      ('01-04-2020', 'DEF Ltd',  'EFGHI1234Y', 'ABC Ltd', 'BBBLY1234K', '80002'),
      ('01-04-2020', 'PQ Ltd', 'HIJKL1234T', 'ABC Ltd' , 'BBBLY1234K', '80002');
    

    查询 #1

    SELECT DISTINCT t1.*
    FROm table1 t1 INNER JOIN
    table1 t2 ON t1.Company_name1 = t2.Company_name AND t1.company_id1 = t2.company_id
    
    | date       | Company_name1 | company_id1 | Company_name | company_id | code  |
    | ---------- | ------------- | ----------- | ------------ | ---------- | ----- |
    | 01-04-2020 | ABC Ltd       | BBBLY1234K  | XYZ Ltd      | AAAPL1234T | 80002 |
    | 01-04-2020 | XYZ Ltd       | AAAPL1234T  | ABC Ltd      | BBBLY1234K | 80002 |
    | 01-04-2020 | DEF Ltd       | EFGHI1234Y  | ABC Ltd      | BBBLY1234K | 80002 |
    | 01-04-2020 | ABC Ltd       | BBBLY1234K  | DEF Ltd      | EFGHI1234Y | 80002 |
    

    View on DB Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2011-09-01
      相关资源
      最近更新 更多