2017-12-14 9 views
2

하나의 삽입물 만 사용하여 사용자 테이블을 채워야합니다. 표에 4 열이 있습니다.tsql 스크립트에서 삽입 횟수를 줄이는 방법은 무엇입니까?

FirstName LastName Password Email 

이제는 두 개의 삽입 만 사용하여 수행 할 수 있습니다. 먼저 FirstName 및 LastName을 삽입하고 두 번째로 이름에 따라 암호 및 전자 메일을 생성합니다. 그래서, 첫 삽입 후 나는 Passwords 칼럼과 Email 칼럼을 NULL로 채운다. 그래서 테이블에서 불필요한 행을 삭제해야합니다. 아래
코드 :

DROP TABLE Users 

CREATE TABLE Users(
    FirstName nvarchar(10) , 
    LastName nvarchar(10), 
    Password nvarchar(128), 
    Email nvarchar(30), 
    ) 

INSERT INTO Users (FirstName, LastName) VALUES ('Adams','Armstrong'), 
              ('John','Barnes'), 
              ('Mark','Barnetty'), 
              ('Mike','Ra'), 
              ('Harry','Radley'), 
              ('Nick','Kade'), 
              ('Brian','Kael'), 
              ('Lea','Fahim'), 
              ('Julia','Dacey'), 
              ('Anna','Octavio'), 
              ('Kate','Yale') 

INSERT INTO Users (FirstName, LastName, Password, Email) 
SELECT FirstName, LastName, Password, Email = 
    CASE 
    WHEN Email = 0 THEN 
    LOWER(LEFT(FirstName,1) + LastName) + '@hotmail.com' 
    WHEN Email = 1 THEN 
    LOWER(LEFT(FirstName,1) + LastName) + '@gmail.com' 
    WHEN Email = 2 THEN 
    LOWER(LEFT(FirstName,1) + LastName) + '@mail.ru' 
    END 
    FROM (SELECT FirstName, LastName, REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') as Password, 
    CAST(RAND(CHECKSUM(NEWID())) * 3 as INT) as Email from Users) as random 

DELETE FROM Users WHERE Password IS NULL and Email IS NULL 

SELECT * FROM Users 

어떻게 하나의 인서트를 사용하여 사용자 테이블을 채우기는 무엇입니까?
P. 이 테이블은 이미 다른 테이블의 임시 테이블입니다.

+0

이름 값의 출처는 무엇입니까? INSERT 문에 항상 하드 코딩하거나 다른 테이블이나 데이터 소스에서 선택합니까? –

+1

그래서 사용자가 'hotmail.com'을 얻는다면'gmail.com'이나'mail.ru'는 완전히 변화에 달렸습니까? – GuidoG

+2

두 삽입을 한 다음 두 행 중 하나를 삭제하는 이유는 무엇입니까? 기괴한. UPDATE를 사용하여 _existing_ 행에 이메일/비밀번호를 추가하십시오! 그러나 전자 메일 값이 입력 매개 변수 (예 : @email)에서 오는 경우 CASE 문을 원래 INSERT에 그대로 넣고 매개 변수를 사용하여 수행 할 작업을 결정할 수 있습니다. – ADyson

답변

0

은 CTE 필요없이 CROSS APPLY를 사용하여 깨끗한 솔루션입니다 :

INSERT INTO Users (FirstName, LastName, Password, Email) 
SELECT 
    Names.FirstName, 
    Names.LastName, 
    REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', ''), 
    CASE 
     WHEN EmailInfo.EmailType = 0 THEN EmailInfo.EmailName + '@hotmail.com' 
     WHEN EmailInfo.EmailType = 1 THEN EmailInfo.EmailName + '@gmail.com' 
     WHEN EmailInfo.EmailType = 2 THEN EmailInfo.EmailName + '@mail.ru' 
    END 
FROM (
     VALUES 
     ('Adams','Armstrong'), 
     ('John','Barnes'), 
     ('Mark','Barnetty'), 
     ('Mike','Ra'), 
     ('Harry','Radley'), 
     ('Nick','Kade'), 
     ('Brian','Kael'), 
     ('Lea','Fahim'), 
     ('Julia','Dacey'), 
     ('Anna','Octavio'), 
     ('Kate','Yale') 
    ) Names (FirstName, LastName) 
    CROSS APPLY (
     SELECT 
      LOWER(LEFT(FirstName,1) + LastName) AS EmailName, 
      CAST(RAND(CHECKSUM(NEWID())) * 3 as INT) AS EmailType 
    ) EmailInfo 
2

이 시도 :

