我正在嘗試優化一個函式(MySQL),但JOIN仍然沒有完全理解(我嘗試做一個簡單的例子):
我有 2 張桌子:
餐桌用品
ID | ID_ORDER | ID_BOX | NAME
001 | 2564 | 123 | SPOON_1
002 | 2564 | 123 | SPOON_2
006 | 2564 | 123 | SHOES_2
007 | 2564 | 123 | SHOES_1
003 | 2565 | 124 | SPOON_1
004 | 2565 | 124 | SPOON_2
008 | 2565 | 124 | SHOES_1
009 | 2565 | 124 | SHOES_2
005 | 2565 | 125 | SPOON_1
010 | 2565 | 125 | SHOES_1
物件的描述通過 ID_CONTRACT 和 NAME 鏈接到 ITEM 表。(在同一個合同中不可能有 2 個同名的專案)。
表描述:
ID_ORDER | NAME_ITEM | LENGTH | WIDTH | ....
2564 | SPOON_1 | 200 | 20 ...
2564 | SPOON_2 | 300 | 20 ...
2564 | SHOES_1 | 500 | 20 ...
2564 | SHOES_2 | 600 | 20 ...
現在,我需要知道合同中的所有專案及其描述,我使用以下查詢:
SELECT *,description.* FROM items INNER JOIN description
ON (description.ID_CONTRACT=items.ID_CONTRACT AND description.NAME_ITEM=items.NAME)
WHERE ID_CONTRACT= 2564
首先,我只是讀到它不是正確的查詢(我需要在查詢中手動復制所有描述欄位?),因為ID_CONTRACT在兩個表中,有時它給我錯誤(有時不是),我在那里讀到它不是可以忽略重復項。然后我想知道,當我在 ITEMS 表上進行選擇時,MySQL 是否在描述表中查找每一行的對應關系?有沒有辦法優化查詢(另一種JOIN),所以當他在ITEMS中遇到2個(或更多)具有相同ID_CONTRACT/NAME的元素時,它不會每次都在ITEMS表中搜索?
uj5u.com熱心網友回復:
select *意味著從所有表中選擇所有列,在您的情況下,這就像選擇專案。,描述。所以使用語法 SELECT , description 。 似乎您正在嘗試為表描述選擇兩次列
由于您ID_CONTRACT在兩個表中具有相同的列名,這會在連接程序中對資料庫引擎的 comumn 名稱產生歧義。為避免這種情況,您只需要在連接列名稱中使用完整的參考名稱,例如:
table1.col1 = table2.col1
這樣資料庫引擎就知道每個表必須使用哪一列進行連接
SELECT items.*, description.*
FROM items
INNER JOIN description ON description.ID_CONTRACT=items.ID_CONTRACT
AND description.NAME_ITEM=items.NAME
WHERE ID_CONTRACT= 2564
對于你問題的第二部分
MySQL is looking for each line a correspondance in DESCRIPTION table?
是的。
關系資料庫處理資料集并檢索表之間的所有對應關系
如果確實重復了行,您可以使用檢索不同的結果
select DISTICNT col1, col2..
通常,從正確規范化資料集的連接中選擇 * 不會產生重復的行(至少您在一列中的值在行之間有所不同)
但是如果某些列結果對您不重要并且可以從結果中省略,這種情況會產生重復行的結果,您可以僅使用您真正需要的列名執行選擇性選擇并應用 disctint 子句
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/384753.html
下一篇:使用兩個連接和兩個表進行查詢
