Sql server 将两个子表项与来自两个数据库的两个相似父表进行比较
我需要帮助创建一个查询,将一个数据库中的Sql server 将两个子表项与来自两个数据库的两个相似父表进行比较,sql-server,relational-database,Sql Server,Relational Database,我需要帮助创建一个查询,将一个数据库中的设备与另一个表中的资产进行比较。以下是我的数据库设置: CREATE DATABASE database1 GO USE [database1] GO CREATE TABLE [dbo].[Application] ( [ApplicationID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [APP_NUMBRER] [int] NULL, ) GO CREATE TABLE [dbo].
设备
与另一个表中的资产
进行比较。以下是我的数据库设置:
CREATE DATABASE database1
GO
USE [database1]
GO
CREATE TABLE [dbo].[Application]
(
[ApplicationID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[APP_NUMBRER] [int] NULL,
)
GO
CREATE TABLE [dbo].[Equipment]
(
[EquipID] [int] IDENTITY(1,1) NOT NULL,
[ApplicationID] [int] NULL,
[Year] [varchar](4) NULL,
[Make] [varchar](50) NULL,
[Model] [varchar](50) NULL
)
ALTER TABLE [dbo].[Equipment] WITH CHECK
ADD CONSTRAINT [FK_EQUIP_1]
FOREIGN KEY([ApplicationID]) REFERENCES [dbo].[APPLICATION] ([ApplicationID])
GO
INSERT INTO [Application]
VALUES (1), (2), (3)
INSERT INTO [Equipment]
VALUES (1, '1998', 'Equip1', 'Model1'),
(1, '1855', 'Equip2', 'Model2'),
(2, '1222', 'Equip3', 'Model4'),
(2, '1333', 'Equip4', 'Model4'),
(3, '1777', 'Equip5', 'Model5')
GO
CREATE DATABASE database2
GO
USE [database2]
GO
CREATE TABLE [dbo].[Application]
(
[APP_KEY] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[APP_DESCRIPTION] [varchar](40) NOT NULL
)
GO
CREATE TABLE [dbo].[ASSET]
(
[AS_KEY] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[AS_APP_FKEY] [int] NOT NULL,
[Year] [varchar](4) NULL,
[Make] [varchar](50) NULL,
[Model] [varchar](50) NULL
)
ALTER TABLE [dbo].[ASSET] WITH CHECK
ADD CONSTRAINT [FK_ASSET_1]
FOREIGN KEY([AS_APP_FKEY]) REFERENCES [dbo].[APPLICATION] ([APP_KEY])
GO
INSERT INTO [Application]
VALUES ('AppDesc1'), ('AppDesc2')
INSERT INTO [ASSET]
VALUES (1, '1998', 'Asset1', 'Db2Model1'),
(1, '1855', 'Asset2', 'Db2Model2'),
(2, '1222', 'Asset3', 'Db2Model3'),
(2, '1333', 'Asset4', 'Db2Model4')
GO
我的问题是:
SELECT
ap1.APP_NUMBRER,
e.Year, e.Make, e.Model,
db2.APP_KEY, db2.Year, db2.Make, db2.Model
FROM
database1.dbo.Application ap1
JOIN
database1.dbo.Equipment e ON E.APPLICATIONID = ap1.APPLICATIONID
LEFT JOIN
(SELECT
APP_KEY, Year, Make, Model
FROM
[database2].dbo.APPLICATION ap2
JOIN
[database2].dbo.ASSET ON asset.AS_APP_FKEY = ap2.APP_KEY) db2 ON ap1.APP_NUMBRER = db2.APP_KEY
结果:
预期结果:我的查询将创建几个重复项,将所有db1设备与db2资产进行比较。我想要一对一的比较。我不要第2、3、6、7项。这是因为表关系是如何设置的
这是因为您只在
APP\u NUMBER=APP\u KEY
上加入。将Year=Year
添加到加入中,您将获得所需的结果。在加入中添加Year
。它会解决你的问题
SELECT ap1.APP_NUMBRER, e.Year, e.Make, e.Model, db2.APP_KEY, db2.Year, db2.Make, db2.Model
FROM database1.dbo.Application ap1
JOIN database1.dbo.Equipment e
ON E.APPLICATIONID = ap1.APPLICATIONID
LEFT JOIN(
SELECT APP_KEY, Year, Make, Model
FROM [database2].dbo.APPLICATION ap2
JOIN [database2].dbo.ASSET
ON asset.AS_APP_FKEY = ap2.APP_KEY
) db2
ON ap1.APP_NUMBRER = db2.APP_KEY AND e.Year = db2.Year
这样修改你的加入条件
db2 ON ap1.APP_NUMBRER = db2.APP_KEY
AND e.Year = db2.Year
如果年份可以不同呢。唯一保证相同的是申请编号。如果是这种情况,则两个表中的“年份”可能不同。。那么你就无法避免重复。。。在这里,你有很多对很多的关系…谢谢你,这是我害怕的。我看到了关于这一年的回复,但这可能会从一个数据库改变到另一个数据库。唯一保证相似的是AppKey/Number