공통 필드가 없는 두 테이블 결합
공통 필드가 없는 두 개의 db 테이블을 결합하는 방법을 배우고 싶습니다.유니온을 확인해봤지만 MSDN은 다음과 같이 말합니다.
UNION을 사용하여 두 쿼리의 결과 집합을 결합하기 위한 기본 규칙은 다음과 같습니다.
- 모든 쿼리에서 열의 숫자와 순서가 같아야 합니다.
- 데이터 유형이 호환되어야 합니다.
하지만 저는 공통점이 전혀 없습니다.제가 원하는 것은 그것들을 뷰처럼 한 테이블에 결합하는 것입니다.
그럼 어떻게 해야 하나요?
여러분이 진정으로 원하는 것에 따라 이를 수행하는 방법은 여러 가지가 있습니다.공통 열이 없는 경우 공통 열을 도입할지 제품을 가져올지 결정해야 합니다.
두 개의 테이블이 있다고 가정합니다.
parts: custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+
이 경우 고객/주문/부품 관계를 맺을 가능성이 높기 때문에 실제 열은 잊어버리십시오. 이 열을 사용하여 수행 방법을 설명했습니다.
데카르트 제품은 첫 번째 테이블의 모든 행과 두 번째 테이블의 모든 행과 일치합니다.
> select * from parts, custs;
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
1 Sprocket 102 Paul
2 Flange 101 Bob
2 Flange 102 Paul
1000개의 부품과 100개의 고객으로 인해 100,000개의 행이 생성되고 많은 정보가 중복되기 때문에 이는 아마도 당신이 원하는 것이 아닐 것입니다.
또는 조합을 사용하여 데이터를 출력할 수 있지만 나란히 출력할 수는 없습니다(테이블 열을 호환되도록 만들거나 선택에서 열 유형을 강제로 지정하여 두 선택 사이에서 열 유형이 호환되는지 확인해야 합니다).
> select id as pid, desc, null as cid, null as name from parts
union
select null as pid, null as desc, id as cid, name from custs;
pid desc cid name
--- ---- --- ----
101 Bob
102 Paul
1 Sprocket
2 Flange
일부 데이터베이스에서는 다음과 같은 rowid/rownum 열 또는 유사 열을 사용하여 레코드를 나란히 일치시킬 수 있습니다.
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob
코드는 다음과 같습니다.
select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;
여전히 데카르트 제품 같지만,where
절은 행이 결합되어 결과를 형성하는 방법을 제한합니다(따라서 실제로는 데카르트 곱이 아닙니다).
이 SQL은 제가 선택한 DBMS의 한계 중 하나이기 때문에 테스트를 해본 적이 없습니다. 적절하게 생각해 낸 스키마에서 SQL이 필요하지 않다고 생각합니다.SQL은 데이터를 생성하는 순서를 보장하지 않기 때문에 특정 관계가 있거나 관계가 없는 경우 쿼리를 수행할 때마다 일치 항목이 변경될 수 있습니다.order by
절
두 테이블 모두에 관계가 무엇인지 지정하는 열을 추가하는 것이 가장 이상적이라고 생각합니다.실제 관계가 없는 경우에는 SQL과 함께 사용할 필요가 없습니다.
보고서나 웹 페이지(두 가지 예)에 나란히 표시되도록 하려면 보고서나 웹 페이지를 생성하는 모든 도구와 관련 없는 두 개의 테이블을 가져오기 위한 두 개의 독립적인 SQL 쿼리를 결합해야 합니다.예를 들어, 각각 별도의 데이터 테이블이 있는 BIRT(또는 Crystal 또는 Jasper)의 2열 그리드 또는 각각 별도의 데이터 테이블이 있는 HTML 2열 테이블(또는 CSS)입니다.
이것은 매우 이상한 요청입니다. 그리고 거의 확실히 여러분은 실제 응용 프로그램에서 절대 하고 싶지 않은 것입니다. 하지만 순수하게 학문적인 관점에서 보면 이것은 흥미로운 도전입니다.SQL Server 2005를 사용하면 일반적인 테이블 식을 사용하고 row_number() 함수를 사용하여 다음 작업에 참여할 수 있습니다.
with OrderedFoos as (
select row_number() over (order by FooName) RowNum, *
from Foos (nolock)
),
OrderedBars as (
select row_number() over (order by BarName) RowNum, *
from Bars (nolock)
)
select *
from OrderedFoos f
full outer join OrderedBars u on u.RowNum = f.RowNum
이것은 효과가 있지만, 매우 어리석고 저는 그것을 정말 추천하지 않을 것이기 때문에 "커뮤니티 위키" 답변으로만 제공합니다.
SELECT *
FROM table1, table2
그러면 table1의 모든 행이 table2(데카르트 제품)에서 모든 열을 반환하는 조인됩니다.
select
status_id,
status,
null as path,
null as Description
from
zmw_t_status
union
select
null,
null,
path as cid,
Description from zmw_t_path;
시도:
select * from table 1 left join table2 as t on 1 = 1;
이렇게 하면 두 테이블의 모든 열이 표시됩니다.
테이블에 공통 필드가 없으면 의미 있는 보기에서 데이터를 결합할 수 없습니다.두 테이블의 중복된 데이터가 포함된 보기가 될 가능성이 높습니다.
두 테이블의 의미 있는/유용한 뷰를 얻으려면 일반적으로 JOIN의 ON 절에서 사용할 수 있는 각 테이블에서 식별 필드를 결정해야 합니다.
그렇다면 다음과 같습니다.
SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2
"공통" 필드가 없다고 언급했지만, 식별 필드의 이름이 동일하지 않거나 데이터 유형이 동일하지 않더라도 변환/캐스트 기능을 사용하여 어떤 방식으로든 필드를 결합할 수 있습니다.
간단한 접근법을 사용하는 게 어때요?
SELECT distinct *
FROM
SUPPLIER full join
CUSTOMER on (
CUSTOMER.OID = SUPPLIER.OID
)
고객이 3개의 레코드를 가지고 있고 공급업체가 2개인 경우 공급업체는 모든 열에 NULL을 표시합니다.
Select
DISTINCT t1.col,t2col
From table1 t1, table2 t2
OR
Select
DISTINCT t1.col,t2col
From table1 t1
cross JOIN table2 t2
만약 그것이 hug data라면, 그것은 오랜 시간이 걸립니다.
SELECT t1.col table1col, t2.col table2col
FROM table1 t1
JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y
비관련 테이블 결합
데모 SQL 스크립트
IF OBJECT_ID('Tempdb..#T1') IS NOT NULL DROP TABLE #T1;
CREATE TABLE #T1 (T1_Name VARCHAR(75));
INSERT INTO #T1 (T1_Name) VALUES ('Animal'),('Bat'),('Cat'),('Duet');
SELECT * FROM #T1;
IF OBJECT_ID('Tempdb..#T2') IS NOT NULL DROP TABLE #T2;
CREATE TABLE #T2 (T2_Class VARCHAR(10));
INSERT INTO #T2 (T2_Class) VALUES ('Z'),('T'),('H');
SELECT * FROM #T2;
Non-Related Tables를 조인하기 위해 아래와 같은 일련 번호의 공통 조인 열을 하나 소개합니다.
SQL 스크립트
SELECT T1.T1_Name,ISNULL(T2.T2_Class,'') AS T2_Class FROM
( SELECT T1_Name,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS S_NO FROM #T1) T1
LEFT JOIN
( SELECT T2_Class,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS S_NO FROM #T2) T2
ON t1.S_NO=T2.S_NO;
select * from this_table;
select distinct person from this_table
union select address as location from that_table
drop wrong_table from this_database;
세 개의 선택 문으로 이 작업을 수행해야 할 때 매우 어렵습니다.
위에서 제안된 모든 기술을 시도해봤지만 소용이 없습니다.
아래 스크립트를 참조하십시오.다른 해결책이 있다면 조언 부탁드립니다.
select distinct x.best_Achiver_ever,y.Today_best_Achiver ,z.Most_Violator from
(SELECT Top(4) ROW_NUMBER() over (order by tl.username) AS conj, tl.
[username] + '-->' + str(count(*)) as best_Achiver_ever
FROM[TiketFollowup].[dbo].N_FCR_Tikect_Log_Archive tl
group by tl.username
order by count(*) desc) x
left outer join
(SELECT
Top(4) ROW_NUMBER() over (order by tl.username) as conj, tl.[username] + '-->' + str(count(*)) as Today_best_Achiver
FROM[TiketFollowup].[dbo].[N_FCR_Tikect_Log] tl
where convert(date, tl.stamp, 121) = convert(date,GETDATE(),121)
group by tl.username
order by count(*) desc) y
on x.conj=y.conj
left outer join
(
select ROW_NUMBER() over (order by count(*)) as conj,username+ '--> ' + str( count(dbo.IsViolated(stamp))) as Most_Violator from N_FCR_Ticket
where dbo.IsViolated(stamp) = 'violated' and convert(date,stamp, 121) < convert(date,GETDATE(),121)
group by username
order by count(*) desc) z
on x.conj = z.conj
다음 쿼리를 시도하십시오.
공통 열이 없는 두 테이블을 결합합니다.
SELECT *
FROM table1
UNION
SELECT *
FROM table2
ORDER BY orderby ASC
언급URL : https://stackoverflow.com/questions/1198124/combine-two-tables-that-have-no-common-fields
'programing' 카테고리의 다른 글
미디어 저장소에서 URI에서 파일 이름 및 경로 가져오기 (0) | 2023.07.05 |
---|---|
mongodb에서 달러 기호는 그룹 측면에서 무엇을 의미합니까? (0) | 2023.07.05 |
도커 합성 및 도커 기계를 사용하여 mongoDB용 외부 볼륨을 탑재하는 방법 (0) | 2023.07.05 |
ID 열이 있는 SqlBulkCopy 삽입 (0) | 2023.07.05 |
선택 쿼리에 대한 최적의 가져오기 크기를 확인하는 방법 (0) | 2023.06.30 |