[英]OracleSQL: How do I add a specific AND is not null OR is not null to my query
背景故事 :
這是我此時得到的輸出。 ? 為空值。
Name DataID LastName FirstName
File10 1290 ? Jane
File10 1290 Doe ?
我能夠包含一個或另一個語句,但不能同時添加兩個。 我沒有得到任何錯誤,而只是獲得了令人難以置信的長運行時間,沒有可預見的結果(請注意,我正在使用允許您在界面內輸入oracle查詢以查詢數據庫的軟件)。 如果我一直運行查詢直到**(請參見代碼),它就會起作用,但是一旦我添加OR條件,它就不再起作用。 我認為這是因為我有多個WHERE條件。 在所有情況下,我都希望應用目錄ID和一般stringval條件,但是我想擁有第三個條件,即姓氏不為null或名字不為null。 我不確定是否缺少明顯的東西-請幫忙嗎?
這是我當前的查詢:
SELECT directory.name, directory.dataid,
(SELECT max(stringval) FROM attribute2table WHERE attribute1table.attrid = 2) as LastName,
(SELECT max(stringval) FROM attribute2table WHERE attribute1table.attrid = 3) as FirstName
FROM attribute2table
JOIN directory ON directory.dataid = attribute2table.id
JOIN attribute1table ON attribute1table.id = directory.dataid
WHERE directory.dataid = 1290
AND stringval IS NOT NULL
AND (SELECT max(valstr) FROM attribute1table WHERE attribute1table.attrid = 2) IS NOT NULL
**OR (SELECT max(valstr) FROM attribute1table WHERE attribute1table.attrid = 3) IS NOT NULL**
基本上,我只需要擺脫null值,並希望我的表看起來像...。
Name DataID LastName FirstName
File10 1290 Doe Jane
這似乎是一個括號問題。 如果我理解此問題,則需要將兩個IS NOT NULL條件放在括號中:
SELECT directory.name,
directory.dataid,
m2.LastName,
m3.FirstName
FROM attribute2table
INNER JOIN directory
ON directory.dataid = attribute2table.id
INNER JOIN attribute1table
ON attribute1table.id = directory.dataid
LEFT OUTER JOIN (SELECT max(valstr) AS LASTNAME
FROM attribute1table
WHERE attribute1table.attrid = 2) m2
ON 1 = 1
LEFT OUTER JOIN (SELECT max(valstr) AS FIRSTNAME
FROM attribute1table
WHERE attribute1table.attrid = 3) m3
ON 1 = 1
WHERE directory.dataid = 1290 AND
stringval IS NOT NULL AND
(m2.LASTNAME IS NOT NULL OR
m3.FIRSTNAME IS NOT NULL)
我還使用聯接而不是子選擇重寫了查詢,因為我認為這更清楚了。
還要注意,在M2
和M3
聯接中,我使用條件為1 = 1
LEFT OUTER
而不是CROSS JOIN
,因為我注意到,如果交叉INNER JOIN
的查詢不返回任何行,則CROSS JOIN
作用類似於INNER JOIN
也就是說,它導致整個SELECT不返回任何數據。 dbfiddle在這里演示這種情況
我很確定您只需要條件聚合:
SELECT d.name, d.dataid,
MAX(CASE WHEN a1.attrid = 2 THEN a2.stringval END) as LastName,
MAX(CASE WHEN a1.attrid = 3 THEN a2.stringval END) as FirstName
FROM directory d JOIN
attribute2table a2
ON a2.id = d.dataid JOIN
attribute1table a1
ON a1.id = d.dataid
WHERE d.dataid = 1290
GROUP BY d.name, d.dataid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.