Полное соединение в MS Access - PullRequest
3 голосов
/ 09 августа 2011

, поэтому я пытаюсь выполнить полное объединение в MS Access 2003, но обнаружил, что оно не поддерживает его. Поэтому я попытался взять два моих оператора выбора и затем присоединиться к одному с помощью соединения LEFT и сделать UNION с тем же оператором, но с правом соединения. Access дал мне ошибку, сказав, что что-то не так с командой JOIN. Вот немного sql ...

SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, 
tbl_Inventory.Color,  tbl_Inventory.InInventory, 
tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks +   tbl_Inventory.InInventory - 
tbl_Inventory.OutInventory) AS Balance,  
tbl_Inventory.Weight, tbl_Inventory.CF,   
(tbl_Inventory.Weight *Balance) AS TotalWeight, 
(tbl_Inventory.CF * Balance) AS TotalCF, 
tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, 
tbl_ItemHistory.Unit
FROM (tbl_Vendors INNER JOIN tbl_Inventory 
    ON tbl_Vendors.vid = tbl_Inventory.VendorID)
LEFT JOIN tbl_ItemHistory 
ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum
ORDER BY tbl_Inventory.ItemNum, tbl_ItemHistory.orderDate 

извините, если это не в формате кода, доступ к sql, я думаю, это просто обычный текст. это только с левым соединением. если у вас есть идеи, скажите, пожалуйста. Спасибо!

редактировать: 2 шага соединения,

SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, tbl_Inventory.Color, 
tbl_Inventory.InInventory, tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks+tbl_Inventory.InInventory-tbl_Inventory.OutInventory) AS Balance, 
tbl_Inventory.Weight, tbl_Inventory.CF, (tbl_Inventory.Weight*Balance) AS TotalWeight,    
(tbl_Inventory.CF*Balance) AS TotalCF, tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, tbl_ItemHistory.Unit
FROM (tbl_Vendors INNER JOIN tbl_Inventory ON tbl_Vendors.vid = tbl_Inventory.VendorID) LEFT JOIN
tbl_ItemHistory ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum;
UNION ALL
SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, tbl_Inventory.Color, 
tbl_Inventory.InInventory, tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks+tbl_Inventory.InInventory-tbl_Inventory.OutInventory) AS Balance, 
tbl_Inventory.Weight, tbl_Inventory.CF, (tbl_Inventory.Weight*Balance) AS TotalWeight,    
(tbl_Inventory.CF*Balance) AS TotalCF, tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, tbl_ItemHistory.Unit
FROM (tbl_Vendors INNER JOIN tbl_Inventory ON tbl_Vendors.vid = tbl_Inventory.VendorID) RIGHT  
JOIN tbl_ItemHistory ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum;

ошибка: выражение соединения не поддерживается. Первый кусок кода был хорош для левого внешнего соединения. Я попробовал два левых соединения, и это сработало. это просто не принимает мое право присоединиться ...

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Ваша конечная цель - эмулировать FULL OUTER JOIN, но ваше первое препятствие заключается в том, что механизм базы данных Access жалуется на вашу попытку LEFT JOIN.Сначала нужно создать работоспособное JOIN, и я не могу определить, что не так с предоставленным вами образцом.

Принимает ли Access эту упрощенную версию?

SELECT *
FROM
    (tbl_Vendors AS vend
    INNER JOIN tbl_Inventory AS inv
    ON vend.vid = inv.VendorID)
    LEFT JOIN tbl_ItemHistory AS hist
    ON inv.ItemNum = hist.ItemNum;

На данный момент мыВы не беспокоитесь о списке полей или ORDER BY ... просто о том, работает ли этот запрос без ошибок и возвращает ли правильные строки.

Если он работает, посмотрите, возвращает ли этот RIGHT JOIN оставшиеся нужные вам строки.

SELECT *
FROM
    (tbl_Vendors AS vend
    INNER JOIN tbl_Inventory AS inv
    ON vend.vid = inv.VendorID)
    RIGHT JOIN tbl_ItemHistory AS hist
    ON inv.ItemNum = hist.ItemNum
WHERE inv.ItemNum Is Null;

Возможно, вам придется изменить предложение WHERE;это был непроверенный воздушный кодекс.Но если это также работает, объедините 2 запроса в один:

SELECT *
FROM
    (tbl_Vendors AS vend
    INNER JOIN tbl_Inventory AS inv
    ON vend.vid = inv.VendorID)
    LEFT JOIN tbl_ItemHistory AS hist
    ON inv.ItemNum = hist.ItemNum
UNION ALL
SELECT *
FROM
    (tbl_Vendors AS vend
    INNER JOIN tbl_Inventory AS inv
    ON vend.vid = inv.VendorID)
    RIGHT JOIN tbl_ItemHistory AS hist
    ON inv.ItemNum = hist.ItemNum
WHERE inv.ItemNum Is Null;
0 голосов
/ 22 июня 2013

Я создал фиктивный столбец с одинаковым значением во всех строках обеих таблиц.
Это можно сделать на лету.

Вот пример, где у меня были люди и занятия, и я хотел, чтобы каждый человек соответствовал каждому виду деятельности:

SELECT person, activity
FROM (SELECT 1 as tag, person from person)  AS a
 INNER JOIN (SELECT 1 as tag, activity from activity)  AS b
 ON a.tag = b.tag
ORDER BY person, activity;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...