У меня две таблицы:
Должность:
Договор:
Я хотел бы получить одну таблицу с подробностями, прикрепленными из таблицы контрактов к таблице позиций.
Однако когда я это сделаю
SELECT
*
FROM
dbo.Position p
LEFT OUTER JOIN
dbo.Contract c ON (p.ID = c.ID)
я получил
чего я не понимаю, почему для id = 4 есть 4 записи? Я что-то пропустил? Как и в теме, я работаю с SQL Server.
РЕДАКТИРОВАТЬ: возможно, я опубликую полную проблему, которую пытаюсь решить, возможно, вышеуказанный шаг не нужен. Я хочу определить записи, в которых первый fdate_from из позиции не совпадает с первым date_from из контракта (черный цвет). Вторая часть проблемы состоит в том, чтобы определить все записи, в которых последний date_to из столбца позиции не совпадает с последним date_to из контракта.
Запрос для создания приведенной ниже таблицы, которую я использовал, был:
SELECT
*
FROM
dbo.Position c
LEFT OUTER JOIN
dbo.Contract p ON (p.ID = c.ID)
ORDER BY
p.id, p.date_from, p.date_to, c.date_from, c.date_to ASC
РЕДАКТИРОВАТЬ2: Часть 1 проблем вроде бы решена:
SELECT
*
FROM
(SELECT
p.id,
MIN(p.date_from) AS p_date_from,
MIN(c.date_from) AS c_date_from
FROM
dbo.Position p
LEFT OUTER JOIN
dbo.Contract c ON (p.ID = c.ID)
GROUP BY
p.id) AS m
WHERE
m.p_date_from != m.c_date_from
ORDER BY
id
но часть 2 кажется более сложной ... поскольку есть нули, которые, вероятно, будут игнорироваться max
SELECT
*
FROM
(SELECT
p.id,
MAX(p.date_to) AS p_date_to,
MAX(c.date_to) AS c_date_to
FROM
dbo.Position p
LEFT OUTER JOIN
dbo.Contract c ON (p.ID = c.ID)
GROUP BY
p.id) AS m
WHERE
m.p_date_to != m.c_date_to
ORDER BY
id
РЕДАКТИРОВАТЬ 3: наконец, второе условие с поддержкой http://www.bradleyschacht.com/select-null-as-max-or-min-in-sql-query/
SELECT
*
FROM
(SELECT
p.id,
MAX(COALESCE(p.date_to, '2099-12-31')) AS p_date_to,
MAX(COALESCE(c.date_to, '2099-12-31')) AS c_date_to
FROM
dbo.Position p
LEFT OUTER JOIN
dbo.Contract c ON (p.ID = c.ID)
GROUP BY
p.id) AS m
WHERE
m.p_date_to != m.c_date_to
ORDER BY
id
Я оставлю это здесь на будущее
какой результат вы хотите?
2 x 2 = 4 Вопрос не ясен





Я бы порекомендовал вам использовать состояние ИМЕЮЩИЙ для этого типа набережной. это очень поможет вам в развитии. Благодарю вас!
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
Он объединяет две позиции с идентификатором 4 и 2 контракта с идентификатором 4, в результате получается четыре. Если вы хотите создать пару только с совпадающей датой, вам нужно добавить это в условие соединения. (Что делает модель данных довольно странной, но вы не сообщили подробностей о семантике)