INSERT INTO Users (FirstName, LastName, Password, Email) 
    SELECT FirstName, LastName 
     , [Password] = REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') 
     , Email = 
       CASE CAST(RAND(CHECKSUM(NEWID())) * 3 as INT) 
       WHEN 0 THEN LOWER(LEFT(FirstName,1) + LastName) + '@hotmail.com' 
       WHEN 1 THEN LOWER(LEFT(FirstName,1) + LastName) + '@gmail.com' 
       WHEN 2 THEN LOWER(LEFT(FirstName,1) + LastName) + '@mail.ru' 
       END 
from (VALUES ('Adams','Armstrong'), 
              ('John','Barnes'), 
              ('Mark','Barnetty'), 
              ('Mike','Ra'), 
              ('Harry','Radley'), 
              ('Nick','Kade'), 
              ('Brian','Kael'), 
              ('Lea','Fahim'), 
              ('Julia','Dacey'), 
              ('Anna','Octavio'), 
              ('Kate','Yale')) a(FirstName, LastName) 
+0

각 RAND() 함수가 다른 값을 생성하고 동시에 여러 가지 경우가 발생할 수 있기 때문에 전자 메일의 대소 문자가 작동하지 않습니다. 아니면 항상 첫 번째 사례 일 것이고 다른 사례는 실행되지 않을 것입니다. –

+0

@JayasuryaSatheesh 물론. 해당 오류를 수정했습니다. – cloudsafe

0

나는 당신의 쿼리를 다시 작성했습니다. 사용해보기

DROP TABLE Users 

CREATE TABLE Users(
    FirstName nvarchar(10) , 
    LastName nvarchar(10), 
    Password nvarchar(128), 
    Email nvarchar(30), 
    ) 

;WITH CTE 
AS 
(
    SELECT FirstName = 'Adams',LastName = 'Armstrong',Email = CAST(RAND(CHECKSUM(NEWID())) * 3 as INT),[Password] = REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') 
    UNION ALL 
    SELECT FirstName = 'John',LastName = 'Barnes',Email = CAST(RAND(CHECKSUM(NEWID())) * 3 as INT),[Password] = REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') 
    UNION ALL 
    SELECT FirstName = 'Mark',LastName = 'Barnetty',Email = CAST(RAND(CHECKSUM(NEWID())) * 3 as INT),[Password] = REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') 
) 
INSERT INTO Users (FirstName, LastName, Password, Email) 
SELECT 
    FirstName, 
    LastName, 
    [Password], 
    Email = 
    CASE 
     WHEN Email = 0 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@hotmail.com' 
     WHEN Email = 1 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@gmail.com' 
     WHEN Email = 2 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@mail.ru' 
     END 
    FROM CTE 
     WHERE [Password] IS NOT NULL 
      OR 
      Email IS NOT NULL 

SELECT * FROM Users 

처음 세 개의 레코드 만 포함되었으므로 추가 레코드를 더 많이 추가 할 수 있습니다. 이미

1

당신은 CTE를 사용할 수있는 경우 상태에서 여과로

또한, 나는 삭제 문을 제거했습니다

다음
DROP TABLE Users 

CREATE TABLE Users(
    FirstName nvarchar(10) , 
    LastName nvarchar(10), 
    Password nvarchar(128), 
    Email nvarchar(30), 
    ) 


;WITH Names AS (
    SELECT U.FirstName, U.LastName FROM (
    VALUES ('Adams','Armstrong'), 
      ('John','Barnes'), 
      ('Mark','Barnetty'), 
      ('Mike','Ra'), 
      ('Harry','Radley'), 
      ('Nick','Kade'), 
      ('Brian','Kael'), 
      ('Lea','Fahim'), 
      ('Julia','Dacey'), 
      ('Anna','Octavio'), 
      ('Kate','Yale') 
    ) AS U (FirstName, LastName) 
), RandomUsers AS (
SELECT 
     FirstName 
    , LastName 
    , REPLACE(LOWER(CONVERT(NVARCHAR(128), NEWID())), '-', '') as Password 
    , CASE CAST(RAND(CHECKSUM(NEWID())) * 3 as INT) 
     WHEN 0 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@hotmail.com' 
     WHEN 1 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@gmail.com' 
     WHEN 2 THEN 
     LOWER(LEFT(FirstName,1) + LastName) + '@mail.ru' 
     END AS Email 
FROM Names 
) 
INSERT INTO Users(FirstName, LastName, Password, Email) 
SELECT FirstName, LastName, Password, Email 
FROM RandomUsers 
WHERE Password IS NOT NULL AND Email IS NOT NULL 

SELECT * FROM Users