2017-02-12 91 views
2

請幫忙! 我有3個表格:在MySQL中查詢沒有結果

employee, 
assign, 
vehicle. 

只有2名員工可以佔用1輛車。我需要選擇所有未安裝車輛的員工。

查詢:

select EID, 
    Employee_name 
from employee 
where EID not in (
     select user1 
     from assign 
     ) 
    and EID not in (
     select user2 
     from assign 
     ) 

此查詢工作,如果在「用戶1」或「用戶2」中的所有細胞都充滿。 如果分配表具有用於 「用戶1」 或 「用戶2」 空值

分配數值表

enter image description here

查詢輸出是空

查詢結果

enter image description here

如果用一個值填充它,它將返回所有EID(s)和d employee_name(s) 不在用戶1和用戶2中的分配表中。如果所有用戶1和用戶2都已填滿,則它正常工作。我如何以這樣一種方式重新構建查詢,即無論assign.user1或assign.user2是否爲空,它都將顯示所有可用的員工。

+0

仍在掙扎。見http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

回答

1

您可以使用not exists

select eid, 
    employee_name 
from employee e 
where not exists (
     select 1 
     from assign a 
     where e.eid in (a.user1, a.user2) 
     ); 
+0

這是SQL嗎?我正在使用MySQL,並且這種語法與我學到的不一樣 – Noobz

+0

是的,它應該在MySQL上工作得很好。請試一試。 – GurV

+0

感謝它的工作,我不知道你可以重新命名這種方式。 – Noobz

0

您可以使用NOT NULL以及

SELECT eid, employee_name 
FROM employee 
WHERE eid not in (
    SELECT user1 
    FROM assign 
    WHERE user1 IS NOT NULL 
    UNION 
    SELECT user2 
    FROM assign 
    WHERE user2 IS NOT NULL 
) 
0

兩個答案做工精細。如果你想了解更多關於你的查詢不起作用的原因,這裏是一個簡短的解釋。

問題來自SQL如何處理NULL值。 SQL不是基於二值邏輯,而是基於三值邏輯:即TRUEFALSEUNKNOWN。 在您的查詢,只要EID在任user1user2NULL值進行比較,其結果既不是TRUE也不FALSE,但UNKNOWN

另一條出路,這些是使用功能COALESCE()IFNULL()

w3schools on coalesce(), ifnull() and others

欲瞭解更多信息在所有這些,你可以檢查Oracle文檔,其他來源中:

oracle documentation on nulls

希望它有幫助!

+0

謝謝,這很有道理 – Noobz

+0

很高興幫助! – jzeta