programing

테이블의 열 이름이 동일한 레코드에 대해 여러 테이블을 쿼리하는 방법

bestprogram 2023. 8. 5. 10:43

테이블의 열 이름이 동일한 레코드에 대해 여러 테이블을 쿼리하는 방법

나는 두 개의 테이블, 스위치와 라우터가 있는 데이터베이스를 가지고 있습니다.두 테이블의 열 이름(dev_name, dev_ip 등)은 동일합니다.

저는 두 테이블 모두를 조회하고 특정 호스트 이름을 가진 개별 레코드를 찾는 방법을 알아야 합니다.따라서 PHP 양식이 장치 이름별로 데이터베이스를 쿼리하는 경우 전체 데이터베이스(모든 테이블)를 쿼리하고 장치가 쿼리되는 테이블/행을 찾고 싶습니다.

저는 다음과 같은 질문을 시도했습니다.

SELECT * FROM switches,routers 
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';

그러나 라우터 테이블과 코어 스위치 01의 모든 라우터를 반복적으로 포함하는 연결된 출력을 제공합니다.

SELECT * FROM switches,routers 
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';

제가 구조화하고자 하는 것은 두 테이블을 모두 읽고 코어스위치01에 대한 레코드를 찾아 어떤 테이블에서 찾든 하나의 레코드만 보여주는 쿼리입니다.

당신은 사용할 수 있습니다.union allset 연산자:

SELECT *
FROM   (SELECT * FROM switches
        UNION ALL
        SELECT * FROM routers) t
WHERE  dev_name = 'coreswitch01'

열이 동일하거나 거의 동일한 두 테이블을 볼 때마다 "왜 이 두 테이블은 하나의 테이블로 결합되지 않습니까?"라고 묻습니다.라우터 대 스위치의 종류를 설명하려면 추가 열이 필요할 수 있지만, 이는 약간의 오버헤드입니다.

하지만 두 개의 테이블이 있다는 것을 감안하면...

특정 쿼리의 경우 이 방법이 최적입니다.

( SELECT * FROM switches  WHERE dev_name = 'coreswitch01' )
UNION ALL
( SELECT * FROM routers   WHERE dev_name = 'coreswitch01' )

이것은 당신이 다음에 대한 색인을 가지고 있다고 가정합니다.dev_name각 테이블에

데이터 테이블 원점을 확인하려면 "origin"과 같은 새 필드를 작성할 수 있습니다.

SELECT *
FROM   (SELECT 'switches' as origin, * FROM switches
        UNION ALL
        SELECT 'routers'  as origin, * FROM routers) t
WHERE  dev_name = 'coreswitch01'

언급URL : https://stackoverflow.com/questions/56742335/how-to-query-multiple-tables-for-a-record-where-tables-have-identical-column-nam