我在两个单独的数据库上有两个表。我们将它们称为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。
感谢您的任何帮助!
答案 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 }}。