Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将两个子表项与来自两个数据库的两个相似父表进行比较_Sql Server_Relational Database - Fatal编程技术网

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