将主表和细节表连接成一个表

3

我是一名有用的助手,可以为您进行文本翻译。

我有一个主表和详细表如下:

主表

Id    code   Name
-------------------
1     00     qqq

详细表格

Id    code   Name
-------------------
1     01     xyz
1     02     pqr
1     03     abc
1     04     aaa

现在我需要以下结果:
结果
Id    code  Name
-----------------
1     00    qqq
1     01    xyz
1     02    pqr
1     03    abc
1     04    aaa

我喜欢避免使用UNION

提前感谢:)


3
为什么您要避免使用union - Verma
是的,因为这是一个复杂的查询。我必须使用其他参数的组合来查询数据。 - Srinivas
@Srinivas:请检查我的答案... - Krishnraj Rana
3个回答

3

好的,我不知道为什么你不想使用Union。

但是如果您不想使用union,可以使用FULL OUTER JOIN来实现,类似于这样 -

SELECT COALESCE(Master1.id, Detail.id) AS id
    ,COALESCE(Master1.code, Detail.code) AS code
    ,COALESCE(Master1.NAME, Detail.NAME) AS NAME
FROM MASTER1
FULL OUTER JOIN DETAIL ON Master1.code = Detail.code

输出

Id    code  Name
-----------------
1     00    qqq
1     01    xyz
1     02    pqr
1     03    abc

Check SQL Fiddle

Here


为什么不使用 ISNULL 而使用 COALESCE 呢? - CiucaS
@CiucaS:你可以使用Isnull来实现相同的结果。 - Krishnraj Rana
我知道,但我认为你使用COALESCE的原因是有道理的。 - CiucaS
感谢大家的讨论,对我帮助很大。 - Srinivas

1
如果表不够大,您可以创建一个临时表,并使用以下语句将主表和详细表中的数据插入到临时表中:
insert into temp_table select * from detail;
insert into temp_table select * from master;
或者,如果您想要合并表中的数据,也可以使用以下查询:
insert into master select * from detail;

0

有很多方法可以实现这个...你可以尝试创建一个临时表,将所有数据推入其中,然后选择不同种类的东西。

下面是另一种使用CTE的方法,请告诉我们它是否适用于您。

CREATE TABLE #Master
( ID INT, Code VARCHAR(50), Name VARCHAR(50))

CREATE TABLE #Details 
( ID INT, Code VARCHAR(50), Name  varchar(50))

INSERT INTO #Master values(1,'00', 'qqq')

INSERT INTO #Details values(1,'01', 'xyz')
INSERT INTO #Details values(1,'02', 'pqr')
INSERT INTO #Details values(1,'03', 'abc')
INSERT INTO #Details values(1,'04', 'aaa')


; WITH CTE_RESULT AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY CODE, NAME ORDER BY CODE, NAME) ROW_NO, ID, CODE, NAME 
    FROM #Details D 
)
SELECT A.ID, A.CODE, A.NAME FROM CTE_RESULT A 
INNER JOIN #Master M ON M.ID=A.ID WHERE ROW_NO=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接