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没有任何值……这只是执行上述答案中所示的不存在项的另一种方法