Используйте каждую строку в одной таблице, присоединив ее к другой таблице - PullRequest
0 голосов
/ 19 сентября 2009

Я бы хотел, чтобы запрос, который в простейшем случае объединял бы 2 таблицы вместе, и никакие другие экспресс-отношения, кроме каждой строки в том, что я назову таблицей «пул», не совпадет точно с 1 строкой в ​​моей другой таблице. Мне все равно, какая строка, я просто хочу, чтобы каждая строка в моей основной таблице получала одну строку из таблицы «пул», и знаю, что каждая строка из пула будет использоваться только один раз.

Я думал, что что-то вроде ROW_NUMBER () OVER () можно использовать для сопоставления с произвольным номером строки, что было бы хорошо, но я думаю, что требуется как минимум 2 внутренних поставщика набора строк; Я думал, что будет что-то попроще.

Чтобы поставить задачу более кратко, у вас есть таблица идентификаторов, и вы хотите объединить ее с таблицей записей, чтобы назначить идентификаторы. Вы можете использовать каждый идентификатор только один раз. Какую структуру запроса или объединения вы можете использовать для возврата набора строк всех записей, каждой из которых присвоен идентификатор. Не имеет значения, какая запись получает какой идентификатор, только то, что каждый идентификатор может использоваться только один раз.

Фон

Для тех из вас, кто интересуется фоном, у меня есть логическая сущность, которая состоит из строки заголовка в таблице заголовков, которая является общей для множества объектов, которая дает нам свой идентификатор, а затем запись в сущности. конкретная таблица. Я использую запрос, подобный следующему, чтобы предварительно создать группу идентификаторов в таблице заголовков:

declare @idsTable TABLE(ID INT);

INSERT INTO Header (HeaderType)
OUTPUT INSERTED.id INTO @idsTable
SELECT 4 as HeaderType
  FROM Company c WHERE c.CompanyType = 12;

На данный момент у меня есть несколько строк заголовков и идентификаторов (IDENTITY), которые были назначены на строки. Теперь я хочу использовать аналогичную INSERT для конкретной таблицы объектов, но мне нужно сопоставить идентификатор из @idsTable только с 1 строкой в ​​моем запросе выбора (и, следовательно, в моем запросе вставки). Что-то вроде:

INSERT INTO Specific (HeaderiD, Value1, ...)
SELECT * 
  FROM @idsTable 
  JOIN RecordsToWrite r2r ON ???

Ответы [ 3 ]

2 голосов
/ 19 сентября 2009

Почему вы отказались от ROW_NUMBER? Пример на Adventure Works

SELECT 
    * 
FROM 
(
    SELECT 
        TOP 10 ROW_NUMBER() OVER(ORDER BY EmployeeId) AS join_id,* 
    FROM 
        HumanResources.Employee
) t1
INNER JOIN
(
    SELECT 
        TOP 10 ROW_NUMBER() OVER(ORDER BY DepartmentId) AS join_id,* 
    FROM 
        HumanResources.Department
) t2 ON t1.join_id = t2.join_id
1 голос
/ 19 сентября 2009

Если я правильно понимаю ваши данные, то количество строк в таблице RecordsToWrite и количество новых строк, полученных из запроса ... ОТ КОМПАНИИ ... должны быть одинаковыми. В этом случае:

  • добавить простой UID столбца UNIQUEIDENTIFIER в таблицу RecordsToWrite со значением DEFAULT CONSTRAINT (NEWID ()), чтобы он автоматически генерировался.
  • измените свою таблицу @idsTable и оператор на это

-

declare @idsTable TABLE(ID INT, UID UNIQUEIDENTIFIER);
INSERT  INTO Header (HeaderType)
OUTPUT  INSERTED.id, r.UID INTO @idsTable
SELECT  4 AS HeaderType, r.UID
FROM    RecordsToWrite r --// maybe other filters to get only number or records as in:
--//FROM Company c WHERE c.CompanyType = 12;

Затем присоединитесь к этому столбцу UID во втором запросе.

редактирование: новый Следующий код отлично работает на моем sql-2008, а это значит, что я могу использовать OUTPUT и INSERT. Так что можете, просто попробуйте:

CREATE TABLE TestOutput (ID INT IDENTITY, TAG VARCHAR(10));

DECLARE @idsTable TABLE(ID INT, UID UNIQUEIDENTIFIER);

INSERT  INTO TestOutput (TAG)
OUTPUT  INSERTED.id, NEWID() INTO @idsTable
SELECT  tag
FROM   (    SELECT 'test-1' as tag
UNION ALL   SELECT 'test-2'
) x

SELECT * FROM @idsTable
SELECT * FROM TestOutput

DROP TABLE TestOutput;

и я получаю следующие результаты:

ID          UID
----------- ------------------------------------
1           422FF4F0-9CFB-4F67-94C8-2D3B225E39B0
2           0BD2B2D2-1319-4981-9E26-C09FE844359C

ID          TAG
----------- ----------
1           test-1
2           test-2
0 голосов
/ 19 сентября 2009

Может быть, я недопонимаю, но вы не можете просто сделать:

SELECT * FROM @ idsTable, RecordsToWrite

ИЛИ сделать кросс-соединение

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