Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3个表上的复杂SQL语句_Sql_Mysql_Join - Fatal编程技术网

3个表上的复杂SQL语句

3个表上的复杂SQL语句,sql,mysql,join,Sql,Mysql,Join,我有3个不同的事务表,它们看起来非常相似,但略有不同。这是因为有3种不同的交易类型;根据不同的事务类型,列会发生变化,所以要在3NF中获得它们,我需要将它们放在单独的表中,对吗 例如: t1: 日期、用户、金额 t2: 日期、用户、谁、金额 t3: 日期,用户,什么,金额 现在我需要一个查询,它将为同一个用户获取每个表中的所有事务,比如 从t1、t2、t3中选择*其中user='me'; 这当然行不通 我正在研究JOIN语句,但还没有找到正确的方法来实现这一点。谢谢 编辑:实际上我需要每个表中的

我有3个不同的事务表,它们看起来非常相似,但略有不同。这是因为有3种不同的交易类型;根据不同的事务类型,列会发生变化,所以要在3NF中获得它们,我需要将它们放在单独的表中,对吗

例如: t1: 日期、用户、金额

t2: 日期、用户、谁、金额

t3: 日期,用户,什么,金额

现在我需要一个查询,它将为同一个用户获取每个表中的所有事务,比如 从t1、t2、t3中选择*其中user='me'; 这当然行不通

我正在研究JOIN语句,但还没有找到正确的方法来实现这一点。谢谢

编辑:实际上我需要每个表中的所有列,而不仅仅是相同的列

编辑2:是的,拥有事务类型当然不会破坏3NF,所以也许我的设计是完全错误的。以下是实际发生的情况——这是一种替代货币体系: -交易是在用户之间进行的,就像相互信任一样。所以单位在用户之间交换。 -发明创造是进入系统的物质物质;用户可以为此获取单位。 -消费是物质消费;用户必须为此支付单位

|--------------------------------------------------------------------------| | type | transactions | inventarizations | consumations | |--------------------------------------------------------------------------| | columns | date | date | date | | | creditor(FK user) | creditor(FK user) | | | | debitor(FK user) | | debitor(FK user) | | | service(FK service)| | | | | | asset(FK asset) | asset(FK asset) | | | amount | amount | amount | | | | | price | |--------------------------------------------------------------------------| 请注意,“金额”的单位不同;这些是条目,并根据这些金额进行计算。超出了解释原因的范围,但这些是字段。所以问题变成了可以/应该在一个表中,还是像我现在看到的那样是多个表? 我需要前面描述的SQL语句来显示运行余额

这是一个全新的问题,还是可以编辑


编辑3:由于编辑2实际上将此转化为一个新问题,我也决定发布。我希望这没问题。

< P>你应该考虑STI体系结构单表继承。即,将所有不同的列放在一个表中,并将它们全部放在一个索引下


此外,您可能希望向正在进行选择的其他列添加索引。

结果架构将是什么样子?-如果只需要所有3个表中的最小列,那么很容易,只需合并结果:

SELECT Date, User, Amount from t1 where user = 'me'
UNION
SELECT Date, User, Amount from t2 where user = 'me'
UNION
SELECT Date, User, Amount from t3 where user = 'me'

或者你可以将它们“子类化”

  Create Table Transaction
  ( 
     TransactionId Integer Primary Key Not Null,
     TransactionDateTime dateTime Not Null,
     TransactionType Integer Not Null, 
     -- Othe columns all transactions Share
  )

  Create Table Type1Transactions
  {
     TransactionId Integer PrimaryKey Not Null,
     // Type 1 specific columns
  }
  ALTER TABLE Type1Transactions  WITH CHECK ADD  CONSTRAINT 
   [FK_Type1Transaction_Transaction] FOREIGN KEY([TransactionId])
    REFERENCES [Transaction] ([TransactionId])

对其他类型的事务重复此操作

对于没有数据的列,可以在select语句中提供默认值作为常量

所以

它假定Who和What是字符串类型的列。也可以使用Null,但需要某种占位符


我认为,将您的附加信息放在一个单独的表中,并将所有事务保存在一个表中,对您来说会更好,除非我遗漏了其他一些细节。

我认为您问题的核心是:

根据不同的事务类型,列会发生变化,所以要在3NF中获得它们,我需要将它们放在单独的表中,对吗

我不是3NF专家,但我会以稍微不同的方式处理您的模式,这可能会使您的SQL变得清晰一些

看起来您的数据元素是这样的:日期、用户、金额、人员和内容。考虑到这一点,更规范化的模式可能如下所示:

User ---- id, user info (username, etc) Who --- id, who info What ---- id, what info Transaction ----------- id, date, amount, user_id, who_id, what_id
您的外键约束措辞会因数据库实现的不同而有所不同,但这更清晰、更可扩展。

简单地将不必要的列保留为null并添加TransactionType列怎么样?这将导致一个简单的SELECT语句。

考虑使用UNION ALL,而不使用ALL的UNION可能是SQL拥有的最昂贵的语句。NULL作为列占位符更安全,因为如果存在值,列输出必须是相同的数据类型。我应用了这种方法,目前为止它仍然有效。现在,我尝试创建一个事务类型为transaction_的主事务表,它引用了3个单独表中的附加信息。我对此表示怀疑,但是否可以根据事务类型设置外键,从而指向3个表中的一个,从而获得引用完整性?
select *
from (
    select user from t1
    union
    select user from t2
    union
    select user from t3
) u
left outer join t1 on u.user=t1.user
left outer join t2 on u.user=t2.user
left outer join t3 on u.user=t3.user
select *
from (
    select user from t1
    union
    select user from t2
    union
    select user from t3
) u
left outer join t1 on u.user=t1.user
left outer join t2 on u.user=t2.user
left outer join t3 on u.user=t3.user