在一個查詢中連接 3 個以上的表,進行多次比較且沒有 ID
我在工作中使用了一個過於復雜且設計不佳的軟體,現在我需要生成一份在一段時間之間開具的發票報告。
發票保存在表 ENTR2012 中,該表使用以下結構:
CREATE TABLE ENTR2012 ( ABREV VARCHAR(8) NOT NULL, NOTA VARCHAR(9) NOT NULL, NUMEROEMIT VARCHAR(18) NOT NULL, DATAENTRADA TIMESTAMP, DATAEMISSAO TIMESTAMP, VALCONTABIL DOUBLE PRECISION, PRIMARY KEY (ABREV,NOTA,NUMEROEMIT)
從這張表中,我只想要 ABREV、NOTA、NUMEROEMIT、DATAENTRADA、DATAEMISSAO、VALCONTABIL。
這應該是我的桌子:
| ABREV | NOTA | NUMEROEMIT | DATAENTRADA | DATAEMISSAO | VALCONTABIL | | dep1 | 001 | 1234567 | 01.01.2012 | 31.01.2012 | 1,000.00 | | dep2 | 001 | 898909201 | 02.01.2012 | 16.01.2012 | 998.00 |
如您所見,ABREV 持有開具發票的部門 ID,NOTA 是發票編號(每個部門都有自己的發票數量),NUMEROEMIT 是客戶 ID,DATAENTRADA 是開具發票的日期,DATAEMISSA是支付發票的日期,而 VALCONTABIL 是發票的價值。
現在我需要找到 Invoice 描述,即我們到底要收取什麼費用。
第二個表 ITST2012 包含以下描述:
CREATE TABLE ITST2012 ( ABREV VARCHAR(8) NOT NULL, NOTA VARCHAR(9) NOT NULL, NUMEROEMIT VARCHAR(18) NOT NULL, DATAENTRADA TIMESTAMP, CODPRODUTO VARCHAR(13), ALIQISS DOUBLE PRECISION, VALTOTAL DOUBLE PRECISION, PRIMARY KEY (ABREV,NOTA,NUMEROEMIT)
ITST 有 ABREV(部門 ID)、NOTA(發票編號)、DATAEMISSAO(簽發日期)以及我想要的資訊 CODPRODUTO(產品程式碼)和 ALIQISS(我的老闆要求用於此報告的有用編號)。
由於每個部門 (ABREV) 都有自己的編號順序 (NOTA),因此我們必須比較 dep。ID (ABREV)、編號 (NOTA) 和價值 (VALTOTAL) 同時確認這是正確的發票。產品應該是這樣的:
| ABREV | NOTA | NUMEROEMIT | DATAENTRADA | DATAEMISSAO | VALCONTABIL | ITST2012.CODPRODUTO | ITST2012.ALIQISS | | dep1 | 001 | 1234567 | 01.01.2012 | 31.01.2012 | 1,000.00 | 2 | 5.00 | | dep2 | 001 | 898909201 | 02.01.2012 | 16.01.2012 | 998.00 | 3 | 15.00 |
接下來,我需要加入帶有真實產品描述的 ITST2012.CODPRODUTO。同樣,每個部門都使用自己的編號系統,因此我們需要將 ABREV(部門 ID)和 CODPRODUTO(產品 ID)與表 PRODUTOS 匹配。
CREATE TABLE PRODUTOS ( ABREV VARCHAR(8) NOT NULL, CODIGO VARCHAR(13) NOT NULL, DESCRICAO VARCHAR(50), PRIMARY KEY (ABREV,CODIGO)
我們只需要確定 ABREV = PRODUTOS.ABREV 和 ITST2012.CODPRODUTO = PRODUTOS.CODIGO。表格應該是這樣的:
| ABREV | NOTA | NUMEROEMIT | DATAENTRADA | DATAEMISSAO | VALCONTABIL | ITST2012.CODPRODUTO | PRODUTOS.DESCRICAO | ITST2012.ALIQISS | | dep1 | 001 | 1234567 | 01.01.2012 | 31.01.2012 | 1,000.00 | 2 | my_product | 5.00 | | dep2 | 001 | 898909201 | 02.01.2012 | 16.01.2012 | 998.00 | 3 | my_product2 | 15.00 |
最後,我們只需要將客戶 ID(第一個表中的 NUMEROEMIT)與包含我們所有客戶的表 FORNEC 連接起來(這一次,不需要檢查部門,我們使用同一張表)
CREATE TABLE FORNEC ( RAZSOC VARCHAR(55), CNPJCPF VARCHAR(18),
我們只需匹配 NUMEROEMIT = FORNEC.CNPJCPF,並獲取 RAZSOC 資訊。
報告的最終表格是這樣的:
| ABREV | NOTA | NUMEROEMIT | FORNEC.RAZSOC | DATAENTRADA | DATAEMISSAO | VALCONTABIL | ITST2012.CODPRODUTO | PRODUTOS.DESCRICAO | ITST2012.ALIQISS | | dep1 | 001 | 1234567 | my_client | 01.01.2012 | 31.01.2012 | 1,000.00 | 2 | my_product | 5.00 | | dep2 | 001 | 898909201 | my_client2 | 02.01.2012 | 16.01.2012 | 998.00 | 3 | my_product2 | 15.00 |
我的問題是:如何?我不知道如何使用 SQL 同時連接所有這些表。我可以輕鬆地 INNER JOIN 客戶端,但我不能編寫一個同時比較多個欄位的查詢,並且仍然以正確的方式加入。我非常絕望,因為我只使用我自己設計的數據庫,而不是這個通心粉數據庫,裡面有太多資訊,只有幾張桌子。
非常感謝任何可以和我一起串起來的 SQL 嚮導。
PS。數據庫是 Firebird,沒有行 ID。
問題已經回答了,非常感謝!
最終程式碼如下:
SELECT notas.ABREV, notas.NOTA, notas.NUMEROEMIT, prestador.RAZSOC, notas.DATAENTRADA, notas.DATAEMISSAO, notas.VALCONTABIL, itens.CODPRODUTO, prod.DESCRICAO, itens.ALIQISS FROM ENTR2012 notas INNER JOIN ITST2012 itens ON notas.ABREV=itens.ABREV AND notas.NOTA=itens.NOTA AND notas.VALCONTABIL=itens.VALTOTAL INNER JOIN PRODUTOS prod ON itens.ABREV=prod.ABREV AND itens.CODPRODUTO=prod.CODIGO INNER JOIN FORNEC prestador ON itens.NUMEROEMIT=prestador.NUMERO;
我真的不確定這是否會在您的這個數據庫中工作,但我在我的 Oracle XE 數據庫中使用更簡單的值和表進行了測試,它工作得很好,我會試一試。
SELECT * FROM ENTR2012 INNER JOIN ITST2012 ON ENTR2012.ABREV=ITST2012.ABREV AND ENTR2012.NOTA=ITST2012.NOTA AND ENTR2012.VALTOTAL=ITST2012.VALTOTAL INNER JOIN PRODUTOS ON ITST2012.ABREV=PRODUTOS.ABREV AND ITST2012.CODPRODUTO=PRODUTOS.CODIGO INNER JOIN FORNEC ON ITST2012.NUMEROEMIT=FORNEC.CNPJCPF;
請檢查值、列等,因為也許我在寫作過程中迷路了。