2

我一直在研究这个问题一段时间,但我不知道该怎么做。

我有一个包含多个连接的庞大 SQL 查询,它给了我数十万条记录,这非常完美。

然后我意识到我在另一个表中有 200 多条记录需要添加到第一个表中。

第一张表:

字段 1 字段 2 字段 3
约翰·史密斯 23 波士顿
穆罕默德·阿里 45 纽约
斯蒂芬妮·约翰逊 15 洛杉矶

新表

字段 1 其他字段 1 其他字段 2
Mark Khoury 空 null

所以我真的只需要将表 2 中的 Field1 值添加到第一个的“底部”。我在第一个查询中所做的所有连接也应该适用于表 2 中的值。

联合将不起作用,因为我只有要添加的列。我必须从第一个表中复制粘贴相同的查询才能从第二个表的值中获取“Field2”和“Field3”。

我希望它看起来像:

字段 1 字段 2 字段 3
约翰·史密斯 23 波士顿
穆罕默德·阿里 45 纽约
斯蒂芬妮·约翰逊 15 洛杉矶
马克·库里 65 休斯顿

我该怎么做呢?我不想“加入”表格,我想将它们联合起来,但只用一列。

这是我的意思的一个例子:

表一是通过执行以下操作创建的:

SELECT table.value1 as Field1, table2.value2 as Field2, table3.value3 as Field3 
FROM some_table as table
LEFT OUTER JOIN some_other_table as Table2 ON table.field = table2.field5
LEFT OUTER JOIN a_third_table as table3 ON table2.field2 = table3.field4

但现在我有更多 Field1 值的 newTable,我需要将这些值添加到第一个表中。

我试过这个:

SELECT COALESCE(table.value1, NewTable.value) as Field1, table2.value2 as Field2,
table3.value3 as Field3               
FROM some_table as table
LEFT OUTER JOIN some_other_table as Table2 ON table.field = table2.field5
LEFT OUTER JOIN a_third_table as table3 ON table2.field2 = table3.field4, newTable

但这给了我指数级的结果,它应该给我几百个。

4

2 回答 2

4

您可以与第一列添加一个联合,并将其他列设置为 '' 之类的,

SELECT Field1, Field2 
FROM table1
UNION
SELECT Field1, '' AS Field2 
FROM table2

那会让你得到你需要的东西吗?

以您为例,以下内容会为您提供所需的东西吗?

SELECT table.value1 as Field1, table2.value2 as Field2, table3.value3 as Field3 
FROM 
    (SELECT t.value1 as Field1 FROM some_table as t
     UNION
     SELECT t2.value1 as Field1 FROM some_table2 as t2) as table
LEFT OUTER JOIN some_other_table as Table2 ON table.field1 = table2.field5
LEFT OUTER JOIN a_third_table as table3 ON table2.field2 = table3.field4
于 2013-08-05T15:27:42.463 回答
0

与@rhollyer 有相同的想法,这里有一个脚本可以产生你想要的东西。

DECLARE @Person TABLE
(
    PersonID int,
    DisplayName nvarchar(50)
)

DECLARE @PersonDetail TABLE
(
    PersonID int,
    Age int
)

DECLARE @PersonGeoInfo TABLE
(
    PersonID int,
    City nvarchar(200)
)

DECLARE @LostPersons TABLE
(
    LostPersonID int,
    DisplayName nvarchar(50),
    Irrelevant1 decimal,
    Irrelevant2 bit
)

INSERT INTO @Person (PersonID, DisplayName)
VALUES 
    (1, 'John Smith'),
    (2, 'Mohammed Ali'),
    (3, 'Stephanie Johnson')

INSERT INTO @PersonDetail(PersonID, Age)
VALUES
    (1, 23),
    (2, 45),
    (3, 15),
    (4, 65)

INSERT INTO @PersonGeoInfo(PersonID, City)
VALUES
    (1, 'Boston'),
    (2, 'New York'),
    (3, 'Los Angeles'),
    (4, 'Houston')

INSERT INTO @LostPersons(LostPersonID, DisplayName, Irrelevant1, Irrelevant2)
VALUES
    (4, 'Mark Khoury', 9.5, 1)

    DECLARE @Person TABLE
(
    PersonID int,
    DisplayName nvarchar(50)
)

DECLARE @PersonDetail TABLE
(
    PersonID int,
    Age int
)

DECLARE @PersonGeoInfo TABLE
(
    PersonID int,
    City nvarchar(200)
)

DECLARE @LostPersons TABLE
(
    LostPersonID int,
    DisplayName nvarchar(50),
    Irrelevant1 decimal,
    Irrelevant2 bit
)

INSERT INTO @Person (PersonID, DisplayName)
VALUES 
    (1, 'John Smith'),
    (2, 'Mohammed Ali'),
    (3, 'Stephanie Johnson')

INSERT INTO @PersonDetail(PersonID, Age)
VALUES
    (1, 23),
    (2, 45),
    (3, 15),
    (4, 65)

INSERT INTO @PersonGeoInfo(PersonID, City)
VALUES
    (1, 'Boston'),
    (2, 'New York'),
    (3, 'Los Angeles'),
    (4, 'Houston')

INSERT INTO @LostPersons(LostPersonID, DisplayName, Irrelevant1, Irrelevant2)
VALUES
    (4, 'Mark Khoury', 9.5, 1)

SELECT P.DisplayName AS Field1, PD.Age AS Field2, PGI.City AS Field3 
FROM (
    SELECT P.PersonID AS PersonID, P.DisplayName AS DisplayName FROM @Person P
    UNION
    SELECT LP.LostPersonID AS PersonID, LP.DisplayName AS DisplayName FROM @LostPersons LP) AS P        
LEFT OUTER JOIN @PersonDetail PD ON P.PersonID = PD.PersonID
LEFT OUTER JOIN @PersonGeoInfo PGI ON PD.PersonID = PGI.PersonID
于 2013-08-05T15:36:26.440 回答