有沒有比使用 2 個單獨的查詢更好的方法來比較同一個表上的 2 個子選擇的結果?
在下面的查詢中,我想選擇“創建者”的“客戶端”不等于我稍后傳遞的另一個用戶的“客戶端”的所有事件。
SELECT
*
FROM
incident i
WHERE
i.client_id = 150
AND ( --can this AND be shortend?
SELECT
ur1.CLIENT_ID
FROM
USER ur1
WHERE
ur1.USER = upper(i.CREATOR)
) != (
SELECT
ur2.CLIENT_ID
FROM
USER ur2
WHERE
ur2.USER = upper('other')
)
最小的可重復示例
- USER-Table 中的用戶總是大寫
- 每個用戶都是獨一無二的
- 1 個用戶只能有 1 個 Client_Id
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=99ac066a9abd339cd9a80a5b78716138
uj5u.com熱心網友回復:
如果您有以下限制:
ALTER TABLE "USER" ADD CONSTRAINT
user__id_user__pk PRIMARY KEY ("USER");
ALTER TABLE "USER" ADD CONSTRAINT
user__id_user__u UNIQUE (client_id, "USER");
ALTER TABLE incident ADD CONSTRAINT
incident__id_creator__fk FOREIGN KEY (client_id, creator)
REFERENCES "USER" (client_id, "USER");
然后你可以使用:
SELECT *
FROM incident i
WHERE i.client_id = 150
AND NOT EXISTS (
SELECT u.client_id
FROM "USER" u
WHERE u."USER" = upper('joe')
AND u.client_id = i.client_id
)
如果您沒有外鍵約束(并且只有USER表上的唯一/PK 約束),則:
SELECT *
FROM incident i
WHERE i.client_id = 150
AND EXISTS (
SELECT 1
FROM "USER" u
WHERE u."USER" IN (i.creator, upper('joe'))
HAVING COUNT(DISTINCT client_id) > 1
)
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以將 is 重寫為exist查詢;在子查詢中,您選擇兩條記錄,然后查看客戶端 ID 是否不同:
SELECT *
FROM incident i
WHERE i.client_id = 150
AND EXISTS (
SELECT 1
FROM USER
WHERE USER IN (
upper(i.CREATOR),
upper('other')
)
HAVING COUNT(DISTINCT CLIENT_ID) = 2
)
uj5u.com熱心網友回復:
也許自己加入?像這樣的東西:
SELECT i.*
FROM incident i
JOIN USER u1 ON u1.USER = i.creator
JOIN USER u2 ON u2.client_id <> u1.client_id
WHERE i.client_id = 150
AND u2.USER = 'OTHER'
uj5u.com熱心網友回復:
我認為你可以這樣做,
SELECT i.*
FROM incident i, user ur1, user ur2
WHERE i.client_id = 150
AND ur1.user = UPPER(i.creator)
AND ur2.user = UPPER(‘other’)
AND ur1.client_id != ur2.client_id
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354051.html
上一篇:如何按時間范圍內的組進行磁區?
