【问题标题】:Preferential Select Query优先选择查询
【发布时间】:2021-03-25 18:00:50
【问题描述】:

我们试图解决的问题最好通过以下说明性示例来说明:

CREATE TABLE table_1
(
  id  INT UNSIGNED AUTO_INCREMENT,
  colA INT,
  colB  VARCHAR(10),
   
  PRIMARY KEY(id)
);


CREATE TABLE table_2
(
  id  INT UNSIGNED AUTO_INCREMENT,
  colY INT,
  colZ  VARCHAR(10),
   
  PRIMARY KEY(id)
);


INSERT INTO table_1(colA, colB) VALUES(1, 'NPD5A6V9EI'), (2, 'ISO4IK42YQ'), (4, 'J12QAN4O42'), (6,'V8YTZFHCU4');

INSERT INTO table_2(colY, colZ) VALUES(3, 'RBUNWLO753'), (4, 'X2BCEY7O8B'), (5, 'BNUS7R4225'), (6, '72NOWCTH5G');

我们想根据table_1colA 的值来选择我们的结果,但是如果这没有返回结果,我们想根据table_2colY 的值返回我们的结果.换句话说,从table_2 选择是从table_1 选择的备份。只有当两个表都不满足条件时,查询才会返回NULL

伪 SQL 查询可能是:

SELECT colB FROM table_1 where colA = 3 OR SELECT colZ FROM table_2 where colY = 3;

查询应根据以下 I/O 表返回输出:

I    O
=    =
1    NPD5A6V9EI -- From table_1
2    ISO4IK42YQ -- From table_1
3    RBUNWLO753 -- From table_2
4    J12QAN4O42 -- From table_1 (has precedence over table_2 entry) 
5    BNUS7R4225 -- From table_2
6    V8YTZFHCU4 -- From table_1 (has precedence over table_2 entry)
9    NULL

请提出以下解决方案:

  1. 利用最新的数据库功能(供后代使用)
  2. 使用 MySQL 版本 5.6.51(用于我们的应用程序)

【问题讨论】:

  • 使用LEFT JOIN。如果连接的列是 NULL,则使用来自另一个表的列与 COALESCEIFNULL
  • @Barmar left join 不起作用,因为表 A 中缺少某些键值,这时表 B 应该启动。联合似乎是更好的方法。
  • 请解释一下 - 所需输出 (9, NULL) 的最后一行来自哪里?

标签: mysql mariadb


【解决方案1】:

编写一个子查询,生成您想要的所有I 行。

然后左连接这两个表,并使用IFNULLtable_1中获取匹配值,而不是table_2

SELECT ids.id AS I, IFNULL(t1.colB, t2.colZ) AS O
FROM (SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3 ... UNION ALL SELECT 9) AS ids
LEFT JOIN table_1 AS t1 ON t1.colA = ids.id
LEFT JOIN table_2 AS t2 ON t2.colY = ids.id
ORDER BY ids.id

【讨论】:

    【解决方案2】:

    我只是不知道你的最后一行是从哪里得到的。

    在 Myql 8 中你也可以使用窗口函数 ROW_NUMBER

    其余的都是自解释的,排序来自 colA 和 Col1,当有相同的数字时,第二列 orderby2 来并首先为第一个表排序

    CREATE TABLE table_1
    (
      id  INT UNSIGNED AUTO_INCREMENT,
      colA INT,
      colB  VARCHAR(10),
       
      PRIMARY KEY(id)
    );
    
    
    CREATE TABLE table_2
    (
      id  INT UNSIGNED AUTO_INCREMENT,
      colY INT,
      colZ  VARCHAR(10),
       
      PRIMARY KEY(id)
    );
    
    
    INSERT INTO table_1(colA, colB) VALUES(1, 'NPD5A6V9EI'), (2, 'ISO4IK42YQ'), (4, 'J12QAN4O42'), (6,'V8YTZFHCU4');
    
    INSERT INTO table_2(colY, colZ) VALUES(3, 'RBUNWLO753'), (4, 'X2BCEY7O8B'), (5, 'BNUS7R4225'), (6, '72NOWCTH5G');
    
    SELECT @i := @i +1 AS I,
    colB AS O
    FROM
    (SELECT colA as orderby1,colB,1 ordberby2 froM table_1 
    UNION 
    SELECT colY, colZ,2 froM table_2 ) t1,(SELECT @i := 0) t2
    ORDER BY orderby1,ordberby2
    
    我 | ○ -: | :--------- 1 | NPD5A6V9EI 2 | ISO4IK42YQ 3 | RBUNWLO753 4 | J12QAN4O42 5 | X2BCEY7O8B 6 | BNUS7R4225 7 | V8YTZFHCU4 8 | 72NOWCTH5G

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多