2015-01-12 39 views
0

我有一個藥物表持有ID和名稱。在一個頁面中,我需要創建一個下拉與所有藥物的名稱 - 雖然我不能簡單地做:選擇在另一個存在過濾表的所有行

SELECT id, name FROM drug; 

在這種情況下,我想這PZN碼在pharmacy_has_drug表只存在藥物。爲此,我需要以某種方式「經歷」drug_product表。

結構:

enter image description here

  • drug_product.drug_id持有參考drug.id
  • pharmacy_has_drug.drug_PZN持有參考做drug_product.PZN

在這種情況下,我如何獲得過濾藥物?

+0

SELECT ... WHERE EXISTS(select * from pharmacy_has_drug.drug_PZN = drug_product.PZN) – jarlh

回答

1

你可以這樣做:

SELECT d.id, d.name 
FROM drug d 
INNER JOIN drug_product p ON d.id=p.drug_id 
WHERE p.drug= 62732 

或者,如果您需要在pharmacy_has_drug表的條件:

SELECT d.id, d.name 
FROM drug d 
INNER JOIN drug_product p ON d.id=p.drug_id 
INNER JOIN pharmacy_has_drug ph ON ph.drug_PZN=d.PZN 
WHERE ph.pharmacy_id= 12 

編輯: 只需刪除where子句,如果沒有必要的。 內連接就足夠你的情況。

SELECT d.id, d.name 
FROM drug d 
INNER JOIN drug_product p ON d.id=p.drug_id 
INNER JOIN pharmacy_has_drug ph ON ph.drug_PZN=d.PZN 
+0

使用此方法(使用具有特定值的WHERE),如果我有300種藥物,則需要執行此查詢300次。效率不高。我想知道這是否可以在一個查詢中完成:選擇每種藥物,但只有在** pharmacy_has_drug **中引用。 – lesssugar

1

如果你想知道一個記錄是否存在使用EXISTS:

SELECT id, name 
FROM drug 
WHERE EXISTS 
(
    select * 
    from drug_product dp 
    join pharmacy_has_drug phd on phd.drug_pzn = dp.pzn 
    where dp.drug_id = drug.id 
); 

或IN子句:

SELECT id, name 
FROM drug 
WHERE id IN 
(
    select dp.drug_id 
    from drug_product dp 
    join pharmacy_has_drug phd on phd.drug_pzn = dp.pzn 
); 

你甚至可以拆分單一的步驟:1。給我所有PZN在pharmacy_has_drug。 2.給我所有來自drug_product的匹配藥物ID。 3.選擇匹配的藥物。

select id, name from drug 
where id in 
(
    select drug_id from drug_product 
    where pzn in 
    (
    select drug_pzn from pharmacy_has_drug 
) 
); 
1

使用此查詢:

SELECT DISTINCT d.id, d.name 
FROM drug d 
    INNER JOIN drug_product p ON p.drug_id = d.id 
    INNER JOIN pharmacy_has_drug ph ON ph.drug_PZN = p.PZN 

據分析,從表drugs所有行。對於每一個檢查表drug_product的匹配行。如果沒有找到這樣的行,則表drugs中的行將被忽略(因爲INNER JOIN)。如果找到一個或多個匹配行,那麼對於每個匹配行,它將檢查表pharmacy_has_drug中與drug_product匹配的行。 PZN。同樣,如果找不到匹配的行,則已經計算出的部分結果將被丟棄,並從drugs前進到下一行。
如果在pharmacy_has_drug中找到匹配的行,那麼一個或多個行將被附加到結果集;當在許多藥店可以找到藥品時,則會爲每個組合計算一行,但由於條款中只有來自表drugs的列,因此最終結果集將包含重複項。

SELECT子句中的DISTINCT關鍵字刪除重複項並使查詢運行得更快(因爲DISTINCT優化使引擎停止在第一次匹配後搜索其他行)。

相關問題