Сложный JOIN запрос SQL Server - PullRequest
       1

Сложный JOIN запрос SQL Server

0 голосов
/ 01 октября 2019

У меня есть две таблицы, вид 'parent', 'child', как показано ниже:

Parent, child tables

Теперь мне нужно объединить эти две таблицы. Требования, которые удовлетворяют объединению

  1. Если идентификатор 1-й таблицы совпадает с ID 2-й таблицы
  2. CHILDID 1-й таблицы совпадает с ID 2-й таблицы
  3. EffectiveDate of Child'sтаблица (идентификатор которой совпадает с идентификатором родительской таблицы) должна быть равна EffectiveDate дочерней таблицы (идентификатор которой совпадает с ChildID родительской таблицы)

(на изображении выше соответствующие строки выделены красными зеленый, чтобы проиллюстрировать вышесказанное).

Итак, итоговый запрос должен отображать строки ниже:

Query results

Буду признателен за любые указатели каккак добиться желаемого результата. Спасибо!

1 Ответ

1 голос
/ 01 октября 2019

Хорошо, это немного страннее, чем я думал, но я думаю, это то, что вы хотите. Возможно, это не самый чистый способ получить результаты, но это начало?

DECLARE @parent TABLE (ROWID INT, ID INT, CHILDID INT, FLAG CHAR(1));
INSERT INTO @parent
SELECT 1, 10, 1000, 'A'
UNION ALL
SELECT 2, 10, 1001, 'A'
UNION ALL
SELECT 3, 10, 1002, 'A'
UNION ALL
SELECT 4, 11, 1005, 'A'

DECLARE @child TABLE (ROWID INT, ID INT, EFFECTIVEDATE DATETIME, SHARES INT);
INSERT INTO @child
SELECT 2, 10, '20010101 00:00', 20
UNION ALL
SELECT 1, 11, '20020101 00:00', 60
UNION ALL
SELECT 3, 1000, '20010101 00:00', 30
UNION ALL
SELECT 4, 1005, '20020101 00:00', 50
UNION ALL
SELECT 5, 1005, '20040101 00:00', 90;

SELECT DISTINCT
    c1.*
FROM 
    @child c1
    INNER JOIN @parent p1 ON p1.ID = c1.ID
    INNER JOIN @child c2 ON c2.ID = p1.CHILDID
WHERE
    c2.EFFECTIVEDATE = c1.EFFECTIVEDATE
UNION ALL
SELECT DISTINCT
    c2.*
FROM 
    @child c1
    INNER JOIN @parent p1 ON p1.ID = c1.ID
    INNER JOIN @child c2 ON c2.ID = p1.CHILDID
WHERE
    c2.EFFECTIVEDATE = c1.EFFECTIVEDATE
ORDER BY
    1;

Результаты:

ROWID   ID      EFFECTIVEDATE           SHARES
1       11      2002-01-01 00:00:00.000 60
2       10      2001-01-01 00:00:00.000 20
3       1000    2001-01-01 00:00:00.000 30
4       1005    2002-01-01 00:00:00.000 50

Да, а эти DISTINCT, вероятно, излишни?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...