अलग-अलग चाइल्ड टेबल के लिए एक ही कमांड में मल्टीपल राइट जॉइन कैसे करें?
अनुवर्ती छवि पर आपको 3 तालिकाएँ दिखाई देती हैं: A, B, C. A: वह तालिका है जो B और C से विदेशी कुंजियाँ रखती है
यदि मैं उस विदेशी कुंजी पर ए और बी के बीच एक सही जुड़ता हूं, तो यह काम करता है, जिसका अर्थ है कि मुझे कॉलम fooB से डेटा मिलता है। FooC के साथ A और C के बीच समान है।
लेकिन अगर मैं दोनों सही जोड़ एक ही आदेश के तहत यह शून्य के साथ विफल रहता है
+-------------+---------------+
| fooB | fooC |
+-------------+---------------+
| NULL | abc |
| NULL | xyz |
* यह नीचे पोस्ट किए गए कमांड के साथ छवि के रूप में थोड़ा अलग है, क्योंकि यह सीधे वास्तविक तैनाती से आता है, हालांकि नीचे के सेमी अभी भी दिखाते हैं कि दोनों कॉलम दिखाई नहीं देते हैं।
मैंने मिक्स लेफ्ट जॉइन करने की कोशिश की है, राइट जॉइन, एक्सटर्नल जॉइन सब एक ही रिजल्ट के साथ। मैं इस बारे में गुगली कर चुका हूं, लेकिन जिस तरह से मेरा सवाल तैयार किया गया है वह अजीब है और मुझे सिर्फ एक टेबल के लिए पारंपरिक राइट जॉइन वापस मिल रहे हैं।
एक कमांड में काम करने के लिए मुझे यह कैसे मिलेगा? नीचे CMDS:
ऊपर के रूप में एक ही आदेश, लेकिन पाठ में, के रूप में टिप्पणियाँ पाठ के बजाय छवियों के लिए पूछ रहे हैं:
MariaDB [joinPOC]> select fooB from tableA right join tableB on tableB_idtableB=tableB.idtableB;
+------+
| fooB |
+------+
| b1 |
| b2 |
| b3 |
+------+
3 rows in set (0.001 sec)
MariaDB [joinPOC]> select fooC from tableA right join tableC on tableC_idtableC=tableC.idtableC;
+------+
| fooC |
+------+
| c1 |
| c2 |
| c3 |
+------+
3 rows in set (0.001 sec)
MariaDB [joinPOC]> select fooB from tableA right join tableB on tableB_idtableB=tableB.idtableB right join tableC on tableC_idtableC=tableC.idtableC;
+------+
| fooB |
+------+
| b1 |
| b2 |
| b3 |
+------+
- यह पूरी तरह से है -
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema joinPOC
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `joinPOC` ;
-- -----------------------------------------------------
-- Schema joinPOC
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `joinPOC` ;
USE `joinPOC` ;
-- -----------------------------------------------------
-- Table `joinPOC`.`tableB`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `joinPOC`.`tableB` (
`idtableB` INT NOT NULL,
`fooB` VARCHAR(10) NOT NULL,
PRIMARY KEY (`idtableB`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `joinPOC`.`tableC`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `joinPOC`.`tableC` (
`idtableC` INT NOT NULL,
`fooC` VARCHAR(10) NOT NULL,
PRIMARY KEY (`idtableC`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `joinPOC`.`tableA`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `joinPOC`.`tableA` (
`idtableA` INT NOT NULL,
`fooA` VARCHAR(10) NOT NULL,
`tableB_idtableB` INT NOT NULL,
`tableC_idtableC` INT NOT NULL,
PRIMARY KEY (`idtableA`),
INDEX `fk_tableA_tableB_idx` (`tableB_idtableB` ASC),
INDEX `fk_tableA_tableC1_idx` (`tableC_idtableC` ASC),
CONSTRAINT `fk_tableA_tableB`
FOREIGN KEY (`tableB_idtableB`)
REFERENCES `joinPOC`.`tableB` (`idtableB`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tableA_tableC1`
FOREIGN KEY (`tableC_idtableC`)
REFERENCES `joinPOC`.`tableC` (`idtableC`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
-- -----------------------------------------------------
-- Data for table `joinPOC`.`tableB`
-- -----------------------------------------------------
START TRANSACTION;
USE `joinPOC`;
INSERT INTO `joinPOC`.`tableB` (`idtableB`, `fooB`) VALUES (1, 'b1');
INSERT INTO `joinPOC`.`tableB` (`idtableB`, `fooB`) VALUES (2, 'b2');
INSERT INTO `joinPOC`.`tableB` (`idtableB`, `fooB`) VALUES (3, 'b3');
COMMIT;
-- -----------------------------------------------------
-- Data for table `joinPOC`.`tableC`
-- -----------------------------------------------------
START TRANSACTION;
USE `joinPOC`;
INSERT INTO `joinPOC`.`tableC` (`idtableC`, `fooC`) VALUES (1, 'c1');
INSERT INTO `joinPOC`.`tableC` (`idtableC`, `fooC`) VALUES (2, 'c2');
INSERT INTO `joinPOC`.`tableC` (`idtableC`, `fooC`) VALUES (3, 'c3');
COMMIT;
-- -----------------------------------------------------
-- Data for table `joinPOC`.`tableA`
-- -----------------------------------------------------
START TRANSACTION;
USE `joinPOC`;
INSERT INTO `joinPOC`.`tableA` (`idtableA`, `fooA`, `tableB_idtableB`, `tableC_idtableC`) VALUES (1, 'a1', 1, 1);
INSERT INTO `joinPOC`.`tableA` (`idtableA`, `fooA`, `tableB_idtableB`, `tableC_idtableC`) VALUES (2, 'a2', 2, 2);
INSERT INTO `joinPOC`.`tableA` (`idtableA`, `fooA`, `tableB_idtableB`, `tableC_idtableC`) VALUES (3, 'a3', 3, 3);
COMMIT;
एकल कमांड में वांछित आउटपुट:
+-------------+---------------+
| fooB | fooC |
+-------------+---------------+
| b1 | c1 |
| b2 | c2 |
जवाब
आप जो चाहते हैं वह INNER JOIN है।
पंक्तियों को बाहर करने के लिए, आप सामान्य WHERE क्लॉज़ का उपयोग कर सकते हैं या इसे ON क्लॉज़ में कर सकते हैं
स्कीमा (MySQL v8.0)
क्वेरी # 1
SELECT
b.fooB, c.fooC
FROM
tableA a
INNER JOIN
tableB b ON a.tableB_idtableB = b.idtableB
INNER JOIN
tableC c ON a.tableC_idtableC = c.idtableC;
| fooB | fooC |
| ---- | ---- |
| b1 | c1 |
| b2 | c2 |
| b3 | c3 |
DB Fiddle पर देखें