SQL使用join

时间:2015-11-03 16:29:01

标签: mysql sql

我有旧桌子 项目(vendorId-FK,ManufacturerId(不是FK)), 供应商(PK-VendorId int), 制造商(PK-ManufacturerId int) 需要将数据传输到新数据库并且它适用于从供应商传输数据,但是从制造商传输数据仅为30000(其中oldManufacturerId不为空),而其他5000不传输。我有什么想法吗?

新表制造商         (OldManufacturerID int,           newManufacturerId Uniqueidentifier默认newid(),           ManufacturerName varchar(100),

    )

新表项目   (...           商品描述,           ManufacturerId uniqueidentifier,           VendorId uniqueidentifier         )

INSERT INTO dbo.Item
        ( ...
          ItemDescription,
          ManufacturerId ,
          VendorId 
        )
SELECT
...
itemDescription,
m.ManufacturerId ,
v.VendorId
FROM OldSqlDatabase.dbo.tbl_Items i 
    JOIN NewSqlDatabase.dbo.Vendor v ON ISNULL(i.vendor_id, '') = ISNULL(v.SourceVendorID, '')
    JOIN NewSqlDatabase.dbo.Manufacturer m ON ISNULL(i.manufacturer_id, '') = ISNULL(m.SourceManufacturerID, '')

我刚刚传输了一个数据,因为这个表没有任何关系,new manufacturerId有默认的newid(),而这个新的id我想在新的item表中使用 插入dbo.Manufacturer         (OldManufacturerID,           生产商名称 ,          ) 选择 manufacturer_id, 生产商名称 , 来自oldManufacture

1 个答案:

答案 0 :(得分:1)

您可能需要使用LEFT JOIN获取记录,其中没有要加入的值(空值)。 LEFT JOIN将允许您选择连接中指定的第一个表中的所有记录,即使连接中的第二个表中没有可用的匹配记录。

这也可以让你摆脱连接定义中的ISNULL()内容。那些表现非常糟糕,因为他们无法使用索引。

我会建议像:

INSERT INTO dbo.Item
        ( ...
          ItemDescription,
          ManufacturerId ,
          VendorId 
        )
SELECT
...
itemDescription,
m.ManufacturerId ,
v.VendorId
FROM OldSqlDatabase.dbo.tbl_Items i 
LEFT JOIN NewSqlDatabase.dbo.Vendor v
  ON i.vendor_id = v.SourceVendorID
LEFT JOIN NewSqlDatabase.dbo.Manufacturer m
  ON i.manufacturer_id = m.SourceManufacturerID