Sql 检查虚拟列并返回正确的数据
有此选择:Sql 检查虚拟列并返回正确的数据,sql,oracle,Sql,Oracle,有此选择: SELECT * (SELECT id, value, discount, 2 AS attr_number FROM database1 db1 JOIN database2 db2 ON db2.db1_id = db1.id WHERE value = 1 UNION SELECT id, value, discount, 1 AS attr_number FROM database1 db1 JOIN database4 d
SELECT * (SELECT id, value, discount, 2 AS attr_number FROM database1 db1
JOIN database2 db2 ON db2.db1_id = db1.id
WHERE value = 1
UNION
SELECT id, value, discount, 1 AS attr_number FROM database1 db1
JOIN database4 db4 ON db4.db1_id = db1.id
AND db4.value = 1
WHERE value = 1) WHERE id = 225
这就是我在执行select时得到的结果:
|ID |VALUE |DISCOUNT |ATTR_NUMBER |
|-------------|---------------------------------------|---------------------------------------|---------------------------------------|
|225 |1 |50 |2 |
|225 |1 |50 |2 |
|225 |1 |40 |1 |
|225 |1 |40 |1 |
|225 |1 |40 |1 |
我需要为attr\u number
列添加检查。如果select有attr\u number=1
的记录,那么输出应该是这样的(他应该只返回attr\u number=1
的记录):
如果select没有任何attr\u number=1
的记录,那么他应该返回attr\u number=2
的记录。像这样:
|ID |VALUE |DISCOUNT |ATTR_NUMBER |
|-------------|---------------------------------------|---------------------------------------|---------------------------------------|
|225 |1 |50 |2 |
|225 |1 |50 |2 |
attr\u number
值只能是1或2。我不太明白您在寻找什么,但我想我已经足够接近了:
SELECT *
(
SELECT id, value, discount, 1 AS attr_number
FROM database1 db1
JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
WHERE db4.value = 1
UNION ALL
SELECT id, value, discount, 2 AS attr_number
FROM database1 db1
JOIN database2 db2 ON db2.db1_id = db1.id
LEFT JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
WHERE db2.value = 1 and db4.value is NULL
)
WHERE id = 225
Att#1不需要任何条件,因为它具有第一优先级。对于Att#2,我添加了另一个条件来验证Att#1是否有值。希望这能有所帮助。我不太明白你在找什么,但我想我已经足够接近了:
SELECT *
(
SELECT id, value, discount, 1 AS attr_number
FROM database1 db1
JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
WHERE db4.value = 1
UNION ALL
SELECT id, value, discount, 2 AS attr_number
FROM database1 db1
JOIN database2 db2 ON db2.db1_id = db1.id
LEFT JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
WHERE db2.value = 1 and db4.value is NULL
)
WHERE id = 225
Att#1不需要任何条件,因为它具有第一优先级。对于Att#2,我添加了另一个条件来验证Att#1是否有值。希望这能有所帮助。我认为您描述的是一个
不存在的
条款:
WITH a1 as (
SELECT id, value, discount, 2 AS attr_number
FROM database1 db1 JOIN
database2 db2
ON db2.db1_id = db1.id
WHERE id = 225 AND value = 1
)
SELECT a1.*
FROM a1
UNION ALL
SELECT id, value, discount, 1 AS attr_number
FROM database1 db1 JOIN
database4 db4
ON db4.db1_id = db1.id
WHERE id = 225 AND
db4.value = 1 AND
NOT EXISTS (SELECT 1 FROM a1);
我认为您描述的是一个
不存在
子句:
WITH a1 as (
SELECT id, value, discount, 2 AS attr_number
FROM database1 db1 JOIN
database2 db2
ON db2.db1_id = db1.id
WHERE id = 225 AND value = 1
)
SELECT a1.*
FROM a1
UNION ALL
SELECT id, value, discount, 1 AS attr_number
FROM database1 db1 JOIN
database4 db4
ON db4.db1_id = db1.id
WHERE id = 225 AND
db4.value = 1 AND
NOT EXISTS (SELECT 1 FROM a1);
您的问题不清楚且相互矛盾,请提供更多详细信息和示例输出,说明您希望重新表述的内容。谢谢。您的问题不清楚且相互矛盾,请提供更多详细信息和示例输出,说明您希望重新表述的内容。谢谢,嘿!谢谢你的留言。Att将始终为1或2,因此不可能存在任何其他值。为什么要检查值是否为空?我们只需要考虑
attr_number
行。如果join语句中的db4.value为NULL,则意味着Att#1没有任何值……这只是执行上述回答中不存在的操作的另一种方法嘿!谢谢你的留言。Att将始终为1或2,因此不可能存在任何其他值。为什么要检查值是否为空?我们只需要考虑attr_number
行。如果join语句中的db4.value为NULL,则表示Att#1没有任何值……这只是执行上述答案中所示的不存在项的另一种方法