SQL Oracle约束值在多列之间是唯一的

Nob*_*chi 7 sql oracle tuples unique-constraint multiple-columns

假设我在表中有3列--A,B和C.我想确保如果我在列A中插入一些值(比如说x),我就不能插入一个B或C等于x的元组,即,对于所有元组,值x应对于列A保持唯一.

注意,对于其他元组,可以在A中重复x.

我知道SQL中的UNIQUE子句,但这只是为了确保一个值只在特定列中出现一次.由于Oracle中的CHECK语句不允许子查询,我无法弄清楚如何实现它.

编辑(添加更多信息)

主键是Employee_Number,而有问题的3列是LandlineNo,MobileNo和VOIP.因此,假设这是一个条目:

Employee_Number = 1, LandlineNo = x, MobileNo = y, VOIP = z
Run Code Online (Sandbox Code Playgroud)

然后不允许这个另一个元组的条目 -

Employee_Number = 2, LandlineNo = a, MobileNo = x, VOIP = c
Run Code Online (Sandbox Code Playgroud)

另一方面,这个很好(是的,2名员工可以拥有相同类型的相同数量)

Employee_Number = 2, LandlineNo = x, MobileNo = b, VOIP = c
Run Code Online (Sandbox Code Playgroud)

Seb*_*bas 2

CREATE MATERIALIZED VIEW mv_my
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS
SELECT DISTINCT
    CASE 
        WHEN t2.Employee_Number IS NOT NULL THEN 1
        WHEN t3.Employee_Number IS NOT NULL THEN 1
        WHEN t4.Employee_Number IS NOT NULL THEN 1
        ELSE 0
    END AS wrong
FROM table t1
    LEFT JOIN table t2 ON t2.MobileNo = t1.LandlineNo AND t2.Employee_Number != t1.Employee_Number
    LEFT JOIN table t3 ON t3.VOIP = t1.LandlineNo AND t3.Employee_Number != t1.Employee_Number
    LEFT JOIN table t4 ON t4.VOIP = t1.MobileNo AND t4.Employee_Number != t1.Employee_Number
/

ALTER TABLE mv_my ADD CHECK(wrong = 0)
/
Run Code Online (Sandbox Code Playgroud)

它可能工作也可能不工作,具体取决于您的 Oracle 版本 ( doc )