अलग-अलग चाइल्ड टेबल के लिए एक ही कमांड में मल्टीपल राइट जॉइन कैसे करें?

Aug 17 2020

अनुवर्ती छवि पर आपको 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            |

जवाब

1 nbk Aug 17 2020 at 05:22

आप जो चाहते हैं वह 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 पर देखें