編輯:添加了表格描述。
我有兩張桌子。一個臨時表 [tvwBundle] 累積用戶輸入的資訊,然后是一個臨時表填充的主表 [tblBundle]。我希望查詢只列出兩個表之間的差異,并且只找到查詢相似之處的方法。
兩個表具有相同的欄位。WorkOrder, BundleNbr, BundleLtr, Clk, Shift, Step, (multiple) Dimensions, Complete, ActivityID
我的表單旨在將捆綁包拆分為子捆綁包以用于各種目的。拆分后,BundleLtr 將填充我們的字母方案。我有一個查詢:
Me.cmbBundleToSplit.RowSource = "SELECT BundleNbr & BundleLtr AS Bundle FROM tblBundle GROUP BY BundleNbr & BundleLtr, [WO], [Complete], BundleNbr, BundleLtr HAVING [WO] = '" & Nz(Me.cmbShopOrder, "") & "' AND [Complete] <> False "ORDER BY BundleNbr, BundleLtr;"
對于我的 WorkOrder,組合框中有 8 個捆綁包:1、2、3、4、5、6、7、8。一旦訂單被拆分,它就會保存在 tempTable 中,直到用戶準備好發布它.
在用戶拆分多個捆綁包的情況下:一旦捆綁包 1 被拆分,我希望從行源中洗掉 BundleNbr 1。我通過以下方式做到這一點:result = fncMsgBox("Split another Bundle?", vbYesNo, "Split More?") If result = vbNo Then DoCmd.Close acForm, Me.Name End If
如果用戶單擊“是”,我想重置行源。所以 RowSource 將是:2、3、4、5、6、7、8 一旦 Bundle 2 被拆分,新的 RowSource 將是:3、4、5、6、7、8 當 RowSource = "" 我會有MsgBox "all Bundles are split"
目前我正在使用可以在查詢設計器中找到的不同選項,但打算將其放入 vba,我沒有嘗試使用 vba 代碼,因為我無法讓查詢作業。如果您想加倍努力,我也將非常感謝這在 vba 中會是什么樣子。
我努力了:
SELECT tblBundle.BundleNbr & tblBundle.BundleLtr AS Bundle, tblBundle.Step
FROM tblBundle
WHERE tblBundle.WO="WorkOrder" AND tblBundle.Step=200
UNION
SELECT tvwBundle.BundleNbr & tvwBundle.BundleLtr as Bundle, tvwBundle.Step
FROM tvwBundle
WHERE tvwBundle.WO="WorkOrder" AND tvwBundle.Step=200;
SELECT DISTINCT tblBundle.*
FROM tblBundle
INNER JOIN tvwBundle ON tvwBundle.BundleNbr = tblBundle.BundleNbr WHERE tblBundle.WO =
"WorkOrder" AND tblBundle.Step = 200
SELECT DISTINCT tblBundle.*
FROM tblBundle
Left JOIN tvwBundle ON tvwBundle.BundleNbr = tblBundle.BundleNbr WHERE tblBundle.WO = "WorkOrder" AND tblBundle.Step = 200
SELECT DISTINCT tblBundle.*
FROM tblBundle
Left OUTER JOIN tvwBundle ON tvwBundle.BundleNbr = tblBundle.BundleNbr WHERE tblBundle.WO =
"WorkOrder" AND tblBundle.Step = 200
'RIGHT JOIN' 也沒有這樣做。
編輯:目標是將查詢結果用作組合框的行源。拆分 1 個 bundle 后,將其發布到 tempTable;它收集正在輸入資料的所有拆分包。
如果 BundleNbr&BundleLtr 組合在 tempTable 中或在主表中有 > 步驟,則不要列出 Bundle。
最后一步完成是 190 為步驟 200 輸入資料
tblBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 190 | 1 | “” | 30 |
| 細繩 | 190 | 2 | “” | 30 |
| 細繩 | 190 | 3 | “” | 30 |
| 細繩 | 190 | 4 | “” | 30 |
tvwBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| “” | “” | “” | “” | “” |
^^RowSource = 1, 2, 3, 4^^
拆分捆綁包時:
tvwBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 200 | 1 | “” | 10 |
| 細繩 | 200 | 1 | “一個” | 10 |
| 細繩 | 200 | 1 | “乙” | 10 |
tblBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 190 | 1 | “” | 30 |
| 細繩 | 190 | 2 | “” | 30 |
| 細繩 | 190 | 3 | “” | 30 |
| 細繩 | 190 | 4 | “” | 30 |
^^RowSource = 2, 3, 4^^
拆分捆綁包時:
tvwBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 200 | 1 | “” | 10 |
| 細繩 | 200 | 1 | “一個” | 10 |
| 細繩 | 200 | 1 | “乙” | 10 |
| 細繩 | 200 | 2 | “” | 10 |
| 細繩 | 200 | 2 | “一個” | 10 |
| 細繩 | 200 | 2 | “乙” | 10 |
tblBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 190 | 1 | “” | 30 |
| 細繩 | 190 | 2 | “” | 30 |
| 細繩 | 190 | 3 | “” | 30 |
| 細繩 | 190 | 4 | “” | 30 |
^^RowSource = 3, 4^^
然后說用戶要到明天才能到達下半場。他們將發布資料條目,因此主表如下所示:
tblBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| 細繩 | 200 | 1 | “” | 10 |
| 細繩 | 200 | 1 | “一個” | 10 |
| 細繩 | 200 | 1 | “乙” | 10 |
| 細繩 | 200 | 2 | “” | 10 |
| 細繩 | 200 | 2 | “一個” | 10 |
| 細繩 | 200 | 2 | “乙” | 10 |
| 細繩 | 190 | 1 | “” | 30 |
| 細繩 | 190 | 2 | “” | 30 |
| 細繩 | 190 | 3 | “” | 30 |
| 細繩 | 190 | 4 | “” | 30 |
tvwBundle
| WO | 步 | 捆綁包Nbr | BundleLtr | 數量 |
|---|---|---|---|---|
| “” | “” | “” | “” | “” |
^^RowSource = 3, 4^^
**我快到了:
intStep = 0
rst.Open "SELECT Step FROM tblBundle WHERE WO = '" & Me.cmbShopOrder & "' ORDER BY Step DESC;"
If Not (rst.BOF And rst.EOF) Then
rst.MoveFirst
Do Until intStep <> 0
If rst!Step >= Me.cmbStep Then
rst.MoveNext
Else
intStep = rst!Step
End If
Loop
End If
rst.Close
Me.cmbBundleToSplit.RowSource = "SELECT tblBundle.BundleNbr &
tblBundle.BundleLtr as Bundle FROM tblBundle LEFT JOIN tvwBundle ON
tblBundle.[BundleNbr] = tvwBundle.[BundleNbr] WHERE tblBundle.WO = '" &
Me.cmbShopOrder & "' AND tblBundle.Step = " & intStep & " AND
tvwBundle.BundleNbr Is Null;"
uj5u.com熱心網友回復:
MS Access 似乎不支持減號,除了甚至完全外連接,因此我建議您使用左/右外連接并過濾結果
假設我有 2 張桌子
tab_1
| ID | text_col |
|---|---|
| 1 | 一個 |
| 2 | b |
| 3 | C |
tab_2
| ID | text_col |
|---|---|
| 1 | b |
| 2 | C |
| 3 | d |
| 4 | e |
所以,預期的結果是
| text_col |
|---|
| 一個 |
| d |
| e |
可以通過使用此查詢來實作
select tab_1.text_col
from tab_1
left join tab_2
on tab_1.text_col = tab_2.text_col
where tab_2.text_col is null -- together with left join this condition will show you lines that exists in tab_1 only
union all
select tab_2.text_col
from tab_1
right join tab_2
on tab_1.text_col = tab_2.text_col
where tab_1.text_col is null -- together with right join this condition will show you lines that exists in tab_2 only
uj5u.com熱心網友回復:
使用合并陳述句。這是一個典型的基本 ETL 程序(提取、轉換、加載)。除了你的情況,你似乎沒有做很多轉換。
我假設您使用的是 MSSQL。此外,您可能想要研究緩慢變化的維度。您在此處查找的更改是 SCD1,其中不保留更改歷史記錄,并且在更改時會覆寫匹配的條目。當您想要保留更改歷史記錄(即 SCD2)時,事情會變得很有趣
看:
合并 (Transact-SQL) - Microsoft Docs
基本的 sql-server-merge
您已要求查詢,但合并將寫入您的主表。
會是這樣的……
MERGE tblBundle target USING tvwBundle source
ON
-- use a normal join condition here, where the matching keys exist.
-- Looks like you've got a Work Order column
-- I've completely guessed your keys from the info above
tblBundle.WO = tvwBundle.WO AND
tblBundle.Step = tvwBundle.Step AND
tvwBundle.BundleNbr = tblBundle.BundleNbr
WHEN MATCHED
THEN
-- Your update_statement here, updating the main table
-- Use the source and target aliases specified in the initial MERGE line
WHEN NOT MATCHED
THEN
-- Your insert_statement here
-- Again, use the source and target aliases specified in the initial MERGE line
-- optionally, delete rows in target that don't exist in source,
-- I don't think you want this.
-- WHEN NOT MATCHED BY SOURCE
-- THEN DELETE;
上面的 sqlserver 中心鏈接很好地描述了實際的合并陳述句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411634.html
標籤:
