T-Sql

當第二個表將返回更多行時如何連接 2 個表?

  • January 14, 2021

我試圖加入 2 個有條件的表 - 如果它匹配,我期望從另一個表中獲得所有結果。

目前不起作用的查詢:

SELECT (CASE WHEN ZL.NumerCzesci LIKE '%ZŁOŻENIE%' 
 THEN (SELECT NumerCzesci FROM PodZlozenie WHERE NumerPodZlozenia = ZL.NumerCzesci) ELSE ZL.NumerCzesci END) AS [NumerCzesci] FROM Zlozenie ZL LEFT JOIN PodZlozenie PD ON ZL.NumerZlozenia = PD.NumerPodZlozenia

桌子

$$ Zlozenie $$好像 :

CREATE TABLE [dbo].[Zlozenie] (
   [Id_Zlozenia]   INT          IDENTITY (1, 1) NOT NULL,
   [NumerZlozenia] VARCHAR (50) NOT NULL,
   [NumerCzesci]   VARCHAR (50) NOT NULL,
   PRIMARY KEY CLUSTERED ([Id_Zlozenia] ASC)
);
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-001-000-ROTOR-3-1-3','300-000-001 - WKŁADKA GÓRNA');
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-001-000-ROTOR-3-1-3','300-000-002 - WKŁADKA DOLNA');    
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-001-000-ROTOR-3-1-3','300-000-003 - UCHO ROTORA 11 RAM 3 SEKCJE');    
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-001-000-ROTOR-3-1-3','300-000-005 - RAMIĘ ROTORA 565mm');    
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-021-000 - DACH-BA3-1','300-021-001 - ZŁOŻENIE POKRYWY GÓRNEJ BA3-1');
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-021-000 - DACH-BA3-1','300-021-002 - ZŁOŻENIE POKRYWY DOLNEJ TYŁ BA3-1');
INSERT INTO Zlozenie (NumerZlozenia, NumerCzesci) VALUES ('300-021-000 - DACH-BA3-1','300-021-003 - ZŁOŻENIE POKRYWY DOLNEJ PRZÓD BA3-1');

桌子

$$ PodZlozenie $$好像 :

CREATE TABLE [dbo].[PodZlozenie] (
   [Id_PD]            INT          IDENTITY (1, 1) NOT NULL,
   [NumerPodZlozenia] VARCHAR (50) NOT NULL,
   [NumerCzesci]      VARCHAR (50) NOT NULL
);
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-001 - ZŁOŻENIE POKRYWY GÓRNEJ BA3-1','300-020-001 - BOK POKRYWY GÓRNEJ')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-001 - ZŁOŻENIE POKRYWY GÓRNEJ BA3-1','300-020-002 - DEKIEL POKRYWY GÓRNEJ')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-001 - ZŁOŻENIE POKRYWY GÓRNEJ BA3-1','300-020-003 - KĄTOWNIK')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-001 - ZŁOŻENIE POKRYWY GÓRNEJ BA3-1','300-020-004 - WSTAWKA UZUPEŁNIAJĄCA')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-002 - ZŁOŻENIE POKRYWY DOLNEJ TYŁ BA3-1','300-020-010 - BLASZKA PROWADZĄCA POKRYWĘ')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-002 - ZŁOŻENIE POKRYWY DOLNEJ TYŁ BA3-1','300-020-011 - POKRYWA DOLNA TYŁ BA3-1')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-002 - ZŁOŻENIE POKRYWY DOLNEJ TYŁ BA3-1','300-020-012 - PŁASKOWNIK BA3-1')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-003 - ZŁOŻENIE POKRYWY DOLNEJ PRZÓD BA3-1','300-020-013 - WZMOCNIENIE POKRYWY')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-003 - ZŁOŻENIE POKRYWY DOLNEJ PRZÓD BA3-1','300-020-014 - UCHWYT')
INSERT INTO PodZlozenie (NumerPodZlozenia, NumerCzesci) VALUES ('300-021-003 - ZŁOŻENIE POKRYWY DOLNEJ PRZÓD BA3-1','300-020-015 - POKRYWA DOLNA PRZÓD BA3-1')

#EDIT 查詢應返回所需的輸出,如下所示:

IF Zlozenie.NumerCzesci CONTAINS "ZŁOŻENIE" THEN SELECT PodZlozenie.NumerCzesci FROM PodZlozenie WHERE Zlozenie.NumerCzesci = PodZlozenie.NumerPodZlozenia ELSE Zlozenie.NumerCzesci

期望的輸出:

[NumerCzesci]
300-000-001 - WKŁADKA GÓRNA
300-000-002 - WKŁADKA DOLNA
300-000-003 - UCHO ROTORA 11 RAM 3 SEKCJE
300-000-005 - RAMIĘ ROTORA 565mm
300-020-001 - BOK POKRYWY GÓRNEJ
300-020-002 - DEKIEL POKRYWY GÓRNEJ
300-020-003 - KĄTOWNIK
300-020-004 - WSTAWKA UZUPEŁNIAJĄCA
300-020-010 - BLASZKA PROWADZĄCA POKRYWĘ
300-020-011 - POKRYWA DOLNA TYŁ BA3-1
300-020-012 - PŁASKOWNIK BA3-1
300-020-013 - WZMOCNIENIE POKRYWY
300-020-014 - UCHWYT
300-020-015 - POKRYWA DOLNA PRZÓD BA3-1

因此,如果我正確理解您的範例,您似乎想要NumerCzesci兩個表中的唯一值列表,除非Zlozenie.NumerCzesci包含“ZŁOŻENIE”。然後你想PodZlozenie.NumerCzesci改用。您應該能夠使用一個FULL JOIN和一個DISTINCT子句來實現這一點,如下所示:

SELECT DISTINCT 
   CASE 
       WHEN Zlozenie.NumerCzesci LIKE '%ZŁOŻENIE%' OR Zlozenie.NumerCzesci IS NULL THEN PodZlozenie.NumerCzesci 
       ELSE Zlozenie.NumerCzesci 
   END AS NumerCzesci
FROM Zlozenie
FULL JOIN PodZlozenie
   ON Zlozenie.NumerCzesci = PodZlozenie.NumerPodZlozenia

(如果您希望結果按升序排序,您可以選擇添加ORDER BY NumerCzesci到上述查詢的末尾NumerCzesci。)

引用自:https://dba.stackexchange.com/questions/283225