簡體   English   中英

MySQL左外部聯接與where子句

[英]MySQL Left outer join with where clause

我正在嘗試使用以下MySQL查詢:

SELECT *
FROM top_lines t
LEFT OUTER JOIN last_24_topline AS l ON l.`member_no` = t.`member_no` 
    AND l.`mfg` = t.`line_no`
WHERE l.account_no = 32049 OR l.account_no IS NULL

但是,這沒有返回任何行,因為last_24_topline中沒有account_no行匹配。 從我所了解和閱讀的所有內容來看,即使在last_24_topline中沒有行匹配,該查詢仍應返回top_lines中的所有行,因為我正在檢查值或null,但事實並非如此。 MySQL(5.7.2)中是否有任何選項或設置會導致此行為? 僅作為參考,此查詢可按預期工作:

SELECT *
FROM top_lines t
LEFT OUTER JOIN last_24_topline l ON l.`member_no` = t.`member_no` 
    AND l.`mfg` = t.`line_no`
    AND l.`account_no` = 32049

但是,由於我使用的是實體框架,因此我無法使用此構造,並且只能將列傳遞而不能將值傳遞給聯接


CREATE TABLE `last_24_topline` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `member_no` varchar(30) NOT NULL,
  `branch_no` int(11) DEFAULT NULL,
  `employee_no` varchar(25) DEFAULT NULL,
  `account_no` varchar(25) DEFAULT NULL,
  `salesperson_name` varchar(255) DEFAULT NULL,
  `customer_name` varchar(255) DEFAULT NULL,
  `mfg` varchar(5) DEFAULT NULL,
  `mfg_description` varchar(255) DEFAULT NULL,
  `last_three` decimal(10,2) DEFAULT '0.00',
  `last_twelve` decimal(10,2) DEFAULT '0.00',
  `ly_last_three` decimal(10,2) DEFAULT '0.00',
  `ly_last_twelve` decimal(10,2) DEFAULT '0.00',
  PRIMARY KEY (`id`),
  KEY `ix_branch_no` (`branch_no`),
  KEY `ix_employee_no` (`employee_no`),
  KEY `ix_member_line_account` (`member_no`,`mfg`,`account_no`),
  KEY `ix_member_line` (`member_no`,`mfg`),
  KEY `ix_account_no` (`account_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `top_lines` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `member_no` varchar(30) NOT NULL,
  `line_no` varchar(5) NOT NULL,
  `line_description` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_line_no` (`member_no`,`line_no`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=latin1

insert  into `top_lines`(`id`,`member_no`,`line_no`,`line_description`) values (1,'520','772','FED ROTOR/DRUM');
insert  into `top_lines`(`id`,`member_no`,`line_no`,`line_description`) values (2,'520','952','FED SST CERAMIC');
insert  into `top_lines`(`id`,`member_no`,`line_no`,`line_description`) values (3,'520','954','FED SST FRICTION');
insert  into `top_lines`(`id`,`member_no`,`line_no`,`line_description`) values (4,'520','162','EVS FRICTION');

INSERT INTO `last_24_topline` (`id`, `member_no`, `branch_no`, `employee_no`, `account_no`, `salesperson_name`, `customer_name`, `mfg`, `mfg_description`, `last_three`, `last_twelve`, `ly_last_three`, `ly_last_twelve`) VALUES('1','520','0','10856','463854','FORD, JAMES,','JIFFY LUBE','459','FEDERATED AIR FILTER','0.00','15.21','0.00','0.00');
INSERT INTO `last_24_topline` (`id`, `member_no`, `branch_no`, `employee_no`, `account_no`, `salesperson_name`, `customer_name`, `mfg`, `mfg_description`, `last_three`, `last_twelve`, `ly_last_three`, `ly_last_twelve`) VALUES('2','520','0','10856','463854','FORD, JAMES,','JIFFY LUBE','460','FILTERS','0.00','0.00','0.00','16.48');
INSERT INTO `last_24_topline` (`id`, `member_no`, `branch_no`, `employee_no`, `account_no`, `salesperson_name`, `customer_name`, `mfg`, `mfg_description`, `last_three`, `last_twelve`, `ly_last_three`, `ly_last_twelve`) VALUES('3','520','0','10856','463854','FORD, JAMES,','JIFFY LUBE','863','SMP T SERIES','0.00','0.00','0.00','50.67');

我希望即使在last_24_topline中沒有數據匹配的情況下,第一個查詢也會產生一個結果集,該結果集包含top_lines中的所有行,並且last_24_topline中的列為空值。

預期成績: 預期成績


因此,將相同的架構創建到另一個數據庫中,然后僅插入我上面提供的示例數據,就可以得到預期的結果。 我正在通過將完整的行復制到第二個數據庫來進行進一步測試,以查看它是否仍能達到預期的結果。

更新將所有數據復制到新表中會使問題重新出現。 我正在努力降低復制該問題所需的最低限度。

使用連接中涉及的列而不是l.account_no這樣,如果左表中沒有匹配的行,則將返回top_lines中的行。

SELECT *
FROM top_lines t
LEFT OUTER JOIN last_24_topline AS l ON l.`member_no` = t.`member_no`
       AND l.`mfg` = t.`line_no`
WHERE l.account_no = 32049 OR l.`member_no` IS NULL

或者將帳號過濾器直接放入聯接中

SELECT *
FROM top_lines t
LEFT OUTER JOIN last_24_topline AS l ON l.`member_no` = t.`member_no`
       AND l.`mfg` = t.`line_no`
       AND l.account_no = 32049 

也嘗試檢測空字符串,可能字段不是NULL,而是空字符串。

SELECT *
FROM
    top_lines t
LEFT JOIN
    last_24_topline AS l ON l.member_no = t.member_no AND l.mfg = t.line_no
WHERE
    (l.account_no = '' OR l.account_no = '32049' OR l.account_no IS NULL)

如果您需要更多幫助,我將需要“表last_24_topline”的示例數據以及加入后的預期輸出。

再試一次,您可以使用以下方法:

SELECT *
FROM
    top_lines t
LEFT JOIN
    last_24_topline AS l ON l.member_no = t.member_no AND l.mfg = t.line_no
WHERE
    l.id IS NULL
OR
    (l.id IS NOT NULL AND l.account_no = '32049')

在聯接中沒有帳號的查詢中,聯接確實匹配了last_24_toplines表中的行,但是它與where子句中的帳號匹配,因此該聯接被過濾掉,因此不被視為top_lines中沒有匹配的行last_24_topline中的行。

因此,例如top_line表中的這一行

在此處輸入圖片說明

將匹配last_24_toplines中的這一行

在此處輸入圖片說明

但兩者都將被過濾掉,因為account_no與where子句中的內容不匹配: WHERE l.account_no = 32049 OR l.account_no IS NULL

在聯接中具有account_no的查詢的查詢仍將與top_line中的行匹配,但不會與last_24_topline中的行匹配,因此您將獲得具有top_lines數據的行,其中last_24_topline為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM