在不同数据库上联接两个SQL表

时间:2019-01-08 16:26:17

标签: sql sql-server

我在两个单独的数据库上有两个表。我们将它们称为Table1和Table2。

表1:

+----------+----------+----------+---------+------+----------+
| UniqueID |  Date1   |  Date2   |  Fruit  | Cost | Duration |
+----------+----------+----------+---------+------+----------+
|        1 | 09/10/18 | 10/20/18 | Apples  | 1.50 |        7 |
|        2 | 09/18/18 | 10/25/18 | Oranges | 1.75 |       10 |
|        3 | 10/01/18 | 10/30/18 | Bananas | 2.00 |       10 |
+----------+----------+----------+---------+------+----------+

表2:

+----------+---------+------+----------+-----------+
|  Date1   |  Fruit  | Cost | Duration | New Price |
+----------+---------+------+----------+-----------+
| 09/10/18 | Savory  | 1.50 |        7 |      1.90 |
| 09/18/18 | Citrusy | 1.75 |       10 |      2.50 |
| 10/01/18 | Mealy   | 2.00 |       10 |      2.99 |
| 10/20/18 | Savory  | 1.50 |        7 |      3.90 |
| 10/25/18 | Citrusy | 1.75 |       10 |      4.50 |
| 10/30/18 | Mealy   | 2.00 |       10 |      5.99 |
+----------+---------+------+----------+-----------+

我需要的输出看起来像什么:

+----------+----------+--------------------+----------+--------------------+
| UniqueID |  Date1   | New Price on Date1 |  Date2   | New Price on Date2 |
+----------+----------+--------------------+----------+--------------------+
|        1 | 09/10/18 |               1.90 | 10/20/18 |             3.90   |
|        2 | 09/18/18 |               2.50 | 10/25/18 |               4.50 |
|        3 | 10/01/18 |               2.99 | 10/30/18 |               5.99 |
+----------+----------+--------------------+----------+--------------------+

我需要先将table1.fruit转换为table2.fruit的表示形式(苹果->咸味,橘子->柑橘,香蕉–>小米),然后加入table1.fruit = table2.fruit,table1。持续时间= table2.duration,table1.cost = table2.cost,table1.date1 = table2.date1,table1.date2 = table2.date1。

我不知道从哪里开始写陈述。我查看了这里以前发布的一些问题,但实际上只是介绍了链接来自不同数据库的两个表的基础知识。是先在select语句中转换table1.fruit,然后再进行联接,还是在join语句中转换table1.fruit?如何在table1.date1和table1.date2上同时加入table2.date1以获取与两个日期关联的价格?

如果我可以为您提供更多信息,请告诉我。

我正在使用Management Studio使用SQL Server 2017。

感谢您的任何帮助!

2 个答案:

答案 0 :(得分:1)

如果两个数据库都在同一个SQL Server实例上,并且您的SQL Server登录名可以访问两个数据库,则可以使用完整形式的对象名称:

select * -- Whatever...
from Database1.dbo.Table1 t1
  inner join Database2.dbo.Table2 t2
    on t1,UniqueId = t2.UniqueId -- Or whatever your join condition is

(根据需要添加where等子句。)

这假定两个数据库都使用默认架构,否则请根据需要替换dbo

如果数据库位于不同的服务器上,则可以使用链接服务器,但会影响性能(由于优化器无法对其进行大量过滤,因此可能会读取整个远程表)。

答案 1 :(得分:1)

创建映射表以在水果的不同代码之间架起桥梁。

IF OBJECT_ID('tempdb..#FruitMappings') IS NOT NULL
    DROP TABLE #FruitMappings

CREATE TABLE #FruitMappings (
    Table1Fruit VARCHAR(100),
    Table2Fruit VARCHAR(100))

INSERT INTO #FruitMappings (
    Table1Fruit,
    Table2Fruit)
VALUES
    ('Apples', 'Savory'),
    ('Oranges', 'Citrusy'),
    ('Bananas', 'Mealy')

SELECT
    T1.*
    --, whichever columns you need
FROM
    Database1.Schema1.Table1 AS T1
    INNER JOIN #FruitMappings AS F ON T1.Fruit = F.Table1Fruit
    INNER JOIN Database2.Schema2.Table2 AS T2 ON 
        F.Table2Fruit = T2.Fruit AND
        T1.Cost = T2.Cost AND
        T1.Duration = T2.Duration
        -- AND any other matches you need

您可以使用LEFT JOIN甚至是FULL JOIN,这取决于表上是否有其他水果不可用的水果(如果{{1 }}。