Соединить две таблицы в нескольких условиях - SQL Server - PullRequest
0 голосов
/ 05 мая 2019

Мне нужно объединить две таблицы на основе некоторых условий. Сказка в моем ежедневном входе. Мне нужно объединить таблицу src с таблицей mstr, основываясь на некоторых критериях, как показано ниже.

  1. Если я получу соединение между двумя таблицами по memberid, fname и lname, тогда мне нужно взять dob из таблицы mstr.
  2. Если я не получаю подходящих критериев на вышеуказанной основе, тогда мне нужно присоединиться только по идентификатору участника, а затем взять dob. Если в MSTR доступно несколько записей по идентификатору члена, тогда мне нужно выбрать ту запись, у которой есть самая старая из dob.
  3. Если я не получаю совпадение с помощью memberid, то также необходимо случайным образом создать fname, которое будет представлять собой xx + 5 случайных чисел, lname будет ZZ + 5 случайных чисел и dob в качестве сегодняшней даты - 110 лет.

Это то, что я пробовал, чтобы помочь вам ускорить решение. Я предоставляю пример данных для обеих таблиц

declare @src table (memberids int, fnames varchar(25), lnames varchar(25));
insert into @src values
(1, 'Ankit','Bansal'),
(2, 'Dinesh','Bansal'),
(3, 'Sushil','Dania'),
(4, '',''),
(5, Null ,Null),
(10,Null,Null)

select * from @src
declare @mstr table (memberid int, fname varchar(25), lname varchar(25),dob date);
insert into @mstr values
(1, 'Ankit','Bansal','2010-06-24'),
(2, 'Dinesh','Bansal','2009-06-24'),
(3, 'Sushil','Dania','2000-06-24'),
(4, 'Sunil','Wadh','2011-06-24'),
(5, 'Suresh','Bansal','2000-06-24'),
(5, 'Animesh','Bajaj','2001-06-24'),
(6, 'Dhiresh','Jain','2001-06-24');


select * from @mstr;

Это запрос, который я написал.

 select  memberids, fnames, lnames, a.dob
 from @src
 outer apply
  (select dob
         from @mstr where memberids = memberid and fnames = fname 
         and lnames = lname) a ; 

Текущий результат, который я получаю:

memberids   fnames  lnames  dob
1   Ankit   Bansal  2010-06-24
2   Dinesh  Bansal  2009-06-24
3   Sushil  Dania   2000-06-24
4           NULL
5   NULL    NULL    NULL
10  NULL    NULL    NULL

Однако вывод должен выглядеть следующим образом

memberids   fnames  lnames  dob
1   Ankit   Bansal  24-06-2010
2   Dinesh  Bansal  24-06-2009
3   Sushil  Dania   24-06-2000
4   Sunil   Wadh    24-06-2011
5   Suresh  Bansal  24-06-2000
10  XX12345 ZZ123456    Today's Date - 110 years

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Я полагаю, что подойдет следующее (проверено на SQL Fiddle ):

SELECT @src.memberids
     , CASE WHEN a.memberid IS NOT NULL THEN @src.fnames
            WHEN b.memberid IS NOT NULL THEN b.fname
            ELSE 'XX' + FORMAT(ABS(CAST(CHECKSUM(NewId()) AS BIGINT)) % 100000, '00000')
       END AS fnames
     , CASE WHEN a.memberid IS NOT NULL THEN @src.lnames
            WHEN b.memberid IS NOT NULL THEN b.lname
            ELSE 'ZZ' + FORMAT(ABS(CAST(CHECKSUM(NewId()) AS BIGINT)) % 100000, '00000')
       END AS lnames
     , CASE WHEN a.memberid IS NOT NULL THEN a.dob
            WHEN b.memberid IS NOT NULL THEN b.dob
            ELSE DATEADD(year, -110, CAST(GETDATE() AS DATE))
       END AS dob
  FROM @src
  LEFT JOIN @mstr a ON a.memberid = @src.memberids
                   AND a.fname = @src.fnames
                   AND a.lname = @src.lnames
  OUTER APPLY (
     SELECT TOP 1 b.memberid, b.fname, b.lname, b.dob
       FROM @mstr b
      WHERE b.memberid = @src.memberids
      ORDER BY b.dob
  ) b
0 голосов
/ 05 мая 2019

Пожалуйста, проверьте этот запрос.Это должно работать, но я должен сказать, что есть недостатки в дизайне стола.Если это требование, рассмотрите следующий запрос.Но если у вас есть возможности, вы можете переосмыслить, чтобы сначала изменить дизайн своего стола.

declare @src table (memberids int, fnames varchar(25), lnames varchar(25));
insert into @src values
(1, 'Ankit','Bansal'),
(2, 'Dinesh','Bansal'),
(3, 'Sushil','Dania'),
(4, '',''),
(5, Null ,Null),
(10,Null,Null)

declare @mstr table (memberid int, fname varchar(25), lname varchar(25),dob date);
insert into @mstr values
(1, 'Ankit','Bansal','2010-06-24'),
(2, 'Dinesh','Bansal','2009-06-24'),
(3, 'Sushil','Dania','2000-06-24'),
(4, 'Sunil','Wadh','2011-06-24'),
(5, 'Suresh','Bansal','2000-06-24'),
(5, 'Animesh','Bajaj','2001-06-24'),
(6, 'Dhiresh','Jain','2001-06-24');

SELECT M.memberid,M.fname,M.lname,M.dob
FROM (
    SELECT M.memberid, MIN(M.dob) dob
    FROM @src S 
    INNER JOIN @mstr M ON S.memberids = M.memberid
        AND S.fnames = M.fname
        AND S.lnames = M.lname 
    GROUP BY M.memberid
    )B
INNER JOIN @mstr M ON B.memberid = M.memberid AND B.dob = M.dob

UNION

SELECT M.memberid,M.fname,M.lname,M.dob
FROM (
    SELECT M.memberid, MIN(M.dob) dob
    FROM @src S 
    INNER JOIN @mstr M ON S.memberids = M.memberid
    AND (S.fnames IS NULL OR S.fnames = '')
    GROUP BY M.memberid
    )B
INNER JOIN @mstr M ON B.memberid = M.memberid AND B.dob = M.dob

UNION

SELECT C.smid  memberids, 'XX'+CAST ((convert(numeric(5,0),rand() * 10000) + 9999)AS VARCHAR(5)) fname, 
'ZZ'+CAST ((convert(numeric(5,0),rand() * 10000) + 9999)AS VARCHAR(5)) lnames, 
DATEADD(YY,-110, GETDATE()) dob
FROM
(
SELECT S.memberids smid,M.memberid mmid
FROM @src S 
LEFT JOIN @mstr M ON S.memberids = M.memberid
)C WHERE 
C.smid IS NOT NULL
AND C.mmid IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...