Join

在一個查詢中連接 3 個以上的表,進行多次比較且沒有 ID

  • May 4, 2015

我在工作中使用了一個過於復雜且設計不佳的軟體,現在我需要生成一份在一段時間之間開具的發票報告。

發票保存在表 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;

請檢查值、列等,因為也許我在寫作過程中迷路了。

引用自:https://dba.stackexchange.com/questions/100541