【问题标题】:Advanced SQL SELECT高级 SQL 选择
【发布时间】:2010-11-16 03:20:15
【问题描述】:

我有基本的表一和二。我们称它们为 tbl1 和 tbl2。

tbl1
---------
1 - apple |
2 - orange |
3 - banana |
4 - pineapple

tbl2
---------
1 - table |
2 - chair |
3 - sofa |

然后是 tbl3,它具有将其链接到上面两个表的外键。

表 3 表单有两个选择字段:一个查询 tbl1,另一个查询 tbl2。到目前为止,一切都很好。我在 tbl3 中合并了 tbl1 和 tbl2 中的项目。

然后我有以下情况:当用户完成tbl3时,我希望select2(对应于tbl2的数据)在用户从tbl1中选择一个项目后重新加载。干什么用的?

假设第一次完成 tbl3,用户从 tbl1 中选择了“apple”,从 tbl2 中选择了“sofa”。当用户选择“apple”时,第二个下拉列表会重新加载所有 3 项作为选项。

现在,用户第二次填写 tbl3 表单时,如果用户再次选择“apple”,他现在将只有 2 个选项。苹果和沙发之前已经摘过。现在选项只有“桌子”和“椅子”。如果他现在选择“apple”和“table”,第一项“apple”的剩余选项将是“chair”。等等……

我想不出一个 SQL 来运行这个从 tbl2 中获取元素的查询。我必须使用从 tbl1 中选择的元素并以某种方式获取剩余的项目,即那些不对应于马赫的项目。这个 SQL 查询可能吗?我相信是这样,但想不出出路。

【问题讨论】:

  • 一点都不清楚。我建议您发布您的 TSQL 尝试...

标签: sql select join


【解决方案1】:

如果链接是基于每个用户的:

SELECT t.id,
       t.value
  FROM TABLE2 t
  JOIN TABLE3 t3 ON t3.id != t.id

如果链接是基于每个用户的:

SQL 服务器:

SELECT t.id,
       t.value
  FROM TABLE2 t
  JOIN TABLE3 t3 ON t3.id != t.id AND t3.userid = @userId

甲骨文:

SELECT t.id,
       t.value
  FROM TABLE2 t
  JOIN TABLE3 t3 ON t3.id != t.id AND t3.userid = :userId

【讨论】:

  • 感谢您的解决方案。我采用了前一个用户的另一个,因为它最先到达。它工作正常。我没有测试你的,但我相信它也会起作用。我不知道你的在数据库处理方面是否会消耗更少(因为他在 SELECT 中有一个 SELECT,或者它是否相同。谢谢。
  • @Marcos:通常子选择会比 JOIN 慢。为了处理实际查询,数据库必须首先运行 subselect 以便知道要检索什么。经验法则是 JOIN 比 EXISTS 好,EXISTS 比 IN 好 - 最终,解释计划会真正告诉你。感谢您对我的评论和标记。
【解决方案2】:

我猜 table3 有列:

用户、Tbl1-ID、Tbl2-ID

我猜你想要,对于用户 X,tbl2 的值基于表 3 中未包含的 tbl1 的选择。

SELECT ID, Value
FROM tbl2
WHERE tbl2.ID NOT IN (
   SELECT Tbl2-ID
   FROM Table3
   WHERE (User = <this user>) AND (Tbl1-ID = <selected tbl1 ID>)
   )

【讨论】:

  • 嗯,太好了,我认为这正是我所需要的。仍然没有测试,但我相信它会完美运行。谢谢。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2014-09-01
  • 1970-01-01
  • 2015-03-07
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多