programing

두 기준의 모든 조합을 반환하면서 여러 기준에 가입하는 방법은 무엇입니까?

easyjava 2023. 5. 9. 23:13
반응형

두 기준의 모든 조합을 반환하면서 여러 기준에 가입하는 방법은 무엇입니까?

저는 SQL을 잘 모르는 사람이기 때문에 이것이 정말 간단한 답이라고 기꺼이 장담합니다.

주어진:

  • 표 1에는 1열(1열) 2열(2열) 3열(1열)이 있습니다.
  • 표 2에는 1열(1열) 2열(2열) 3열(2열은 표 2.metric2에 고유한 2열)이 있습니다.

표의 각 기준 1에 대한 기준 2의 값은 1 - 5 사이일 수 있습니다.

여기서 조인 문을 사용할 때(표 1을 다음과 같이 식별한다고 가정)One이 이전):

SELECT WeddingTable, TableSeat, TableSeatID, Name, Two.Meal
FROM table1 as One
INNER JOIN table2 as Two
      ON One.WeddingTable = Two.WeddingTable AND One.TableSeat = Two.TableSeat

저는 3개 또는 4개의 기준이 있는 것을 알고도 기준 1/기준 2 조합 중 하나만 받습니다.모든 조합을 가져오려면 어떻게 해야 합니까?

결혼식이 있는 경우를 예로 들어, 테이블 1은 기본적으로 좌석 차트이고, 테이블 2는 각 테이블/좌석이 선택한 식사 옵션입니다.표 1은 편리함을 제공합니다.TableSeatID그러나 표 2는 비교할 수 없습니다.ID.


표본 데이터:

여기에 이미지 설명 입력

결과는 4개 라인을 모두 표시해야 하며, 3개 시트는 모두 다음 위치에 있어야 합니다.WeddingTable001 및 1석WeddingTable 002.

원하는 결과:

여기에 이미지 설명 입력

SELECT one.*, two.Meal
FROM table1 AS one
LEFT JOIN table2 AS two
     ON (one.WeddingTable = two.WeddingTable AND one.TableSeat = two.TableSeat);
SELECT  aa.*,
        bb.meal
FROM    table1 aa
        INNER JOIN table2 bb
            ON aa.tableseat = bb.tableseat AND
                aa.weddingtable = bb.weddingtable
        INNER JOIN
        (
            SELECT  a.tableSeat
            FROM    table1 a
                    INNER JOIN table2 b
                        ON a.tableseat = b.tableseat AND
                            a.weddingtable = b.weddingtable
            WHERE b.meal IN ('chicken', 'steak')
            GROUP by a.tableSeat
            HAVING COUNT(DISTINCT b.Meal) = 2
        ) c ON aa.tableseat = c.tableSeat
create table a1
(weddingTable INT(3),
 tableSeat INT(3),
 tableSeatID INT(6),
 Name varchar(10));

insert into a1
 (weddingTable, tableSeat, tableSeatID, Name)
 values (001,001,001001,'Bob'),
 (001,002,001002,'Joe'),
 (001,003,001003,'Dan'),
 (002,001,002001,'Mark');

create table a2
 (weddingTable int(3),
 tableSeat int(3),
 Meal varchar(10));

insert into a2
(weddingTable, tableSeat, Meal)
values 
(001,001,'Chicken'),
(001,002,'Steak'),
(001,003,'Salmon'),
(002,001,'Steak');

select x.*, y.Meal

from a1 as x
JOIN a2 as y ON (x.weddingTable = y.weddingTable) AND (x.tableSeat = y. tableSeat);

모든 메트릭을 나열하려는 것처럼 들립니다.

SELECT Criteria1, Criteria2, Metric1 As Metric
FROM Table1
UNION ALL
SELECT Criteria1, Criteria2, Metric2 As Metric
FROM Table2
ORDER BY 1, 2

Criteria1+Criteria2 조합을 하나만 사용하려는 경우 그룹화합니다.

SELECT Criteria1, Criteia2, SUM(Metric) AS Metric
FROM (
    SELECT Criteria1, Criteria2, Metric1 As Metric
    FROM Table1
    UNION ALL
    SELECT Criteria1, Criteria2, Metric2 As Metric
    FROM Table2
)
ORDER BY Criteria1, Criteria2

먼저 열 이름을 참조하여 보다 명확하게 설명하는 것이 좋습니다.WeddingTable과 TableSit는 두 테이블 모두에 열 이름으로 표시되므로 환경에 따라 모호성이 있을 수 있습니다.

Select One.WeddingTable, One.TableSeat, TableSeatID, Name, Two.Meal
FROM table1 as One
inner join table2 as Two
on One.WeddingTable = Two.WeddingTable and One.TableSeat = Two.TableSeat

환경에서 이 모호성을 해결하면 INER JOIN은 테이블에 나열된 데이터에 대한 4개의 레코드를 반환합니다.두 테이블 사이에 일치하는 4개의 레코드가 있습니다.

제공된 샘플에서, 저는 당신이 왜 하나의 조합만을 얻는지 이해할 수 없습니다.제가 생각할 수 있는 유일한 가능성은 실제 데이터 테이블의 WeddingTable과 TableSit 열에 있는 값이 실제로 일치하지 않는 경우입니다.

예를 들어 TableSit가 CHAR 유형이고 Table1이라고 가정합니다.TableSit에는 '001', '002', '003', '001') 및 표 2가 포함되어 있습니다.TableSit에는 '01', '002', '3', '01'이 포함되어 있습니다. 그러면 ON 술어의 TableSit 구성 요소로 인해 일치 항목이 한 개로 제한됩니다.


다른 고려 사항은 한 테이블에 다른 테이블과 일치하지 않는 데이터가 있을 때입니다.

Anom의 응답은 왼쪽 외부 조인을 사용합니다.그러면 테이블 2에 일치하는 레코드가 있는지 여부에 관계없이 테이블 1의 모든 레코드가 반환됩니다.일치하는 항목이 없는 경우 식사 열에 NULL 값이 포함됩니다.모든 레코드가 일치하므로 결과는 INER JOIN과 동일합니다.

그러나 테이블 2에 일치하는 레코드가 없는 테이블 1에 추가

INSERT INTO 
  table1 (WeddingTable, TableSeat, TableSeatID, Name)
VALUES
  (003, 002, 003002, 'Arielle');

LEFT OUTER JOIN 쿼리는 이제 INTER JOIN과 다른 결과를 생성합니다.

언급URL : https://stackoverflow.com/questions/13131496/how-to-do-join-on-multiple-criteria-returning-all-combinations-of-both-criteria

반응형