代码之家  ›  专栏  ›  技术社区  ›  Bashar Abu Shamaa

按每个主表插入联接表值

  •  0
  • Bashar Abu Shamaa  · 技术社区  · 7 年前

    我有张桌子叫 StoreTbl 要存储stores/markets,此表有一个名为 AvailableToAllCities 还有一张桌子叫 CityTbl 它们之间有一个连接表,叫做 StoreCityJoinTbl

    经理让我把场地移走 适用于所有城市 (或者不再使用);因此我需要将每个商店的所有城市插入到联接表中, 我可以不用循环来做这个吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Larnu    7 年前

    没有任何类型的ddl,我不得不创建自己的,并且使用非常有限的数据。不过,这应该足以让你达到目的:

    USE Sandbox;
    GO
    --Sample data set up
    CREATE TABLE Store (StoreID int IDENTITY(1,1), StoreName varchar(50), AvailableToAllCities bit)
    
    CREATE TABLE City (CityID int IDENTITY(1,1), CityName varchar(50));
    
    CREATE TABLE CityStores (ID int IDENTITY(1,1), StoreID int, CityID int)
    GO
    
    INSERT INTO City (CityName)
    VALUES ('London'),('New York'),('Syndey'),('Washington'),('Paris'),('Berlin'),('Shanghai'),('Tokyo');
    
    INSERT INTO Store (StoreName, AvailableToAllCities)
    VALUES ('sdgfkljasghdbfkl',1),
           ('dsfjklgh',0),
           ('sdlafiugasdljkbfh',1),
           ('asdfhjklgasdfjkl',1),
           ('sdjlhfbvgajldavfhkl',0);
    
    INSERT INTO CityStores (StoreID, CityID)
    VALUES (2,1),(2,3),(2,6),
           (5,1),(5,2),(5,7),(5,8);
    GO
    --So your current data looks like this
    
    SELECT S.StoreName, C.CityName
    FROM Store S
         LEFT JOIN CityStores CS ON S.StoreID = CS.StoreID
         JOIN City C ON CS.CityID = C.CityID
                     OR S.AvailableToAllCities = 1;
    
    GO
    --And now the the solution
    INSERT INTO CityStores (StoreID,CityID)
    SELECT S.StoreID, C.CityID
    FROM Store S
         CROSS JOIN City C
    WHERE S.AvailableToAllCities = 1;
    GO
    --Drop the old column
    ALTER TABLE Store DROP COLUMN AvailableToAllCities;
    
    GO
    
    --And now the new query:
    SELECT S.StoreName, C.CityName
    FROM Store S
         JOIN CityStores CS ON S.StoreID = CS.StoreID
         JOIN City C ON CS.CityID = C.CityID;
    
    GO
    --Clean up
    DROP TABLE Store;
    DROP TABLE City;
    DROP TABLE CityStores;